从 sql 调用和执行存储过程到 vb.net 文本框

Posted

技术标签:

【中文标题】从 sql 调用和执行存储过程到 vb.net 文本框【英文标题】:Calling and executing a stored procedure from sql into a vb.net textbox 【发布时间】:2014-04-27 11:18:50 【问题描述】:

我在 SQL Server 中创建了以下存储过程:

CREATE Procedure CalcTotal
    @InvoiceID Varchar(4)
As
    Declare @Total int
Begin
    SELECT 
       @Total = (TransportFee + EquipmentFee + LabourFee) 
    FROM 
       Invoice 
    WHERE 
       InvoiceID = @invoiceID

    UPDATE Invoice 
    SET Total = @Total 
    WHERE InvoiceID = @invoiceID
END

我在 Visual Basic 上的表单代码是:

Imports System.Data.Sql
Imports System.Data.SqlClient
Public Class Invoice
    Dim sqlConn As New SqlConnection With .ConnectionString = "Data Source=Hamsheed;Initial Catalog=assignment;Integrated Security=True"
    Dim sqlstr As String = "Select * From Invoice"
    Dim MaxRows As Integer
    Dim RowIndex As Integer = 0
    Dim dt As New DataTable



    Private Sub Invoice_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim DataAdapter As New SqlDataAdapter(sqlstr, sqlConn)
        DataAdapter.Fill(dt)
        DataAdapter.Dispose()
        MaxRows = dt.Rows.Count
        InvoiceDetails()
        cmbSearch.DataSource = dt
        cmbSearch.DisplayMember = "FirstName"

    End Sub

    Sub InvoiceDetails()

        txtInvoiceID.Text = CStr(dt.Rows(RowIndex)("InvoiceID"))
        txtClientID.Text = CStr(dt.Rows(RowIndex)("ClientID"))
        txtEmployeeID.Text = CStr(dt.Rows(RowIndex)("EmployeeID"))
        txtFillInDate.Text = CStr(dt.Rows(RowIndex)("FillInDate"))
        txtTransportFee.Text = CStr(dt.Rows(RowIndex)("TransportFee"))
        txtEquipmentFee.Text = CStr(dt.Rows(RowIndex)("EquipmentFee"))
        txtLabourFee.Text = CStr(dt.Rows(RowIndex)("LabourFee"))
        txtTotal.Text = CStr(dt.Rows(RowIndex)("Total"))
    End Sub

    Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click


        Dim InvoiceID As String = txtInvoiceID.Text
        Dim ClientID As String = txtClientID.Text
        Dim EmployeeID As String = (txtEmployeeID.Text)
        Dim FillInDate As Date = CDate(txtFillInDate.Text)
        Dim TransportFee As Integer = CInt(txtTransportFee.Text)
        Dim EquipmentFee As Integer = CInt(txtEquipmentFee.Text)
        Dim LabourFee As Integer = CInt(txtLabourFee.Text)
        Dim Total As Integer = CInt(txtTotal.Text)




        If CStr(dt.Rows(RowIndex)("paymentmethod")) = "Card" Then

            radCard.Select()

        ElseIf CStr(dt.Rows(RowIndex)("paymentmethod")) = "Cash" Then
            radCash.Select()

        Else
            radCredit.Select()
        End If


        Dim sqlQuery As String = ("Exec Insert_Invoice @InvoiceID = ' " & InvoiceID & " ', @ClientID = '" & ClientID & "',@EmployeeID ='" & EmployeeID & "', @FillInDate ='" & FillInDate & "',@TransportFee='" & TransportFee & "',@EquipmentFee = '" & EquipmentFee & "',@LabourFee= '" & LabourFee & "',@Total= '" & Total)

        Dim sqlcmnd As New SqlCommand(sqlQuery, sqlConn)

        Try
            sqlConn.Open()
            Dim changes As Integer = sqlcmnd.ExecuteNonQuery()
            sqlConn.Close()
            MessageBox.Show(changes & "Changes Made")

        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        Save()

    End Sub


    Private Sub btnEdit_Click(sender As Object, e As EventArgs) Handles btnEdit.Click
        dt.Rows(RowIndex)("InvoiceID") = CStr(txtInvoiceID.Text)
        dt.Rows(RowIndex)("ClientID") = CStr(txtClientID.Text)
        dt.Rows(RowIndex)("EmployeeID") = CStr(txtEmployeeID.Text)
        dt.Rows(RowIndex)("FillInDate") = CStr(txtFillInDate.Text)
        dt.Rows(RowIndex)("TransportFee") = CStr(txtTransportFee.Text)
        dt.Rows(RowIndex)("EquipmentFee") = CStr(txtEquipmentFee.Text)
        dt.Rows(RowIndex)("LabourFee") = CStr(txtLabourFee.Text)
        dt.Rows(RowIndex)("Total") = CStr(txtTotal.Text)
        Dim sqlquery As String = "exec edit_invoice '" & txtInvoiceID.Text & "', " & txtLabourFee.Text & ", " & txtTransportFee.Text & ", " & txtEquipmentFee.Text & ", '" & txtpaymentMethod.Text & "', '" & txtClientID.Text & "', '" & txtEmployeeID.Text & "', '" & txtFillInDate.Text & "', '" & txtTotal.Text & "'"

        Dim sqlcmnd As New SqlCommand(sqlquery, sqlConn)

        Try
            sqlConn.Open()
            Dim changes As Integer = sqlcmnd.ExecuteNonQuery()
            sqlConn.Close()
            MessageBox.Show(changes & "Changes Made")

        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        Save()

    End Sub

    Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
        txtInvoiceID.Clear()
        txtClientID.Clear()
        txtEmployeeID.Clear()
        txtFillInDate.Clear()
        txtTransportFee.Clear()
        txtEquipmentFee.Clear()
        txtLabourFee.Clear()
        txtTotal.Clear()



    End Sub

    Private Sub btnNext_Click(sender As Object, e As EventArgs) Handles btnNext.Click
        If RowIndex <> MaxRows - 1 Then
            RowIndex += 1
            InvoiceDetails()
        End If
    End Sub

    Private Sub btnLast_Click(sender As Object, e As EventArgs) Handles btnLast.Click
        RowIndex = MaxRows - 1
        InvoiceDetails()

    End Sub


    Private Sub btnMainMenu_Click(sender As Object, e As EventArgs) Handles btnMainMenu.Click
        SecretaryMainMenu.Show()
        Me.Hide()


    End Sub

    Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click

        Dim invoiceID As String = txtInvoiceID.Text
        Dim SqlQuery As String = ("EXECUTE Delete_Invoice @InvoiceID = '" & InvoiceID & "'")
        Dim cmd As New SqlCommand(SqlQuery, sqlConn)
        Try
            sqlConn.Open()
            Dim changes As Integer = cmd.ExecuteNonQuery()
            sqlConn.Close()
            MessageBox.Show(changes & "Record Deleted")

        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        Save()

        dt.Rows(RowIndex).Delete()

    End Sub

    Sub Save()

        Dim dataAdapter As New SqlDataAdapter(sqlstr, sqlConn)
        Dim commandbuilder As New SqlCommandBuilder(dataAdapter)
        dataAdapter.Update(dt)
        dataAdapter.Dispose()

    End Sub

    Private Sub btnFind_Click(sender As Object, e As EventArgs) Handles btnFind.Click
        Dim searchitem As String = InputBox("Input Search invoice ID: ", "Search by ID")
        Dim sresult As Boolean = False
        searchitem = searchitem.Trim.ToUpper

        For i As Integer = 0 To MaxRows - 1
            If CStr(dt.Rows(i)("invoiceid")).ToUpper = searchitem Then
                sresult = True
                RowIndex = i
                InvoiceDetails()
            End If
        Next

        If sresult = False Then
            MsgBox("No result found", MsgBoxStyle.OkOnly, "Information")
        End If
    End Sub

    Private Sub txtinvoice_validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtInvoiceID.Validating
        If Not txtInvoiceID.Text Like "I###" Then
            e.Cancel = True
            ErrorProvider1.SetError(txtInvoiceID, "Improper ID format")

        End If
    End Sub

    Private Sub txtinvoice_validated(ByVal sender As Object, ByVal e As EventArgs) Handles txtInvoiceID.Validated
        ErrorProvider1.SetError(txtInvoiceID, "")
    End Sub
End Class

现在我想将存储过程调用到文本框Total中,它将计算'transportFee,EquipmentFee和Labourfee'成本,并将总计显示到txtTotal.Text的文本框中

如何编写这段代码?

【问题讨论】:

欢迎使用 ***:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ( ) 在编辑器工具栏上以很好地格式化和语法突出显示它! 我不认为这个问题表明什么问题是什么,并且它已经被放弃了,所以我建议它被搁置。 【参考方案1】:

使用执行标量:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar(v=vs.110).aspx

记得将命令的commandtype属性设置为存储过程

【讨论】:

以上是关于从 sql 调用和执行存储过程到 vb.net 文本框的主要内容,如果未能解决你的问题,请参考以下文章

在 VB.NET 中从 SQL Server 执行存储过程?

如何使用 VB.NET 配置 DataAdapter 以使用 Sql Server 存储过程执行 Select、Update、Insert 和 Delete 命令?

如何将输出参数从 vb.net 传递到 mysql 存储过程?

调用 SQL Server 存储过程的 SqlCommand 超时

从 VB.NET 调用 Oracle 过程仅在前 2 次有效

从 Sql Server 检索照片到 asp.net 和 Vb.net