【问题标题】:"Input string was not in a correct format." calling int.Parse on a SQL Statement“输入字符串的格式不正确。”在 SQL 语句上调用 int.Parse
【发布时间】:2012-03-28 16:35:49
【问题描述】:

我收到错误:

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

注意:如果我将第 182 行更改为引号中的实际数字(即“3”或“875”),并注释掉第 171 行,此代码可以正常工作。但是,第 174 行中的“{7}”是一个应该自动递增但不会自动递增的字段。所以我试图在第 171 行获得一个“数字”,它将使用行数 + 1 来执行 auto-=increment。

有谁愿意接受这个? :-)

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

【问题讨论】:

  • 再次,请提前假设第 173 到 181 行没有任何问题,因为这部分代码会将数据插入到我的表中。我不禁想到必须解析第 171 行的结果数据。但我似乎无法得到它。 :-/
  • 为什么要对字符串执行 String.Format(第 171 行)而不实际格式化它?
  • 您在 SQL 查询中调用“int.Parse”?本质上: int.Parse("SELECT COUNT(*) FROM Log WHERE Location is NULL");这就是问题所在。也许您的意思是解析查询的结果,而不是查询本身。
  • @ChrisSinclair,准确地说。我该如何解析呢?
  • @ChrisSinclair 也许这是第 172 行? :-)

标签: c# sql rowcount


【解决方案1】:

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

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

【讨论】:

  • @GarethD 你不觉得他现在积分够了吗?你不希望他再得到那些丑陋的画,对吗?
  • @JonSkeet,我最初的意图是让自动增量工作,但完成它似乎是国会的行为。我实际上更愿意那样做。有什么好的建议吗? C# 程序,Access 数据库。 . .
  • @Geo:嗯,我们没有任何关于它是如何设置的信息等 - 我建议你作为一个单独的问题提出这个问题(鉴于现在改变这个问题将使所有现有的答案和 cmets看起来很奇怪)。但即使你让它发挥作用,你真的真的需要停止将值直接放入你的 SQL 中。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2012-03-11
          • 2015-04-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-23
          相关资源
          最近更新 更多