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

时间:2012-01-16 09:36:07

标签: c# asp.net

我的代码中出现以下错误。

  

将数据类型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。

谢谢,

3 个答案:

答案 0 :(得分:3)

所以我认为你的错误与你的select语句有关。

您正在尝试对nvarchar值执行计算。您需要更改数据类型,或在select语句中执行Cast。

例如......

CAST (lat AS float)

例如,select语句中的一部分应该是......

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

注意:使用Cast方法,您需要确保所有数据值都是数字,这样就不会出现强制转换异常

答案 1 :(得分:2)

您的@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的参数,并带有所需的值。

答案 2 :(得分:0)

因为您将nvarchar类型参数乘以Pi。

即使查询是正确的,您仍然可以将Pi的纬度或经度值(您也称为nvarchar类型)乘以。