C# 将数据类型nvarchar转换为浮点时出错

C# 将数据类型nvarchar转换为浮点时出错,c#,asp.net,C#,Asp.net,我的代码中出现以下错误 将数据类型nvarchar转换为浮点时出错 我点击按钮的代码是 protected void btnFind_Click(object sender, EventArgs e) { SqlParameter LatParam; SqlParameter LngParam; if (zipcode.Text != "") { litAddress.Text = ""; litAd

我的代码中出现以下错误

将数据类型nvarchar转换为浮点时出错

我点击按钮的代码是

 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)
例如,select语句中的一部分应该是

ACOS( SIN( CAST ((@lat) AS float) * PI() / 180 )

注意:使用Cast方法时,您需要确保所有数据值都是数字,因此不会出现Cast异常,因为您将nvarchar类型参数乘以Pi

即使查询是正确的,您仍然会将一个纬度或经度值(您说它也是nvarchar类型)乘以Pi。

您的@lat etc包含字符串值,碰巧包含TSQL,但服务器并不关心这一点-服务器只是将其视为一个字符串。然后执行数学运算@lat*PI/180,其中@lat是一个类似于select lat from tbl_pincode的字符串,其中code=…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/float无关,但您确实应该使用参数,而不是串联-您可能会在此处大量暴露于SQL注入。请阅读以下内容:请指出哪一行引发异常。您在这里做的是一个小Bobby表,是吗?至少在代码格式方面做些努力:/I我根据你的建议修改了我的查询,但错误仍然存在。@asifa:好的,它工作了吗?您是否对所有要求的值应用了强制转换?也值得在值中添加括号-这将确保select语句独立运行,例如。。。将@lat转换为float您是否遇到其他异常?你的select声明是什么?您确定所有的值都可以转换为浮点数吗?另外,也许可以在SQL Management Studio中尝试完整语句,因为它将提供更好的调试。我想向您展示我的整个查询,在哪里可以粘贴它。请帮我一个忙。@asifa:好的,我觉得这个查询很好。是同一个例外吗?您确定所有可能的值都是有效的数字吗?您不能有任何空值。请告诉我如何解决它。我试着将其转换为浮动并施法,但没有成功。将什么转换为浮动并施法什么?@asifa没有告诉我lat/long的来源,etc@asifa如果@lat的值仍然是您的TSQL,则该值无法工作-请阅读文本Iwrote@asifa你没有读过我写的东西;请:从tbl_pincode中选择@lat=[lat],其中代码{blah blah}不是数值;服务器不执行此操作;它只是一个不透明的字符串。我解释了添加zipcode作为参数,并在TSQL中查找@lat等。