2012-01-16 144 views
-2

我在代碼中收到以下錯誤。將數據類型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。

謝謝,

+2

與nvarchar/float無關,但您應該真正使用參數而不是串聯 - 您可能在這裏暴露於SQL注入這裏 – 2012-01-16 09:38:47

+0

請仔細閱讀:[SQL注入攻擊](http:///msdn.microsoft.com/en-us/library/ms161953.aspx) – musefan 2012-01-16 09:39:03

+0

請指出哪一行引發異常 – 2012-01-16 09:39:28

回答

3

所以我認爲你的錯誤是你的選擇語句。

您正試圖對nvarchar值執行計算。您可能需要更改數據類型,或者在您的select語句中執行Cast。

例如...

CAST (lat AS float) 

從例如應該是SELECT語句中的部分...

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

注:使用鑄造法,您需要確保所有您的數據值爲數字,因此不會有投射異常

+1

我根據您的建議修改了我的查詢,但錯誤仍然存​​在。 – asifa 2012-01-16 09:55:03

+0

@asifa:好的,它工作嗎?你是否將劇組應用於所有需要的值?它也可能值得在這些值中加上括號 - 這將確保select語句獨立運行,例如...'CAST((@lat)AS float)' – musefan 2012-01-16 09:59:17

+0

它沒有工作。 – asifa 2012-01-16 10:05:05

0

因爲您將nvarchar類型參數乘以Pi。

即使查詢是正確的,您仍然會將Pi的緯度或經度值(也稱爲nvarchar類型)相乘。

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 [email protected] 
-- your math work here 

,添加一個名爲zipcode的命令參數,將所需的值。

+0

Plz告訴我如何解決它。我試圖將它轉換爲浮動並投射它,但沒有運氣。 – asifa 2012-01-16 09:59:08

+0

轉換**什麼**浮動和鑄造**什麼**? – 2012-01-16 10:06:21

+0

plz檢查此鏈接http://paste.pocoo.org/show/535570/ – asifa 2012-01-16 10:22:37

相關問題