0

OleDbCommand.ExecuteNonQuery()を使用して、データベースにデータを挿入しています。

ObjCommand = New OleDbCommand
ObjCommand.CommandType = CommandType.StoredProcedure
ObjCommand.CommandText = StrSQL

ObjCommand.Parameters.Add("field1", OleDbType.VarChar).Value = <something1>
ObjCommand.Parameters.Add("field", OleDbType.VarChar).Value = <something2>
(...)
(...)    
ObjCommand.Parameters.Add("field50", OleDbType.VarChar).Value = <something50>

ObjCommand.Connection = GetDBConnection(StrConnectionString)
ObjCommand.Connection.Open()


<some integer> = ObjCommand.ExecuteNonQuery()

そして、最後の行にのみ表示される変換例外があります。

データ型varcharをsmallintに変換中にエラーが発生しました

それが正常な動作であるかどうか、および変換の問題が発生する場所をどのように知ることができるかを知りたいのですが。

アップデート:

ObjCommand.Parameters.Add("@IdMunFatoGerador", OleDbType.VarChar).Value 
                = ObjNFe.idMunFatoGerador

すべての行にコメントを付け、一部のコメントを外すことでこの行を見つけました。これにより、上記の例外が発生します。

ObjNFe.idMunFatoGeradorは文字列であり、「データ型varcharからsmallintへの変換エラー」も表示されます。

4

5 に答える 5

3

これは、クエリのパラメータの1つが間違ったタイプであることを意味します。つまり、 (c#で)varcharを渡す必要があるときに通過します。smallintshort

ストアドプロシージャの定義がないと、それがどれであるかを推測する方法はありません。

于 2009-12-10T16:45:01.930 に答える
2

varCharとしてストアドプロシージャに一時停止しているパラメータの1つは、ストアドプロシージャにsmallintとして入力されます。また、この場合、渡す値をサーバーが暗黙的に整数値に変換することはできません。ストアドプロシージャの定義を見てください。lalaまたはluluのいずれかがsmallintとして入力されています。次に、送信する実際の値を確認します...

于 2009-12-10T16:45:30.897 に答える
1

DataSetデザイナを使用すると、すべてが生成され、実行時エラーではなくコンパイラエラーが発生します。プロジェクトに新しいデータセットを追加してから、データセットにクエリを追加します。

あなたはこのようなものになってしまいます:

QueriesTableAdapter ta = new QueriesTableAdapter();
ta.Connection = myConnection;
ta.MySeveralParameterStoredProc(x0, x1, ..., xN);
于 2009-12-10T17:27:57.537 に答える
1

パラメータコレクションをループして値を調べ、数値(string.isnumeric)にできるかどうかを確認できると思います。debug.assertを使用して、パラメーター値が大きすぎてパラメーター名だけでなくintも小さくできないというメッセージを出力します。さらに良いのは、パラメータタイプをoledbtype.smallintに設定してから、それらだけを確認することです。最終的には、パラメーターと、それらが基礎となるSQLにどのように対応するかを知る必要があります。パラメータを正しく入力して検索を絞り込み、機能しないものをコマンドオブジェクトに渡さないようにします。HTH。可能なコード:

For each parameter as SqlParameter in mycommandobject.parameters
     if isnumeric(parameter.value) then
          debug.assert(convert.int32(parameter.value) <= 32,767,"This parameter could have an issue - " & parameter.parametername & " value = " & parameter.value) 
     end if

loop

私はコードをテストしていませんが、これはうまくいくと思います。

于 2009-12-10T17:55:31.553 に答える
0

ついに見つけました。

値の形式はすべて問題ありませんでした。問題は次のとおりです。パラメータの1つが欠落していました。まだ完全には理解していませんでしたが、問題は、欠落しているパラメーター(smallint)が次のパラメーター(varchar)で解釈されたため、2番目のパラメーターでエラーが発生したことです。

つまり、field〜35がありませんでした(笑)

つまり、コマンドをプロシージャにマウントするときは、フィールドを常に正確な量と順序で配置することを忘れないでください。=)

君たちありがとう!

于 2009-12-10T19:33:08.817 に答える