这是我的代码
我似乎在使用此代码
时收到错误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()
感谢所有帮助
答案 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