";输入字符串的格式不正确";对SQL语句调用int.Parse

本文关键字:quot 语句 调用 Parse SQL int 格式 输入 字符串 不正确 | 更新日期: 2023-09-27 18:29:12

我得到错误:

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

注意:如果我将第182行更改为引号中的实际数字(即"3"或"875"),并注释掉第171行,此代码运行良好。然而,第174行中的"{7}"是一个本应自动递增但不会自动递增的字段。因此,我试图在第171行中得到一个"数字",它将使用行数+1来进行auto-=增量。

有人接受这个吗?:-)

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         );

";输入字符串的格式不正确";对SQL语句调用int.Parse

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

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

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

string.Format不会执行您的SQL命令。所以int.Parse正好看到"SELECT COUNT(*) FROM Log WHERE Location is NULL",它当然不是一个数字的十进制表示。

几乎所有数据库都支持自动递增列。您不应该试图使用int列并自己递增它。有各种各样的竞争条件、性能问题等可以使递增列真正健壮,数据库设计者已经为您解决了所有这些问题。

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