将数据类型nvarchar转换为浮点时出错
问题描述:
我在代码中收到以下错误。将数据类型nvarchar转换为浮点时出错
将数据类型nvarchar转换为float时出错。
我就按一下按钮的代码是
protected void btnFind_Click(object sender, EventArgs e)
{
SqlParameter LatParam;
SqlParameter LngParam;
if (zipcode.Text != "")
{
litAddress.Text = "";
litAddress1.Text = "";
string addressstring = zipcode.Text;
string connstring = "Data Source=win2008-2;Initial Catalog=h1tm11;User ID=sa;Password=#1cub3123*;Persist Security Info=True;";
string SQL1 = "SELECT *, 6371.01 * ACOS(SIN(@lat*PI()/180) * SIN(store_lat*PI()/180) + COS(@lat*PI()/180) * COS(store_lat*PI()/180) * COS((store_long*PI()/180) - (@lng*PI()/180))) AS distance from storelocator where 6371.01 * ACOS(SIN(@lat*PI()/180) * SIN(store_lat*PI()/180) + COS(@lng*PI()/180) * COS(store_lat*PI()/180) * COS((store_long*PI()/180) - (@lng*PI()/180))) < '" + ddl_distance.SelectedItem.Value + "' order by distance asc;";
SqlConnection conn = new SqlConnection(connstring);
conn.Open();
SqlCommand comm = new SqlCommand(SQL1, conn);
LatParam = new SqlParameter();
LatParam.ParameterName = "@lat";
LatParam.SqlDbType = SqlDbType.NVarChar;
LatParam.Value = "select lat from tbl_pincode where codes='" + zipcode.Text + "';";
LngParam = new SqlParameter();
LngParam.ParameterName = "@lng";
LngParam.SqlDbType = SqlDbType.NVarChar;
LngParam.Value ="select lat from tbl_pincode where codes='" + zipcode.Text + "';";
comm.Parameters.Add(LatParam);
comm.Parameters.Add(LngParam);
SqlDataReader reader = comm.ExecuteReader(CommandBehavior.CloseConnection);
while (reader.Read())
{
string area = reader["lat"].ToString();
string codes =reader["lng"].ToString();
litAddress.Text += area;
litAddress1.Text += codes;
}
}
表中的数据类型是纬度,经度和pincodes为nvarchar。
谢谢,
答
所以我认为你的错误是你的选择语句。
您正试图对nvarchar值执行计算。您可能需要更改数据类型,或者在您的select语句中执行Cast。
例如...
CAST (lat AS float)
从例如应该是SELECT语句中的部分...
ACOS(SIN(CAST ((@lat) AS float) * PI()/180)
注:使用铸造法,您需要确保所有您的数据值为数字,因此不会有投射异常
答
因为您将nvarchar类型参数乘以Pi。
即使查询是正确的,您仍然会将Pi的纬度或经度值(也称为nvarchar类型)相乘。
答
你@lat
等含有字符串值,其发生包含TSQL,但服务器不关心这个 - 服务器只是认为它作为一个字符串。然后执行数学运算,@lat*PI()/180
,其中@lat
是一个字符串,如select lat from tbl_pincode where codes=...blah...
。服务器不评估它们 - 它们只是字符串。
什么你应该做的,是这样的:
declare @lat numeric, @long numeric -- replace with correct data types
select @lat = [lat], @long = [long] from tbl_pincode where [email protected]
-- your math work here
,添加一个名为zipcode
的命令参数,将所需的值。
与nvarchar/float无关,但您应该真正使用参数而不是串联 - 您可能在这里暴露于SQL注入这里 – 2012-01-16 09:38:47
请仔细阅读:[SQL注入攻击](http:///msdn.microsoft.com/en-us/library/ms161953.aspx) – musefan 2012-01-16 09:39:03
请指出哪一行引发异常 – 2012-01-16 09:39:28