2010-11-15 78 views
0

我在使用變量編寫查詢時遇到了一些麻煩。這裏是我的代碼SQL查詢未輸入變量的值

Dim bondnumber as String = "69836" 

Dim PasswordCheck As String = "DECLARE @investor varchar(10), 
@thepassword varchar(20), @linkedserver2 varchar(25), @sql varchar(1000) " 
PasswordCheck += "SELECT @investor = '" & bondnumber & "', 
@linkedserver2 = 'binfodev', "PasswordCheck += "@sql = 'SELECT * FROM ' + 
@linkedserver2 + ' WHERE bondno = ''@investor'' ' EXEC(@sql)" 

它似乎並沒有被正確傳遞變量在查詢和我不知道我要去哪裏錯了

什麼想法?

+0

您能否提供更多的細節?變量未被正確傳遞到哪裏? – 2010-11-15 14:22:09

+0

刪除上次PasswordCheck作業中@ linkedserver2附近的引號。你不需要它們,因爲VARCHAR是在一個變量中。 – 2010-11-15 14:28:58

回答

3

您所看到的具體問題是什麼?更多信息將有所幫助。

我可以告訴什麼,是你的代碼轉換爲SQL的長線(爲bondnumber代替「69836」)

DECLARE @investor varchar(10), @thepassword varchar(20), @linkedserver2 varchar(25), @sql varchar(1000) SELECT @investor = '69836', @linkedserver2 = 'binfodev', @sql = 'SELECT * FROM ' + @linkedserver2 + ' WHERE bondno = ''@investor'' ' EXEC(@sql) 

如果執行一個查詢窗口,我敢打賭,它將失敗。嘗試在每個邏輯語句的末尾添加;

你有沒有考慮過只是把這段代碼做成一個存儲過程並將params傳遞給它?這樣的代碼非常危險(SQL注入),很難閱讀,並且總體上有點難看。

示例存儲過程代碼:

CREATE PROCEDURE dbo.usp_MyStoredProcedure 
     @Param1 INT = NULL 
AS 

SELECT * FROM MyTable Where Col1 = @Param1 
+0

@James Wiseman我怎樣才能使這個存儲過程? – 2010-11-15 14:23:56

+0

@Jamie Taylor - 真的很基本的問題,恐怕。我已經包含了一些示例存儲過程代碼,但我建議您閱讀它們。祝您好運 – 2010-11-15 14:29:19

+0

如果您不使用存儲過程,您可能還會考慮將查詢分解出來。即使在asp.net代碼中使用參數化查詢,您仍然可以使用參數化查詢。 – 2010-11-15 14:31:43

0

@Jamie - 嗯,我個人傾向於認爲它是更清晰,打破東西的一部分,雖然它不是在技術上需要一點點。我只是說要分別構建參數變量,然後將它們添加爲參數化(如下所示):

Dim sql As String = "SELECT * FROM @LinkedServer WHERE bondno = @BondNumber" 
Dim c As New SqlConnection("Your Connection String Here") 
Dim cmd As SqlCommand = c.CreateCommand() 
With cmd 
    .CommandType = CommandType.Text 
    .CommandText = sql 
    .Parameters.Add(New SqlParameter("@LinkedServer", SqlDbType.VarChar)).Value = "binfodev" 
    .Parameters.Add(New SqlParameter("@BondNumber", SqlDbType.VarChar)).Value = "69836" 
End With 
Dim dt As New DataTable 
Dim da As New SqlDataAdapter(cmd) 
da.Fill(dt)