将数据类型nvarchar转换为float时出错
本文关键字:float 出错 转换 数据类型 nvarchar | 更新日期: 2023-09-27 18:20:19
我的代码中出现以下错误。
将数据类型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;
}
}
表中的数据类型是nvarchar,表示纬度、经度和邮政编码。
谢谢,
所以我认为您的错误在于select语句。
您正在尝试对nvarchar值执行计算。您需要更改数据类型,或者在select语句中执行强制转换。
例如。。。
CAST (lat AS float)
例如,选择语句中的一部分应该是…
ACOS( SIN( CAST ((@lat) AS float) * PI() / 180 )
注意:使用Cast方法,您需要确保所有数据值都是数字,这样就不会出现强制转换异常
您的@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 codes=@zipcode
-- your math work here
并将一个名为zipcode
的参数添加到该命令中。
因为您要将nvarchar类型参数乘以Pi。
即使查询是正确的,您仍然会将纬度或经度值(您说它也是nvarchar类型)乘以Pi。