ODBC対応開発ツールでの開発時に発生したトラブルの事例、およびその対処方法について説明します。
RDOでODBC3.51ドライバマネージャを利用すると“ドライバの SQLSetConnetAttr は失敗しました。”というエラーが出力される
[Microsoft][ODBC Driver Manager]ドライバの SQLSetConnetAttr は失敗しました。
SQLSTATE:IM006
本エラーは、ODBC3.51ドライバマネージャから出力されるメッセージで、動作上問題ありません。
なお、本エラーが出力されて接続できない場合は、原因となるエラーがエラー配列の2つ目以降に出力されるので、すべてのエラー内容を取得して確認してください。
また、ADO、ADO.NETではエラー配列の2つ目以降に“ドライバの SQLSetConnetAttr は失敗しました。”のエラーが入りますが、同様に動作上の問題はありません。
RDOですべてのエラーを取得する手順は以下のとおりです。
~ 省略 ~ On Error GoTo ErrorProc ~ 省略 ~ ErrorProc: 'Error時の処理を記述 For i = 0 To rdoEngine.rdoErrors.Count - 1 If rdoEngine.rdoErrors.Count > 0 Then msg = rdoEngine.rdoErrors(i).Description Else msg = Err.Description End If MsgBox msg, vbOKOnly, "Error" Next
ADO連携時にDECIMAL型およびNUMERIC型のParameterオブジェクトを使用すると、メッセージ JYP9612E が出力される
JYP9612E ディスクリプタ情報が一致しません.
ADO連携する場合、DECIMAL型およびNUMERIC型のParameterオブジェクトには、精度と位取りの設定が必要です。
精度は、ParameterオブジェクトのPrecisionプロパティで設定します。
位取りは、ParameterオブジェクトのNumericScaleプロパティで設定します。
以下にNUMERIC型を更新する例を示します。
Dim adoCon As New ADODB.Connection Dim adoCom As ADODB.Command Dim adoPar As ADODB.Parameter adoCon.ConnectionString = "DSN=DSN01;UID=USER01;PWD=PASS01" adoCon.Open adoCon.BeginTrans Set adoCom = New ADODB.Command adoCom.ActiveConnection = adoCon adoCom.CommandText = "UPDATE RT_TBL SET C_NUM=? WHERE C_KEY=1" adoCom.CommandType = adCmdText 'Parameterオブジェクトの設定 Set adoPar = adoCom.CreateParameter("", adNumeric, , , 333.33) adoPar.Precision = 5 '●精度の設定 adoPar.NumericScale = 2 '●位取りの設定 adoCom.Parameters.Append adoPar adoCom.Execute adoCon.CommitTrans adoCon.Close Set adoCom = Nothing Set adoCon = Nothing
カーソルを使用してデータを読み込んだ状態で更新処理などを行うと、メッセージ JYP2013E が出力される
ODBC連携において、トランザクション制御(トランザクションの開始/終了)を行っていない場合、1つのSQLを実行する度に自動的にトランザクションが終了してしまいます。
このため、カーソルを使用してデータを読み込んだ状態で更新処理などを行うと、自動的にコミットが行われてカーソルがクローズされ、次のデータを読み込もうとした際に、以下のようなエラーメッセージが出力されます。
24000 JYP2013E カーソル“XXXX”がオープンされていません.
24000 カーソル状態の不正
トランザクションの開始/終了(RDOの場合は、BeginTrans/CommitTrans/RollbackTransなど)を明示的に指定して、トランザクション制御を行ってください。
LIKE述語を使って各国語文字列型(NCHAR)を照合比較すると、検索条件にヒットしない
検索条件に「LIKE N'あ%'」と指定するとヒットしない
Microsoft社が提唱したODBC(Open DataBase Connectivity)では、各国語文字列型(NCHAR)が存在しません。
そのため、Symfoware ODOSでの各国語文字列型の操作は推奨できません。
表定義の変更ができない場合は、文字列型(CHAR)の検索時と同様の記述に変更してください。
LIKE N'あ%'
“N”を使用しないようにします。また、“%”を使用する場合、半角で指定します。
LIKE 'あ%'
RDO連携でストアドプロシジャ実行時に、実行時エラー 40041 が発生する
実行時エラー'40041' テキストで指定された項目はありません。
CALL TESTPROC(1,?,?)
Microsoft(R)のRDOの仕様として、パラメタマーカ('?')と定数値を組み合わせて使用する場合、パラメタマーカ('?')は定数値の左側に指定する必要があります。
ストアドプロシジャの定義を変更し、パラメタマーカ('?')と定数値を組み合わせて使用する場合は先にパラメタマーカ('?')を指定するようにしてください。その上で、CALL文の指定を以下のように修正してください。
CALL TESTPROC(1,?,?)
CALL TESTPROC(?,?,1)