0

我收到错误消息:

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

注意:如果我将第 182 行更改为引号中的实际数字(即“3”或“875”),并注释掉第 171 行,则此代码可以正常工作。但是,第 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         );
4

5 回答 5

15

立即停止使用该代码并改用参数化 SQL。否则,您很容易受到SQL 注入攻击,并且可能存在数据类型转换问题。

接下来,想想你实际上得到了什么rowCount。它不是代表整数的字符串 - 它是一些 SQL。试图解析它int.Parse是行不通的,是吗?您需要先执行查询 - 或在插入语句中使用子查询。老实说,如果它一个自动递增的字段,我只会专注于让它工作,而不是用容易受到竞争条件影响的代码来绕过它。

于 2012-03-28T16:38:02.830 回答
2

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

于 2012-03-28T16:37:53.703 回答
2

string.Format不会执行您的 SQL 命令。所以int.Parse确切地说"SELECT COUNT(*) FROM Log WHERE Location is NULL",这当然不是数字的十进制表示。

于 2012-03-28T16:38:08.803 回答
0

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

于 2012-03-28T17:38:53.900 回答
0

几乎所有数据库都具有对自动递增列的本机支持。您不应该尝试使用 int 列并自己增加它。有各种各样的竞争条件、性能问题等,才能使递增列真正健壮,并且数据库设计人员已经为您处理了所有这些问题。

于 2012-03-28T16:49:57.250 回答