我的更新代码出现问题,将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注入,因为永远不会有用户输入。
答案 0 :(得分:2)
如果ADDRESS_ID
为VarChar
,则需要使用单引号;
"WHERE ADDRESS_ID= '" + row.ADDRESS_ID + "'"
如果Lat
和Lng
为decimal
,则无需使用单引号。
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();
}
但是从您的变量名称,strLat
和strLng
听起来确实像某些字符值,而不是数值。它与row.ADDRESS_ID
值相反。 主要变量包含ID
作为数值中使用的名称,而不是字符。