我收到错误:
“输入字符串的格式不正确。”
注意:如果我将第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 );
答案 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语句或参数之前对数据进行一些验证。尝试以防御性方式进行编程。