簡體   English   中英

將數據表作為參數傳遞給存儲過程以執行更新

[英]Pass datatable as parameter to a stored procedure to perform update

我需要將整個表傳遞給存儲過程以運行更新查詢。

這是我的代碼:

CREATE TYPE [dbo].[UploadData] AS TABLE
(
    [CODE] [varchar](4) NULL,
    [SERIALNUMBER] [varchar](20) NULL,
    [PRODUCTCODE] [varchar](20) NULL,
    [THRESHOLD] [int] NULL  
)

這是我的存儲過程:

CREATE PROCEDURE sp_UpdateExchangeThreshold
    @TableType dbo.UploadData READONLY 

   UPDATE [dbo].[ExchangeData_20221213] 
   SET t.Threshold = tbl.THRESHOLD
   FROM [dbo].[ExchangeData_20221213] t
   INNER JOIN @TableType AS tbl ON t.ProductCode = tbl.PRODUCTCODE 
                                AND t.SerialNumber = tbl.SERIALNUMBER

在我的 VB.Net 代碼中,我有這個:

Using sqlCommand As SqlCommand = New SqlCommand()
    sqlCommand.Connection = connection
    sqlCommand.CommandText = "sp_UpdateExchangeThreshold"
    sqlCommand.CommandTimeout = 180
    sqlCommand.CommandType = CommandType.StoredProcedure

    Dim parameterList As SqlParameter = New SqlParameter("@TableType", SqlDbType.Structured)
    parameterList.Value = dataTable
    parameterList.Direction = ParameterDirection.Input
    sqlCommand.Parameters.Add(parameterList)

    sqlCommand.ExecuteNonQuery()
End Using

我無法更新記錄。 我犯了什么錯誤嗎? 請幫忙

不幸的是,.NET ADO 數據表不是 SQL Server 表類型。 他們彼此無關。 您可以將數據表與 Oracle、MySQL 或任何基於服務器的系統一起使用。 您甚至可以使用帶有數據表的訪問數據庫。

因此,數據表對象是平台不可知論者(中立的),因此不能作為 SQL 表類型傳遞。

但是,您實際上不必傳回表格。 真正的問題是你想用這張桌子做什么?

您要編輯、更新或將該表中的行插入回數據庫嗎?

如果是,則使用表適配器(這就是它們的用途)。

他們不僅會為您完成所有臟活,而且該表還可以進行更新、刪除、編輯和插入/添加。

使用一個命令,您可以一次發送整個表 + 所有編輯/更新/刪除/添加。

像這樣說:

    Dim rstHotels As New DataTable
    Using conn As New SqlConnection(My.Settings.TEST4)
        Dim strSQL As String = "SELECT * FROM tblHotelsD"
        Using cmdSQL As New SqlCommand(strSQL, conn)
            conn.Open()
            rstData.Load(cmdSQL.ExecuteReader)
            ' delete first row
            rstData.Rows(0).Delete()    ' delete first row

            rstData.Rows(2).Item("City") = "Zoo" ' edit/modify the 3rd row

            Dim OneNewRow As DataRow = rstData.NewRow

            OneNewRow("FirstName") = "First Name"
            OneNewRow("LastName") = "last Name"
            OneNewRow("HotelName") = "My Hotel Name"
            OneNewRow("Active") = True

            rstData.Rows.Add(OneNewRow)

            ' now, lets send edits/delete/inserts back to database.
            Dim da As New SqlDataAdapter(cmdSQL)
            Dim daU As New SqlCommandBuilder(da)

            da.Update(rstData)

        End Using
    End Using

現在,我按照上面的方法加載了表和更新,但它們可以單獨完成。

編輯:將數據表發送到 SQL Server,但不是所有行。

    ' so, lets "send" to the sql database some data
    Dim rstData2 As New DataTable
    rstData2.Columns.Add("HotelName", GetType(String))
    rstData2.Columns.Add("City")     ' FYI -- defualt is string 
    rstData2.Columns.Add("Active", GetType(Boolean))

    ' lets create 5 test rows of data
    For i = 1 To 5
        Dim MyNewRow As DataRow = rstData2.NewRow
        MyNewRow("HotelName") = "Hotel #" & i
        MyNewRow("City") = "City #" & i
        MyNewRow("Active") = True   ' you MUST include columnes that require deffault value
        rstData2.Rows.Add(MyNewRow)
    Next


    ' now send in one shot to database
    Using conn As New SqlConnection(My.Settings.TEST4)
        Dim strSQL As String = "SELECT ID, HotelName, City, Active FROM tblHotelsD"
        Using cmdSQL As New SqlCommand(strSQL, conn)
            conn.Open()
            Dim da As New SqlDataAdapter(cmdSQL)
            Dim daU As New SqlCommandBuilder(da)
            da.Update(rstData2)
        End Using
    End Using

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM