このように多くのパラメータを使用すると、課題は任意になる可能性があります データ型、データ長などの不一致を含む 1 つの項目。ここで、デバッグと呼ばれる技術を行使する必要があります。
<オール> <リ>
テーブルのデータ型を注意深く確認してください (T_SAP_ZSSTABL_NEW
)。 Oracle には、ADO タイプ
BLOB
など 、 CLOB
、 BFILE
、高精度数値型、最大文字型、または拡張型 (XML、メディアなど)。
データの長さを拡張してみてください (またはパラメーターの割り当てで空白のままにしてください):
Set MyParameter =cmd.CreateParameter("MATNR", adVarChar, adParamInput, 100, POSNR)Set MyParameter =cmd.CreateParameter("MATNR", adVarChar, adParamInput, , POSNR)
プレ>必要に応じて、VBA の
<リ>Len()
で変数の長さを確認してください パラメータを追加する前にユーザーに警告を発します。<プレ>
SELECT
を実行してみてください 同じパラメーターを持つクエリのバージョンを使用して、結果の単一行を返します。同じエラーが発生した場合は、最初のパラメーターから始めて、2 番目または 10 個のバッチを順番に追加して、問題のあるアイテムを分離します。SELECT ? AS TSZ_CHARG_PARAM, ? AS TSZ_MATNR_PARAM, ? AS TSZ_MAKTX_PARAM, ...FROM T_SAP_ZSSTABL_NEWWHERE TSZ_VBELN =? AND TSZ_POSNR =?コード> プレ> <リ>
一貫性を保つためにコードをリファクタリングします。多くの繰り返し行で発生する可能性のある 1 つを見逃したり、ずれたりする可能性があります。常に DRY (Don't Repeat Yourself) コードを目指してください。 1 つのオプションは、辞書 160 以上の変数や名前付き範囲の代わりにキーと値のペアを使用:
Dim key As VariantDim paramDict As ObjectSet paramDict =CreateObject("Scripting.Dictionary")For ... paramDict.Add "KeyX", "ValueX"Next ...... With cmd .ActiveConnection =myOracleConn .CommandText =strSQL .CommandType =adCmdText For Each key In paramDict.Keys .Parameters.Append .CreateParameter(key, adVarChar, adParamInput, , paramDict(key)) 次のキー .ExecuteEnd With
プレ>型が混在している場合は、型ごとに異なる辞書を作成し、それらを順番に繰り返してパラメーターを追加してみてください。
<リ>UPDATE
を調整します すべての同じタイプが互いに近くにあります。UPDATE
を思い出してください テーブル定義の列の順序に従う必要はありません。可能であれば (または長期的な解決策)、TSZ のワイド フォーマット テーブルの再設計を検討してください。 列を長い形式の正規化された形式に変換します。
ID POSNR VBELN Indicator Value # XXX XXX CHARG XXX # XXX XXX MATNR XXX # XXX XXX MAKTX XXX...
プレ>これにより、一意の識別子ごとに 167 行が追加されますが、データベース設計では、行は列よりもはるかに安価であるため、クエリが容易になり、データ ストレージがよりスケーラブルになり、メンテナンスがより効率的になります。たとえば、新しいメトリクスには、すべてのメタ情報を含む新しく定義された列は必要なく、単に新しい行が必要です。そして、Oracle の
PIVOT
を使用 ワイド フォーマットを簡単に再レンダリングできます。全体として、データベース接続などの API 拡張から発生するこのような実行時エラーをデバッグする明確な方法はありません。 SQL 構文または VBA オブジェクトの参照は簡単に処理できますが、データ固有の問題については、プロセス全体を創造的に掘り下げる必要があります。