【问题标题】:how to use parameterized queries in vb when using SQL Server 2012使用 SQL Server 2012 时如何在 vb 中使用参数化查询
【发布时间】:2016-06-15 06:17:23
【问题描述】:

当我对查询进行参数化时,出现“必须声明标量变量”的错误。我是使用 SQL Server 的新手。而我使用的版本是SQL Server 2012。下面是sn-p的代码:

   Protected Sub Main_Page
    Dim con as OleDbConnection
    Dim cmd as OleDbCommand
    Dim query as String

    con = New OleDbConnection("Provider=SQLNCLI11;Data Source=ARIES-PC\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=SchoolDB")
    con.Open()
    query = "INSERT INTO Instructors(FirstName,LastName,Address,Contact_Number) VALUES (@fname,@lname,@address,@number)"
    cmd = New OleDbCommand(query, con)
    cmd.Parameters.AddWithValue("@fname", txtFirstName.Text)
    cmd.Parameters.AddWithValue("@lname", txtLastName.Text)
    cmd.Parameters.AddWithValue("@address", txtAddress.Text)
    cmd.Parameters.AddWithValue("@number", txtContact.Text)
    cmd.ExecuteNonQuery()
    cmd.Dispose()
    con.Close()
    Response.Write(<script>alert('Success!')</script>)
End Sub

【问题讨论】:

  • 您应该查看Can we stop using AddWithValue() already? 并停止使用.AddWithValue() - 它可能会导致意想不到和令人惊讶的结果...
  • 此外,您应该对实现IDisposable 接口的任何对象使用using 语句。除此之外,您的代码似乎应该可以正常工作。
  • 您为什么使用 OleDb 而不是本机 SqlClient 库?通常,此错误意味着您的某个字段或表格拼写错误并被错误地视为参数。
  • 但是当我运行我的代码时,我得到了一个错误,“必须声明标量变量”.. 什么是合适的解决方案?
  • 没什么可学习的,只需使用 SQL 更改 OleDb ...添加命名空间就可以了。您的代码将起作用。

标签: asp.net sql-server vb.net


【解决方案1】:

参数化查询以避免 SQL 注入,因此最佳实践是使用带参数的简单存储过程,它工作正常。

你的 C# 代码

  Protected Sub Main_Page()
        Dim con As OleDbConnection
        Dim cmd As OleDbCommand

        con = New OleDbConnection("Provider=SQLNCLI11;Data Source=ARIES-PC\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=SchoolDB")

        con.Open()
        cmd = New OleDbCommand("spSaveData", con)
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.AddWithValue("@fname", txtFirstName.Text)
        cmd.Parameters.AddWithValue("@lname", txtLastName.Text)
        cmd.Parameters.AddWithValue("@address", txtAddress.Text)
        cmd.Parameters.AddWithValue("@number", txtContact.Text)
        cmd.ExecuteNonQuery()
        cmd.Dispose()
        con.Close()
        Response.Write(<script>alert('Success!')</script>)

    End Sub

你的存储过程代码

CREATE PROCEDURE spSaveData
    @fname varchar(200),
    @lname varchar(200),
    @address varchar(300),
    @number int
AS 
BEGIN
    INSERT INTO Instructors(FirstName, LastName, Address, Contact_Number) 
    VALUES (@fname, @lname, @address, @number)
END

【讨论】:

  • 欢迎您,随时发布问题,如果有帮助,请投票回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
相关资源
最近更新 更多