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 注入的一个坏案例!使用准备好的语句(或至少适当的转义)!

第二:

您的直接问题是'正确包含 IN 子句:

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

由字符包围的任何内容'都被视为单个字符串。SQL server 试图将这个字符串解析为一个数字,但由于它无法解析,因此报告了错误。

第三:

使用数字数据时,永远,永远,永远(我有没有提到?)使用文本数据来比较它——这实际上会影响性能。(在这个规模上,当然这并不重要,但记住这一点可以节省很多不必要的性能分析和调试......)

因此,虽然此查询实际上有效:

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 injection的信息。

于 2013-02-28T11:16:40.800 回答
0

它是对加入术语的转换,在您的情况下,数据库服务器似乎可以转换引号中包含的数字,但不能超过用逗号分隔的数字:

'116743,116744,116745'

到 :

'116745','116746','116747'

尝试重新格式化加入以用引号分隔数字。或从 sql statament 中删除引号,这样您就可以得到IN(" + joined + ")"IN('" + joined + "')"

于 2013-02-28T11:17:20.987 回答
0

请注意,您的两个查询不相同。程序化的在整个数字组周围加上单引号,而您的 SQL 测试在每个数字周围加上单引号。

不过,您可能可以完全省略引号:

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