SQL命令无法转换为字符串

时间:2010-10-28 09:27:35

标签: asp.net sql vb.net

这是我的代码

我似乎在使用此代码

时收到错误SQL command cannot be converted to string
Dim LogData2 As sterm.markdata = New sterm.markdata()

Dim query As New SqlCommand("Select * from openquery (db, 'SELECT * FROM table WHERE person=@person')")
query.Parameters.AddWithValue("@person", Session("number"))

Dim drCode2a As DataSet = LogData2.StermQ3(query)

dgBookings.DataSource = drCode2a.Tables(0).DefaultView
dgBookings.DataBind()

我尝试添加Convert.ToString这样的

Dim drCode2a As DataSet = LogData2.StermQ3(Convert.ToString(query))

现在我收到了这个错误

Could not find server 'System' in sysservers. Execute sp_addlinkedserver to add the server to sysservers

我显然做错了但不确定是什么 - ASP.Net和SQL对我来说都是新手,所以任何帮助都会非常感激。

StermQ3的源代码

StermQ3(String) As System.Data.DataSet

Public Function StermQ3(ByVal strSQL6 As String) As System.Data.DataSet

更新

在进行了一些更改之后的源代码

Sub Page_Load(ByVal Sender as Object, ByVal e as EventArgs)

Dim LogData2 As sterm.markdata = New sterm.markdata() 

Dim query As New SqlCommand("Select * from openquery (db, 'SELECT * FROM table WHERE person=@person')") 
query.Parameters.AddWithValue("@person", Session("number")) 
query.CommandType = CommandType.StoredProcedure
query.CommandText = "openquery"

Dim drCode2a As DataSet = LogData2.StermQ3(Convert.ToString(query)) 

dgBookings.DataSource = drCode2a.Tables(0).DefaultView 
dgBookings.DataBind()

End Sub

HTML

<asp:DataGrid id="dgBookings" runat="server" AutoGenerateColumns="true" ShowHeader="true">

</asp:DataGrid>

旧方式我以前做过我的查询

Dim query As String = "Select * from openquery (db, 'SELECT * FROM table WHERE investor=''" + Session("number") + "'' ')"

如果我替换我的SQL命令但它对SQL注入开放

,那么这是有效的

更新

我现在已经拥有它所以它的工作没有参数位这里是我更新的源代码,知道为什么它不会添加参数值?

Dim conn As SqlConnection = New SqlConnection("server='server1'; user id='w'; password='w'; database='w'; pooling='false'")
   conn.Open()


Dim query As New SqlCommand("Select * from openquery (db, 'Select * from table where investor = @investor ') ", conn)
query.Parameters.AddWithValue("@investor", 69836)

dgBookings.DataSource = query.ExecuteReader
dgBookings.DataBind()

它像这样工作

Dim conn As SqlConnection = New SqlConnection("server='server1'; user id='w'; password='w'; database='w'; pooling='false'")
   conn.Open()


Dim query As New SqlCommand("Select * from openquery (db, 'Select * from table where investor = 69836') ", conn)

dgBookings.DataSource = query.ExecuteReader
dgBookings.DataBind()

有什么想法吗?

以下是我解决问题的方法

Dim conn As SqlConnection = New SqlConnection("server='h'; user id='w'; password='w'; database='w'; pooling='false'")

conn.Open()

Dim query As New SqlCommand("DECLARE @investor varchar(10), @sql varchar(1000) Select @investor = 69836 select @sql = 'SELECT * FROM OPENQUERY(db,''SELECT * FROM table WHERE investor = ''''' + @investor + ''''''')' EXEC(@sql)", conn)

dgBookings.DataSource = query.ExecuteReader
dgBookings.DataBind()

感谢所有帮助

4 个答案:

答案 0 :(得分:3)

您是否已调试以了解StermQ3的作用?您正在将字符串引用从SqlCommand-Object传递给它,这可能是无意义的。我认为你需要它的CommandText属性,但是你有一个问题,因为你没有得到实际的SQL文本在数据库上执行的内容。参数在数据库中评估,而不是在此处。

您可以尝试以下内容:

 Dim commandText As String = query.CommandText
 For Each parameter As System.Data.SqlClient.SqlParameter In query.Parameters
     commandText=commandText.Replace(parameter.ParameterName, parameter.Value.ToString)
 Next
 Dim drCode2a As DataSet = LogData2.StermQ3(commandText)

但我不认为你想要那样,因为你再次开放SQL-Injection(StermQ3返回一个数据集)。我认为StermQ3需要获得一个以SQLCommand为参数的重载版本。

编辑:我认为SqlCommand不知道它应该执行StoredProcedure。将其CommandType和CommandText设置为SP的名称:

query.CommandType = CommandType.StoredProcedure
query.CommandText = "openquery"

答案 1 :(得分:0)

LogData2.StermQ3方法的作用是什么?我猜它会记录查询你的执行情况。如果是这样,那么您应该将查询保存在不同的变量中并将其传递给方法。

答案 2 :(得分:0)

看起来该函数接受查询,而不是SQL命令。请尝试以下方法:

Dim query As String = "Select * from openquery (db, 'SELECT * FROM table WHERE person=" & Session("number") & "')"
Dim drCode2a As DataSet = LogData2.StermQ3(query)

dgBookings.DataSource = drCode2a.Tables(0).DefaultView
dgBookings.DataBind()

是的,它可能无法阻止您进行SQL注入,因此在这种情况下您可以做的最好是使用

query = query.Replace("'", "''")

将它传递给该函数之前。在所有其他情况下,使用参数化查询。

答案 3 :(得分:0)

Ok Jamie taylor我会再次尝试回答你的问题。

您正在使用OpenQuery,因为您可能正在使用链接数据库

基本上问题是OpenQuery方法接受一个字符串,你不能将变量作为发送给OpenQuery的字符串的一部分传递。

您可以像这样格式化查询。表示法遵循servername.databasename.schemaname.tablename。如果您通过odbc使用链接服务器,则省略databasename和schemaname,如下所示

    Dim conn As SqlConnection = New SqlConnection("your SQL Connection String")
    Dim cmd As SqlCommand = conn.CreateCommand()
    cmd.CommandText = "Select * db...table where investor = @investor"
    Dim parameter As SqlParameter = cmd.CreateParameter()
    parameter.DbType = SqlDbType.Int
    parameter.ParameterName = "@investor"
    parameter.Direction = ParameterDirection.Input
    parameter.Value = 34