2010-09-01 22 views
1

我已經創建了一個稱爲業務的視圖,它運行成功,但問題是我將如何使用動態值來代替12.925432,77.5940171,我想從SQL查詢中傳遞參數後面的c#代碼。如何將值傳遞到SQL Server中的視圖

create view [dbo].[business] as 
SELECT Id, 
     Name1, 
     ZipCode, 
     StreetName, 
     StreetNumber, 
     State1, 
     Lat, 
     Lng, 
     Keyword, 
     (6371 * ACOS(COS((12.925432/57.2958)) * COS( (Lat/57.2958) ) * COS((Lng/57.2958) - (77.5940171/57.2958)) + SIN(12.925432/57.2958) * SIN( Lat/57.2958 ))) AS distance 
    FROM Business_Details ; 

這將是我從後面的c#代碼查詢。 ....

DataSet ds = new DataSet(); 

SqlCommand com = new SqlCommand(); 
SqlDataAdapter sqlda = new SqlDataAdapter(com); 
//sqlda.SelectCommand.CommandText = "SELECT Id,Name1,ZipCode,StreetName,StreetNumber,State1,Lat,Lng,Keyword, (6371 * ACOS(COS((12.925432/57.2958)) * COS( (Lat/57.2958) ) * COS((Lng/57.2958) - (77.5940171/57.2958)) + SIN(12.925432/57.2958) * SIN( Lat/57.2958 ))) AS distance FROM Business_Details where((StreetName like '%jayanagar%')and (Keyword like '%plumbing%'))ORDER BY distance;"; 

sqlda.SelectCommand.CommandText = "select * 
            from business 
            where ((distance < '" + radius + "') 
             and (StreetName like '%" + streetname + "%') 
             and (Keyword like '%" + keyword1 + "%')) 
           order by distance"; 
sqlda.SelectCommand.Connection = con; 
sqlda.Fill(ds); 
con.Close(); 
..... 

回答

3

我想你會需要一個用戶定義的函數,所以:

CREATE FUNCTION spherical_distance(@a float, @b float, @c float) 
RETURNS float 
AS 
BEGIN 
    RETURN (6371 * ACOS(COS((@a/@b)) * COS( (Lat/@b) ) * COS((Lng/@b) - (@c/@b)) + SIN(@a/@b) * SIN( Lat/@b )))  
END 

create view [dbo].[business] as 
SELECT Id, 
     Name1, 
     ZipCode, 
     StreetName, 
     StreetNumber, 
     State1, 
     Lat, 
     Lng, 
     Keyword 
    FROM Business_Details 

然後在代碼,你需要做到這一點:

sqlda.SelectCommand.CommandText = "select *, spherical_distance(12.925432, 57.2958, 77.5940171) as distance 
            from business 
            where ((distance < '" + radius + "') 
             and (StreetName like '%" + streetname + "%') 
             and (Keyword like '%" + keyword1 + "%')) 
           order by spherical_distance(12.925432,57.2958,77.5940171)"; 

然後,您會將值替換爲selectcommand的commandtext而不是這些數字。

+0

+1:你打我到id。非物化視圖主要用於只讀操作。有可更新的非物化視圖,但這只是將更新掩蓋到支持表中......這與OP需要的實際功能沒有任何關係 – 2010-09-01 04:16:47

+0

感謝您的回覆,創建用戶定義的函數不起作用 CREATE FUNCTION spherical_distance(@a float,@b float,@c float) RETURNS float AS BEGIN RETURN(6371 * ACOS(COS((@ a/@ b))* COS((Lat/b) )* SIN(@ a/@ b)* SIN(Lat/@ b))) END 它顯示指示無效列名Lat的錯誤, Lng – mahesh 2010-09-01 04:34:59

+0

我已經開始了你的等式,所以如果Lat,Lng在那裏是錯誤的,他們在我的udf例子中是錯誤的。修復你所需要的東西。 – BlackICE 2010-09-01 13:03:28