###前提・実現したいこと
C#でOracleを使用していたプログラムをDB2でも使用できるようにしようとしています。
修正範囲を出来るだけ少なくするために、SQLの変更は出来るだけ行わずにしたいと思っています。
エラーの回避方法が分かればいいのですが、エラーの発生条件や、プログラム側での効率的な対処方法など何か分かることがありましたら、アドバイスをお願いします。
###発生している問題・エラーメッセージ
DB2からホスト変数を使用した同じ内容のSQLを連続で使用した時に以下のエラーが発生します。
0ERROR [42818] [IBM][DB2/NT64] SQL0401N 演算 "=" のオペランドのデータ・タイプが非互換または比較不能です。
###該当のソースコード
C#
1using IBM.Data.DB2; 2 3namespace DB2Sample 4{ 5 public partial class Form1 : Form 6 { 7 DB2Connection _conn = null; 8 9 public Form1() 10 { 11 InitializeComponent(); 12 } 13 14 // 接続 15 private void button1_Click(object sender, EventArgs e) 16 { 17 try 18 { 19 /// 接続 20 string[] connParam = new string[5]; 21 //[0] alias 22 //[1] server 23 //[2] portN 24 //[3] userId 25 //[4] pass 26 connParam[0] = "mydb2"; 27 connParam[1] = "localhost"; 28 connParam[2] = "50000"; 29 connParam[3] = "hogehoge"; 30 connParam[4] = "********"; 31 32 _conn = ConnectDb(connParam); 33 } 34 catch (Exception ex) 35 { 36 MessageBox.Show(ex.Message); 37 } 38 } 39 40 // 切断 41 private void button2_Click(object sender, EventArgs e) 42 { 43 try 44 { 45 _conn.Close(); 46 _conn.Dispose(); 47 } 48 catch (Exception ex) 49 { 50 MessageBox.Show(ex.Message); 51 } 52 } 53 54 // 実行 55 private void button3_Click(object sender, EventArgs e) 56 { 57 try 58 { 59 DB2Command cmd = null; 60 61 DB2DataAdapter adp = new DB2DataAdapter(); 62 cmd = _conn.CreateCommand(); 63 cmd.CommandText = " SELECT * " 64 + " FROM TABLE " 65 + " WHERE KEY = :KEY "; 66 //+ " WHERE KEY = CAST(:KEY AS VARCHAR(100))"; 67 68 adp.SelectCommand = new DB2Command(cmd.CommandText, _conn); 69 70 DB2Parameter param = new DB2Parameter(); 71 param.ParameterName = "KEY"; 72 param.Value = "KEY001"; 73 param.Direction = ParameterDirection.Input; 74 param.DB2Type = DB2Type.VarChar; 75 param.DbType = DbType.String; 76 param.Precision = 255; 77 param.Size = 255; 78 79 adp.SelectCommand.Parameters.Add(param); 80 81 DataTable table = new DataTable(); 82 adp.Fill(table); 83 84 cmd.Dispose(); 85 adp.Dispose(); 86 87 } 88 catch (Exception ex) 89 { 90 MessageBox.Show(ex.Message); 91 } 92 } 93 94--- 以下IBMのサンプルコード 95 // Helper method: This method establishes a connection to a database 96 public static DB2Connection ConnectDb(String[] argv) 97 { 98 String server = ""; 99 String alias = ""; 100 String userId = ""; 101 String password = ""; 102 Int32 portNumber = -1; 103 String connectString; 104 105 if (argv.Length > 5 || 106 (argv.Length == 1 && 107 (String.Compare(argv[0], "?") == 0 || 108 String.Compare(argv[0], "-?") == 0 || 109 String.Compare(argv[0], "/?") == 0 || 110 String.Compare(argv[0], "-h", true) == 0 || 111 String.Compare(argv[0], "/h", true) == 0 || 112 String.Compare(argv[0], "-help", true) == 0 || 113 String.Compare(argv[0], "/help", true) == 0))) 114 { 115 throw new Exception( 116 "Usage: prog_name [dbAlias] [userId passwd] \n" + 117 " prog_name [dbAlias] server portNum userId passwd"); 118 } 119 switch (argv.Length) 120 { 121 case 0: // Use all defaults 122 alias = "sample"; 123 userId = ""; 124 password = ""; 125 break; 126 case 1: // dbAlias specified 127 alias = argv[0]; 128 userId = ""; 129 password = ""; 130 break; 131 case 2: // userId & passwd specified 132 alias = "sample"; 133 userId = argv[0]; 134 password = argv[1]; 135 break; 136 case 3: // dbAlias, userId & passwd specified 137 alias = argv[0]; 138 userId = argv[1]; 139 password = argv[2]; 140 break; 141 case 4: // use default dbAlias 142 alias = "sample"; 143 server = argv[0]; 144 portNumber = Convert.ToInt32(argv[1]); 145 userId = argv[2]; 146 password = argv[3]; 147 break; 148 case 5: // everything specified 149 alias = argv[0]; 150 server = argv[1]; 151 portNumber = Convert.ToInt32(argv[2]); 152 userId = argv[3]; 153 password = argv[4]; 154 break; 155 } 156 157 if (portNumber == -1) 158 { 159 connectString = "Database=" + alias; 160 } 161 else 162 { 163 connectString = "Server=" + server + ":" + portNumber + 164 ";Database=" + alias; 165 } 166 167 if (userId != "") 168 { 169 connectString += ";UID=" + userId + ";PWD=" + password; 170 } 171 connectString += ";HostVarParameters=True;"; 172 173 DB2Connection conn = new DB2Connection(connectString); 174 conn.Open(); 175 Console.WriteLine(" Connected to the " + alias + " database"); 176 return conn; 177 178 } // ConnectDb 179 180 } 181} 182
###試したこと
接続し連続でSQLを発行した場合に発生しました。
接続→実行→切断→接続→実行としてもエラーが発生しました。
コメントしてありますがCAST( )を使用すれば、問題のエラーは発生しなくなります。
ただ、その場合全てのSQL文を修正する必要があるため避けたいです。
###補足情報(言語/FW/ツール等のバージョンなど)
DB2 express-c v11.1.0.1527 64bit
C#
Windows server 2012R2
DB2をOracle互換モードで設定しています
DB2_DEFERRED_PREPARE_SEMANTICS=YES
DB2_COMPATIBILITY_VECTOR=ORA
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。