“输入字符串的格式不正确。”在SQL语句上调用int.Parse

时间:2012-03-28 16:35:49

标签: c# sql rowcount

我收到错误:

“输入字符串的格式不正确。”

注意:如果我将第182行更改为引号中的实际数字(即“3”或“875”),并注释掉第171行,此代码完全正常< / em>的。但是,第174行中的“{7}”是一个应该自动递增的字段,但不会。所以我试图在第171行得到一个“数字”,它将使用行数+ 1来进行自动增量。

这个人的任何人? :-)

171   string rowCount = string.Format("SELECT COUNT(*) FROM Log WHERE Location is NULL");

173   string sql = string.Format("insert into Log values " +
174         "('{0}','{1}',{2},{3},'{4}',#{5}#,'{6}','{7}')",
175         comboBox1.Text,
176         comboBox2.Text,
177         float.Parse(textBox1.Text),
178         float.Parse(comboBox3.Text),
179         textBox3.Text,
180         textBox2.Text,
181         addRemove,
182         int.Parse(rowCount) 
183         );

5 个答案:

答案 0 :(得分:15)

停止使用该代码立即并改为使用参数化SQL。否则,您很容易受到SQL injection attacks的攻击,并且可能会遇到数据类型转换问题。

接下来,考虑一下rowCount中你实际得到了什么。它不是表示整数的字符串 - 它是一些SQL。试图用int.Parse来解析它是行不通的,是吗? 您需要首先执行查询 - 或者在insert语句中使用子查询。说实话,如果意味着是一个自动递增的字段,我只会集中精力去实现它的工作,而不是用代码进行捏造,而这些代码很容易受到竞争条件的影响。

答案 1 :(得分:2)

int.Parse(rowCount)将字符串转换为数字,例如“100500”到100500.但是你的字符串包含"SELECT COUNT(*) FROM Log WHERE Location is NULL",而这不是数字。

答案 2 :(得分:2)

string.Format不会执行您的SQL命令。因此int.Parse完全看到"SELECT COUNT(*) FROM Log WHERE Location is NULL",这当然不是数字的十进制表示。

答案 3 :(得分:0)

实际上,所有数据库都支持自动递增列。您不应该尝试使用int列并自行增加它。有各种各样的竞争条件,性能问题等,以使增量列非常强大,数据库设计人员已经为您处理了所有这些。

答案 4 :(得分:0)

您可能正在寻找能够解决此特定帖子问题的答案。已发布的答案将帮助您做到这一点。
你应该检查其他方法。 使用命令对象并使用参数(由@JonSkeet建议)
对自动增量列的工作方式进行一些研究。这因数据库供应商而异。您似乎可能正在使用Microsoft Access。对于MS Sql Server,自动增量列是一个标识列,在Oracle中,使用序列的机制有点不同。基本上,您不提供自动增量列的值,您可以让数据库引擎为您处理。 (前一张海报也提到过)
我还建议您将文本框的值分配给变量,并在插入insert语句或参数之前对数据进行一些验证。尝试以防御性方式进行编程。