ページの先頭行へ戻る
Symfoware Server V10.0.0 トラブルシューティング集

2.2.3 ODBC対応開発ツールでの開発時の異常(運用)

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を実行する度に自動的にトランザクションが終了してしまいます。

このため、カーソルを使用してデータを読み込んだ状態で更新処理などを行うと、自動的にコミットが行われてカーソルがクローズされ、次のデータを読み込もうとした際に、以下のようなエラーメッセージが出力されます。

ODOSドライバの場合
24000  JYP2013E  カーソル“XXXX”がオープンされていません.
ODBCドライバの場合
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)