1
 StrSqlLines = "Select * From dbo.SqlDtaToCreate WHERE DtaLineAccountToDebit = '" + Straccref + "' and DtaLineCode IN('" + joined + "')";

このクエリを実行するとエラーが発生します

Conversion failed when converting the varchar value '116743,116744,116745' to data type int.

ただし、クエリは SQL から正常に動作します

select * from SqlDtaToCreate where DtaLineAccountToDebit='123.567U' and DtaLineCode IN('116745','116746','116747')
4

4 に答える 4

2

初め:

これは、SQL インジェクションの悪いケースかもしれません! 準備済みステートメント (または少なくとも適切なエスケープ) を使用してください。

2番:

当面の問題は'、IN句を正しく囲むことです。

 StrSqlLines = "Select * " +
               "From dbo.SqlDtaToCreate "
               " WHERE DtaLineAccountToDebit = '" + Straccref + "' " + 
               " and DtaLineCode IN(" + joined + ")"; //notice missing ' characters

文字で囲まれた'ものはすべて、1 つの文字列として扱われます。SQL サーバーは、この 1 つの文字列を数値として解析しようとしましたが、そのままでは解析できなかったため、エラーが報告されました。

三番:

数値データを使用するときは、絶対に、絶対に、絶対に(まだ一度も言いませんでしたか?) 比較するためにテキスト データを使用しないでください。これは、文字通りパフォーマンスを低下させる可能性があります。(もちろん、この規模では重要ではありませんが、これを念頭に置いておくと、不要なパフォーマンス分析とデバッグを大幅に省くことができます...)

したがって、このクエリは実際に機能しますが、次のようになります。

select * from SqlDtaToCreate where DtaLineAccountToDebit='123.567U' and DtaLineCode IN('116745','116746','116747')

提供されたデータの暗黙的な変換を行うため、適切な方法は次のとおりです。

select * from SqlDtaToCreate where DtaLineAccountToDebit='123.567U' and DtaLineCode IN(116745,116746,116747)
于 2013-02-28T11:16:57.590 に答える
0

変数に欠落'があることに注意してください。joined

'116743,116744,116745'

「116745」、「116746」、「116747」

理想的には、INTを比較しているので、必要なのは

116743,116744,116745

そしてSQLインジェクションについて読んでください。

于 2013-02-28T11:16:40.800 に答える
0

結合された用語の変換です。あなたの場合、データベースサーバーは引用符で囲まれた数値を変換できますが、カンマで区切られたもの以上は変換できないようです:

'116743,116744,116745'

に :

'116745','116746','116747'

数値を引用符で区切るように結合を再フォーマットするか、SQL ステートメントから引用符を削除して、IN(" + joined + ")"代わりに次のようにします。IN('" + joined + "')"

于 2013-02-28T11:17:20.987 に答える
0

2 つのクエリは同じではないことに注意してください。プログラムによるテストでは、数値のグループ全体を一重引用符で囲みますが、SQL テストでは各数値を一重引用符で囲みます。

ただし、おそらく引用符を完全に省略できます。

StrSqlLines = "Select * From dbo.SqlDtaToCreate WHERE DtaLineAccountToDebit = '" 
   + Straccref + "' and DtaLineCode IN(" + joined + ")";
于 2013-02-28T11:17:32.430 に答える