代码之家  ›  专栏  ›  技术社区  ›  Jamie Taylor

参数化查询-执行查询时出错

  •  0
  • Jamie Taylor  · 技术社区  · 14 年前

    这是密码

    Dim LogData2 As sterm.MarkData = New sterm.MarkData()
    
    Dim query As String = ("Select * from openquery (db, 'SELECT * FROM table WHERE investor=@investor')")
    
    Dim cmd As New SqlCommand(query)
    cmd.Parameters.AddWithValue("@investor", 34)
    
    Dim drCode2a As DataSet = LogData2.StermQ3(query)
    

    我已经调试过了,它似乎没有将参数放入查询中。

    "Select * from openquery (db, 'SELECT * FROM table WHERE investor=@investor')"
    

    这就是我调试线路时得到的结果 Dim drCode2a As DataSet = LogData2.StermQ3(query)

    你知道我做错了什么吗?

    解决方案

    我是这样解决我的问题的

    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()
    

    1 回复  |  直到 14 年前
        1
  •  1
  •   John Hartsock    14 年前

    好的,杰米·泰勒,我会再回答你的问题。

    您正在使用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