将varchar转换为更新字符串中的数字时出错

时间:2014-12-11 15:07:43

标签: c# sql-server

我的更新代码出现问题,将varchar转换为numeric的错误正在创建异常。它处理两个表。

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

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

table2(WEB_ADDRESS_GEO)包含从API服务收到的晶格和经度。

ADDRESS_ID | Lat | Lng

我需要使用lats和lng更新表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注入,因为永远不会有用户输入。

1 个答案:

答案 0 :(得分:2)

如果ADDRESS_IDVarChar,则需要使用单引号;

"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作为数值中使用的名称,而不是字符。