【问题标题】:Prepared Statements in VB.NETVB.NET 中的准备语句
【发布时间】:2011-11-13 03:33:16
【问题描述】:

我是 vb.net 和 Microsoft SQL Server 2008 中准备好的语句的新手。我真的找不到任何好的资源来通过连接字符串连接到数据库并执行准备好的语句。有人可以给我看一个例子或指出一个可能有用的资源吗?

【问题讨论】:

    标签: sql database vb.net prepared-statement


    【解决方案1】:
    Dim datOleReader As SqlDataReader
    ' Public con As New SqlConnection
    
    Public Function CHECK_CONNECTION(ByVal CON As SqlConnection) As SqlConnection
        Try
            If CON.State = ConnectionState.Broken Or CON.State = ConnectionState.Closed Then
                CON.Open()
            End If
        Catch ex As Exception
            CON.Close()
            CON.Open()
        End Try
    
        Return CON
    End Function
    
    Public Function gGetMaxCode(ByVal strTable As String, ByVal strCode As String) As Long
        Dim cmdtext As New SqlCommand
        Try
            '  con = clsexe.CHECK_CONNECTION(con) #
            ' cmdtext.Connection = con #
            cmdtext.Connection = CHECK_CONNECTION(con) ' #
            cmdtext.CommandText = "SELECT ISNULL(MAX(" & strCode & "),0)+1 FROM  " & strTable
            datOleReader = cmdtext.ExecuteReader(CommandBehavior.SingleRow)
            datOleReader.Read()
            If datOleReader.IsDBNull(0) Then
                Return 1
            Else
                Return datOleReader.Item(0)
            End If
    
        Catch ex As Exception
            MsgBox(ex.Message.ToString)
        Finally
            datOleReader.Close()
        End Try
    End Function
    Public Function gGetMaxCode(ByVal strTable As String, ByVal strCode As String, ByVal trans As SqlTransaction) As Long
        Dim cmdtext As New SqlCommand
        Try
            '  con = clsexe.CHECK_CONNECTION(con) #
            ' cmdtext.Connection = con #
            cmdtext.Connection = CHECK_CONNECTION(con) ' #
            cmdtext.CommandText = "SELECT ISNULL(MAX(" & strCode & "),0)+1 FROM  " & strTable
            cmdtext.Transaction = trans
            datOleReader = cmdtext.ExecuteReader(CommandBehavior.SingleRow)
            datOleReader.Read()
            If datOleReader.IsDBNull(0) Then
                Return 1
            Else
                Return datOleReader.Item(0)
            End If
    
        Catch ex As Exception
            Throw ex
        Finally
            datOleReader.Close()
        End Try
    End Function
    
       Public Function ExecuteQry(ByVal qry As String) As Boolean
        Dim cmdtext As New SqlCommand
        Try
            'con = cls.cnn #
            'cmdtext.Connection = con #
            cmdtext.Connection = CHECK_CONNECTION(con) ' #
            cmdtext.CommandText = qry
            cmdtext.CommandType = CommandType.Text
            cmdtext.ExecuteNonQuery()
            cmdtext.Dispose()
            cmdtext = Nothing
            ErrCode = True
        Catch ex As Exception
            'gErrMsg()
            ErrCode = False
            MsgBox(ex.Message.ToString)
        Finally
            'con.Close()
        End Try
    End Function
    Public Function ExecuteQry(ByVal qry As String, ByVal trans As SqlTransaction) As Boolean
        Dim cmdtext As New SqlCommand
        Try
            'con = cls.cnn #
            'cmdtext.Connection = con #
            cmdtext.Connection = CHECK_CONNECTION(con) ' #
            cmdtext.CommandText = qry
            cmdtext.CommandType = CommandType.Text
            cmdtext.Transaction = trans
            cmdtext.ExecuteNonQuery()
            cmdtext.Dispose()
            cmdtext = Nothing
        Catch ex As Exception
            Throw ex
            'gErrMsg()
            MsgBox(ex.Message.ToString)
        Finally
            'con.Close()
        End Try
    End Function
    
    
    Public Function ExecuteSelect(ByVal qry As String, ByVal trans As SqlTransaction) As SqlDataReader
    
        Dim cmdtext As New SqlCommand
        Try
            'con = cls.cnn #
            'cmdtext.Connection = con #
            cmdtext.Connection = CHECK_CONNECTION(con) ' #
            cmdtext.CommandText = qry
            cmdtext.CommandType = CommandType.Text
            cmdtext.Transaction = trans
            ExecuteSelect = cmdtext.ExecuteReader()
            Return ExecuteSelect
            cmdtext.Dispose()
            cmdtext = Nothing
    
        Catch ex As Exception
            Throw ex
            'MsgBox(ex.Message.ToString)
        Finally
            'clsexe.ExecuteSelect.Close()
            'con.Close()
        End Try
    End Function
    
    
    Public Function Executescalar(ByVal qry As String, ByVal trans As SqlTransaction)
    
        Dim cmdtext As New SqlCommand
        Try
            'con = cls.cnn #
            'cmdtext.Connection = con #
            cmdtext.Connection = CHECK_CONNECTION(con) ' #
            cmdtext.CommandText = qry
            cmdtext.CommandType = CommandType.Text
            cmdtext.Transaction = trans
            Executescalar = cmdtext.ExecuteScalar
            cmdtext.Dispose()
            cmdtext = Nothing
    
        Catch ex As Exception
            Throw ex
            ' MsgBox(ex.Message.ToString)
        Finally
            ' con.Close()
        End Try
    
    End Function
    
    
    Public Function ExecuteAdapter(ByVal qry As String, ByVal trans As SqlTransaction) As SqlDataAdapter
        Dim cmdtext As New SqlCommand
        Dim da As New SqlDataAdapter
        Try
            'con = cls.cnn #
            'cmdtext.Connection = con
            cmdtext.Connection = CHECK_CONNECTION(con) ' #
            cmdtext.CommandTimeout = 0
            cmdtext.CommandText = qry
            cmdtext.Transaction = trans
            cmdtext.CommandType = CommandType.Text
            da.SelectCommand = cmdtext
            Return da
            cmdtext.Dispose()
            cmdtext = Nothing
        Catch ex As Exception
            Throw ex
            'MsgBox(ex.Message.ToString)
        Finally
            ' con.Close()
        End Try
    End Function
    
    
    Public Function Executedataset(ByVal qry As String) As DataSet
        Dim cmdtext As New SqlCommand
        Dim ds As New DataSet
        Dim da As New SqlDataAdapter
        Try
            'con = cls.cnn #
            'cmdtext.Connection = con #
            cmdtext.Connection = CHECK_CONNECTION(con) ' #
            cmdtext.CommandText = qry
            cmdtext.CommandType = CommandType.Text
            da.SelectCommand = cmdtext
            da.Fill(ds)
            cmdtext.Dispose()
            cmdtext = Nothing
        Catch ex As Exception
            MsgBox(ex.Message.ToString)
        End Try
    End Function
    
    Public Function ExecuteProcedure(ByVal qry As String) As Boolean
        Dim cmdtext As New SqlCommand
        Try
            'con = cls.cnn #
            'cmdtext.Connection = con #
            cmdtext.Connection = CHECK_CONNECTION(con) ' #
            cmdtext.CommandText = qry
            cmdtext.CommandType = CommandType.StoredProcedure
            cmdtext.ExecuteNonQuery()
            cmdtext.Dispose()
            cmdtext = Nothing
        Catch ex As Exception
            MsgBox(ex.Message.ToString)
        End Try
    End Function
    

    【讨论】:

    • 你能在这里添加更多细节吗?虽然我可以欣赏这个例子,但对一些片段的解释会很好。
    【解决方案2】:

    这里有一些简单的示例代码:

    Using cn  As New SqlConnection("your connection string here"), _
          cmd AS New SqlCommand("SELECT * FROM Table WHERE ID= @ID", cn)
    
        cmd.Parameters.Add("@ID", SqlDbType.Int).Value = 12345
    
        cn.Open()
        Using rdr As SqlDataREader = cmd.ExecuteReader()
            While rdr.Read()
                'Do something with the record
            End While
            rdr.Close()
        End Using
    End Using
    

    当然需要导入 System.Data 和 System.Data.SqlClient。

    【讨论】:

      【解决方案3】:

      准备好的语句只不过是包含在事务中的参数化 SqlCommand。

      例如,这是一个Prepared Statement:

      Using c As New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)
         c.Open()
      using mytransaction = c.BeginTransaction()
      
         Dim command = New SqlCommand("INSERT INTO yourtable(image) values (@image)", c)
         ''# this is specific to the FileUploadControl but the idea is to get the
         ''#image in a byte array; however you do it, it doesn't matter
          Dim buffer(FileUpload1.PostedFile.ContentLength) As Byte
          FileUpload1.PostedFile.InputStream.Read(buffer, 0, buffer.Length)
          command.Parameters.AddWithValue("@image", buffer)
          command.ExecuteNonQuery()    
       mytransaction .Commit()
      End Using
      End Using
      

      【讨论】:

      • 对不起,但是……我相信你错了?它们不需要事务,并且在允许服务器重用执行计划方面具有优势。 msdn.microsoft.com/en-us/library/…
      • @Basic 您描述的是存储过程。虽然所有存储过程都是预准备语句,但并非所有预准备语句都是存储过程。
      • @DavidSöderlund 我都知道(事实上,我链接的文档讨论了这两个)。我试图说明的一点是,Icarus 的回答似乎并不准确,例如我可以编译一个准备好的语句,允许服务器构建一个执行计划,然后多次重复使用它。这个答案完全省略了这种模式。
      • 另外,AddWithValue() 也有一些严重的缺点。最好使用带有显式类型信息的 Add() 重载。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多