【问题标题】:error converting varchar to numeric in update string在更新字符串中将 varchar 转换为数字时出错
【发布时间】:2014-12-11 15:07:42
【问题描述】:

我的更新代码有问题,将 varchar 转换为数字时出错,导致异常。它正在处理两个表。

table1(WEB_ADDRESS) 包含发送到地理编码 API 服务的地址信息。

|PKID | ADDRESS_ID | ADDRESS_1 | CITY | etc...

table2(WEB_ADDRESS_GEO) 包含从 API 服务接收的纬度和经度。

ADDRESS_ID | Lat | Lng

我需要用 lats 和 lngs 更新表 2 中的数据行,以匹配表 1 中的地址数据。

这里是代码

  using (SqlConnection myConnection = new SqlConnection(context))
  {
      myConnection.Open();
      string strQueryUpdate = "UPDATE WEB_ADDRESS_GEO SET Lat = '" + strLat + "', Lng = '" + strLng + "'" + "WHERE ADDRESS_ID=" + row.ADDRESS_ID;
      SqlCommand myCommandUpdate = new SqlCommand(strQueryUpdate, myConnection);
      myCommandUpdate.ExecuteNonQuery();

ADDRESS_ID 列是 VarChar 类型,Lat 和 Lng 是十进制类型。

注意:避免 sql 注入,因为永远不会有用户输入。

【问题讨论】:

  • 通过字符串连接而不是使用准备好的语句/参数,您将感受到 SQL 注入之神的愤怒......
  • 注意:sql注入并不是使用参数化命令的唯一原因。例如,参数具有显式类型,因此您可以避免像您在这里遇到的类型问题(或者至少它们更容易看到)。

标签: c# sql-server


【解决方案1】:

如果ADDRESS_IDVarChar,则需要用单引号加上like;

"WHERE ADDRESS_ID= '" + row.ADDRESS_ID + "'"

如果LatLngdecimal,则不需要对它们使用单​​引号。

SET Lat = " + strLat + ", Lng = " + strLng

作为更好的方法,请使用parameterized queries。这种字符串连接对SQL Injection 攻击开放。

using(SqlConnection myConnection = new SqlConnection(context))
using(SqlCommand myCommandUpdate = conn.CreateCommand())
{
   myCommandUpdate.CommandText = @"UPDATE WEB_ADDRESS_GEO SET Lat = @lat, Lng = @lng 
                                  WHERE ADDRESS_ID = @address";
   myCommandUpdate.Parameters.Add(@lat, SqlDbType.Decimal).Value = strLat;
   myCommandUpdate.Parameters.Add(@lng, SqlDbType.Decimal).Value = strLng;
   myCommandUpdate.Parameters.Add(@address, SqlDbType.VarChar).Value = row.ADDRESS_ID;
   myConnection.Open();
   myCommandUpdate.ExecuteNonQuery();
}

但是从你的变量名来看,strLatstrLng 听起来确实像一些字符值,而不是数值。这与您的 row.ADDRESS_ID 值相反。 大部分该变量包含ID 作为数值中使用的名称,而不是字符。

【讨论】:

  • 即使不担心 SQL 注入(因为您 100% 信任源)参数化查询也更擅长处理类型,因为您无需担心引用是否正确等等。
  • 注意。我认为您应该删除 ADDRESS_ID cmets。 ID 通常是数字,没有理由怀疑在这种情况下它不是数字,它掩盖了您接下来提到的真正问题。
  • 看起来这个问题的最佳答案实际上只是使用参数化查询。所以我会这样做。
  • @RyeNyeTheWebSiteGuy 究竟是什么错误?能不能说的具体点?
  • @RyeNyeTheWebSiteGuy 这在我看来不像是一个数值。使用VarChar 类型会是不错的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
相关资源
最近更新 更多