2010-11-15 77 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)