C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: c# 2つのDBへのアクセス


(過去ログ 103 を表示中)

[トピック内 16 記事 (1 - 16 表示)]  << 0 >>

■61289 / inTopicNo.1)  c# 2つのDBへのアクセス
  
□投稿者/ tori (1回)-(2011/08/08(Mon) 16:19:22)

分類:[C#] 

C#にて oracleとUDBへアクセスするプログラムを開発しており
DBアクセスdll側では 
OleDbDataReaderに値がはいっているのですが
呼び出し側では 値がnullになっております。
2つのDBアクセスを同じクラスで対応する場合の 注意点などあれば ご教授ください。


■呼び出し側
Db_common clsDa_db2 = new Db_common("db2");
Db_common clsDa_ora = new Db_common("ora");
clsDa_ora.connect();
clsDa_db2.connect_db2();
System.Data.OleDb.OleDbDataReader dr_db2 = clsDa_db2.executeReader(STRsql.ToString(), "db2");


■DBアクセスdll
public class Db_common
{
public OleDbDataReader executeReader(string StrCmd,string db)
{

try
{
//コマンドプロパティセット
if (db == "db2")
{
commanddb2.Connection = conndb2;
commanddb2.CommandText = StrCmd;
readerdb2 = commanddb2.ExecuteReader();
return readerdb2;

}
else
{
commandora.Connection = connora;
commandora.CommandText = StrCmd;
readerora = commandora.ExecuteReader();
return readerora;

}

}
catch (Exception e)
{
throw(e);
}


}
public OleDbDataReader executeReader(string StrCmd,string db)
{

try
{
//コマンドプロパティセット
if (db == "db2")
{
commanddb2.Connection = conndb2;
commanddb2.CommandText = StrCmd;
readerdb2 = commanddb2.ExecuteReader();
return readerdb2;

}
else
{
commandora.Connection = connora;
commandora.CommandText = StrCmd;
readerora = commandora.ExecuteReader();
return readerora;

}

}
catch (Exception e)
{
throw(e);
}


}

}
としております。


引用返信 編集キー/
■61291 / inTopicNo.2)  Re[1]: c# 2つのDBへのアクセス
□投稿者/ 逆運の覇者 (47回)-(2011/08/08(Mon) 17:17:37)
非常に見づらいので整形
投稿時に図表モードを選ぶだけで元の形を保てますよ


public class Db_common
{
	public OleDbDataReader executeReader(string StrCmd,string db)
	{
		try
		{
			//コマンドプロパティセット
			if (db == "db2")
			{
				commanddb2.Connection = conndb2;
				commanddb2.CommandText = StrCmd;
				readerdb2 = commanddb2.ExecuteReader();
				return readerdb2;
			}
			else
			{
				commandora.Connection = connora;
				commandora.CommandText = StrCmd;
				readerora = commandora.ExecuteReader();
				return readerora;
			}
		}
		catch (Exception e)
		{
			throw(e);
		}
	}


	public OleDbDataReader executeReader(string StrCmd,string db)
	{
		try
		{
			//コマンドプロパティセット
			if (db == "db2")
			{
				commanddb2.Connection = conndb2;
				commanddb2.CommandText = StrCmd;
				readerdb2 = commanddb2.ExecuteReader();
				return readerdb2;
			}
			else
			{
				commandora.Connection = connora;
				commandora.CommandText = StrCmd;
				readerora = commandora.ExecuteReader();
				return readerora;
			}
		}
		catch (Exception e)
		{
			throw(e);
		}
	}
}

引用返信 編集キー/
■61295 / inTopicNo.3)  Re[2]: c# 2つのDBへのアクセス
□投稿者/ 逆運の覇者 (48回)-(2011/08/08(Mon) 17:37:16)
よく見るとまったく同じメソッドがふた…つ?
returnの使い方もうまくないですね。
引用返信 編集キー/
■61296 / inTopicNo.4)  Re[3]: c# 2つのDBへのアクセス
□投稿者/ tori (3回)-(2011/08/08(Mon) 18:09:53)
No61295 (逆運の覇者 さん) に返信
> よく見るとまったく同じメソッドがふた…つ?
1つのコネクションで1つのDATAreaderしか生成できないとのことで
そっくりおなじものをつくったのですが。。。。

引用返信 編集キー/
■61299 / inTopicNo.5)  Re[4]: c# 2つのDBへのアクセス
□投稿者/ ぴよ (1回)-(2011/08/08(Mon) 18:58:59)
> 1つのコネクションで1つのDATAreaderしか生成できないとのことで

そんな事、どこに書いてありました?
そもそも、OracleとDB2は別コネクションでしょ?
「OleDbDataReaderに値がはいっているのですが」との事ですが、
ステップ動作できちんとreturnされているかを確認しましたか?
引用返信 編集キー/
■61300 / inTopicNo.6)  Re[5]: c# 2つのDBへのアクセス
□投稿者/ tori (5回)-(2011/08/08(Mon) 19:25:59)
No61299 (ぴよ さん) に返信
>>1つのコネクションで1つのDATAreaderしか生成できないとのことで
>
> そんな事、どこに書いてありました?
下のURLを参考にしましたが 私の勘違いなのでしょうか?
http://blog.livedoor.jp/akf0/archives/51480218.html

> そもそも、OracleとDB2は別コネクションでしょ?
はい。
別コネクションを認識しやすいように 関数名を2つにしました。
> 「OleDbDataReaderに値がはいっているのですが」との事ですが、
> ステップ動作できちんとreturnされているかを確認しましたか?
ステップで確認し return時は取得できてます。




引用返信 編集キー/
■61303 / inTopicNo.7)  Re[6]: c# 2つのDBへのアクセス
□投稿者/ 逆運の覇者 (49回)-(2011/08/08(Mon) 21:24:05)
まったく同じ処理をするメソッドを2つに分ける意味はありません。
それに同じクラスに同じメソッド名で引数も同じだとメソッドの衝突(重複)が起きますね。
オーバーロードできません。
あと、変数宣言が見当たらず突然出てくるconndb2、connoraはどこからくるのか。
という疑問もあります。


ソースコードを見た私の感想としてはわけがわからない、です。
引用返信 編集キー/
■61307 / inTopicNo.8)  Re[6]: c# 2つのDBへのアクセス
□投稿者/ ぴよ (2回)-(2011/08/08(Mon) 22:08:33)
No61300 (tori さん) に返信
> ■No61299 (ぴよ さん) に返信
> >>1つのコネクションで1つのDATAreaderしか生成できないとのことで

>
>>そもそも、OracleとDB2は別コネクションでしょ?
> はい。

1つのコネクションと言いながら、別コネクションだと言っていることに矛盾を感じないかい?
インスタンスって、理解している?

あと、C#って同名で引数の型が同じメソッドを2つも作成できるの?
(VBだと怒られるけど。C#知らないけれど、コンパイル通るの?)
じゃあ、

> System.Data.OleDb.OleDbDataReader dr_db2 = clsDa_db2.executeReader(STRsql.ToString(), "db2");

って、どっちのメソッドで処理されるの?
引用返信 編集キー/
■61308 / inTopicNo.9)  Re[6]: c# 2つのDBへのアクセス
□投稿者/ ぴよ (3回)-(2011/08/08(Mon) 22:12:36)
No61300 (tori さん) に返信
>>「OleDbDataReaderに値がはいっているのですが」との事ですが、
>>ステップ動作できちんとreturnされているかを確認しましたか?
> ステップで確認し return時は取得できてます。

ところで、dll化されているクラスの中身は、どのようにしてステップ動作の確認を行いましたか?
引用返信 編集キー/
■61314 / inTopicNo.10)  Re[7]: c# 2つのDBへのアクセス
□投稿者/ tori (6回)-(2011/08/09(Tue) 08:44:24)
No61303 (逆運の覇者 さん) に返信
> まったく同じ処理をするメソッドを2つに分ける意味はありません。
> それに同じクラスに同じメソッド名で引数も同じだとメソッドの衝突(重複)が起きますね。
> オーバーロードできません。
> あと、変数宣言が見当たらず突然出てくるconndb2、connoraはどこからくるのか。
> という疑問もあります。
> 
> 
> ソースコードを見た私の感想としてはわけがわからない、です。

すみません。DLL側のソースの貼り付けを間違ってました。
    public class Db_common
    {
      public Boolean connect()
        {
          
            connectionString = ConfigurationSettings.AppSettings["conStringOLEORACLE"];

                    // 接続されていない場合
            if( connectedora == false )
            {
            // コネクションのインスタンス化

              connora = new OleDbConnection(connectionString);
            // コネクションオープン
              connora.Open();
            // 接続済み
             connectedora = true;
            // コマンドのインスタンス化
            commandora = new OleDbCommand();
           // コマンドにコネクションを設定
             commandora.Connection = connora;
            // データリーダの初期化
                 //OleDbDataReader reader;
                return connectedora;

           }
            else 
            {
                return connectedora;
            
            }

        }

        public Boolean connect_db2()
        {

            connectionString = ConfigurationSettings.AppSettings["conStringOLEDB2"];

            // 接続されていない場合
            if (connecteddb2 == false)
            {
                // コネクションのインスタンス化

                conndb2 = new OleDbConnection(connectionString);
                // コネクションオープン
                conndb2.Open();
                // 接続済み
                connecteddb2 = true;
                // コマンドのインスタンス化
                commanddb2 = new OleDbCommand();
                // コマンドにコネクションを設定
                commanddb2.Connection = conndb2;
                // データリーダの初期化
                //OleDbDataReader reader;
                return connecteddb2;

            }
            else
            {
                return connecteddb2;

            }

        }
       public string[] executeReader(string StrCmd,string db)
    {
     int i = 0;      string[] r_db =null;
        try
        {
            //コマンドプロパティセット
            if (db == "db2")
            {
                commanddb2.Connection = conndb2;
                commanddb2.CommandText = StrCmd;
                readerdb2 = commanddb2.ExecuteReader();
            while (readerdb2.Read() == true)
                {
                  i= i + 1;
             
                     r_db[i]= readerdb2[1].ToString().TrimEnd();
            }
            return r_db;
            //return readerdb2;

            }
            //else
            //{
            //    commandora.Connection = connora;
            //    commandora.CommandText = StrCmd;
            //    readerora = commandora.ExecuteReader();
            //    return readerora;

            //}
            return r_db;

        }
        catch (Exception e)
        {     
            throw(e);
        }


    }
}

引用返信 編集キー/
■61315 / inTopicNo.11)  Re[8]: c# 2つのDBへのアクセス
□投稿者/ シーザー (2回)-(2011/08/09(Tue) 09:07:14)
で、何を質問したいのですか?
また、OleDbDataReaderを返すメソッドはどれですか?

もう一度質問を整理してください。
引用返信 編集キー/
■61317 / inTopicNo.12)  Re[9]: c# 2つのDBへのアクセス
□投稿者/ tori (7回)-(2011/08/09(Tue) 09:34:14)
No61315 (シーザー さん) に返信
> で、何を質問したいのですか?
> また、OleDbDataReaderを返すメソッドはどれですか?
>
> もう一度質問を整理してください。

db2とオラクルへのアクセスするdllを作成しており
そのdllから 以下の 「clsDa_db2.executeReader(STRsql.ToString(), "db2");
」にて 結果を取得していますが
dll側ではreturn時に値が入ってますが 受け取った時点では「行および列にデータが存在しません」となります。
これは dllのつくり( 2つのデータベースにアクセスするdllの構造自体)に無理があるのでしょうか?

■呼び出し側
Db_common clsDa_db2 = new Db_common("db2");
Db_common clsDa_ora = new Db_common("ora");
clsDa_ora.connect();
clsDa_db2.connect_db2();
System.Data.OleDb.OleDbDataReader dr_db2 = clsDa_db2.executeReader(STRsql.ToString(), "db2");

引用返信 編集キー/
■61318 / inTopicNo.13)  Re[10]: c# 2つのDBへのアクセス
□投稿者/ tori (8回)-(2011/08/09(Tue) 09:40:58)
No61317 (tori さん) に返信
> ■No61315 (シーザー さん) に返信
> System.Data.OleDb.OleDbDataReader dr_db2 = clsDa_db2.executeReader(STRsql.ToString(), "db2");
としており、dllが string[]となってますが これはデバック中でして。
本来はstring[]でははくOleDbDataReaderでreturnしております。

引用返信 編集キー/
■61336 / inTopicNo.14)  Re[11]: c# 2つのDBへのアクセス
□投稿者/ シーザー (3回)-(2011/08/09(Tue) 15:55:54)
本当に解決したいと思っていますか?
本当に回答が欲しいと思っていますか?
デバッグ中のdllのコードは回答者側に必要な情報ですか?
別の方も指摘していますが、定義が記載されていない変数についての説明は回答者側には不要ですか?
本当にこのdllは動いているのですか?
呼び出し側で
> Db_common clsDa_db2 = new Db_common("db2");
としているのに、なぜDb_commonのコンストラクタを記載しないのですか?

> dll側ではreturn時に値が入ってますが 受け取った時点では「行および列にデータが存在しません」となります。

「行および列にデータが存在しません」とは、何のメッセージですか?
例外のメッセージ?あなたが作成したメッセージ?

> これは dllのつくり( 2つのデータベースにアクセスするdllの構造自体)に無理があるのでしょうか?

無理があるかどうかを答える以前の問題です。
引用返信 編集キー/
■61344 / inTopicNo.15)  Re[7]: c# 2つのDBへのアクセス
□投稿者/ kent (12回)-(2011/08/09(Tue) 19:23:32)
まず、クラスとインスタンスの勉強をするのがいいかと思います。
ワンステップごと、クリアしていきましょう。
引用返信 編集キー/
■61353 / inTopicNo.16)  Re[8]: c# 2つのDBへのアクセス
□投稿者/ shu (931回)-(2011/08/10(Wed) 08:14:31)
ちょっと作ってみた。動作テストはしてないし、まだ抜けはあると思います。

class Db_common:IDisposable
{
	private DbConnection _con = null;
	private DbDataReader _rd = null;

	public Db_common(string db)
	{
		string connectionString = string.Empty;

		switch (db)
		{
			case "ora":
				connectionString = ConfigurationManager.AppSettings["conStringOLEORACLE"];
				break;
			case "db2":
				connectionString = ConfigurationManager.AppSettings["conStringOLEDB2"];
				break;
		}

		if (connectionString.Length > 0)
		{
			_con = new OleDbConnection(connectionString);
		}
	}

	public DbDataReader executeReader(string CmdText)
	{
		if ((_rd != null) && (!_rd.IsClosed))
		{
			_rd.Close();
		}

		if (_con != null) {
			if (_con.State != ConnectionState.Broken)
			{
				_con.Close();
			}
			if (_con.State != ConnectionState.Open)
			{
				_con.Open();
			}
		}
		else 
		{
			_rd = null;
			return null;
		}

		DbCommand cmdrd = new OleDbCommand();
		cmdrd.Connection = _con;
		cmdrd.CommandText = CmdText;
		_rd = cmdrd.ExecuteReader();
		return _rd;
	}

	public void Dispose()
	{
		if ((_con != null) && (_con.State==ConnectionState.Open))
		{
			if ((_rd != null) && (!_rd.IsClosed))
			{
				_rd.Close();
			}
			_con.Close();
		}
	}
}

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -