将DataTable更新到数据库一法

本文介绍了一种不使用SqlDataAdapter和SqlCommandBuilder,而是直接从DataTable更新数据到数据库的方法。该方法支持删除、插入和更新操作,并能处理不同数据类型的字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将DataTable更新到数据库一法

 

将DataTable或DataSet更新到后台数据库,一般使用SqlDataAdapter加SqlCommandBuilder完成,下面这过程代码,是没有用上述方式,直接提取数据集中更新部分,通过语句直接更新到数据库的,使用时有许多方便之处,而且,此法还可以为关 联表查询中的更新完成提交 . 如何使用,依个人偏好啦。

Public Function DtSave(ByVal sql As String, ByVal udt As DataTable, ByVal name As String, ByVal keys As Integer) As Boolean
       '保存表数据
       Dim Tdt As New DataTable
       Dim TJcm As New SqlCommand
       TJcm.CommandType = CommandType.Text
       TJcm.Connection = hyCN
       Dim Ri As Integer
       Dim Ci As Integer
       Dim Su As String
       Dim Tu As String
       Dim Tf As String
       Dim Tv As String
       Dim Tw As String
       Dim Ts As String
       Dim Ttype As String
       Ts = ""
       Try
           '删除?
           Tdt = udt.GetChanges(DataRowState.Deleted)
           If Not IsNothing(Tdt) Then
               Tdt.RejectChanges()
               With Tdt
                   Su = "DELETE FROM [" & name & "] "
                   For Ri = 0 To .Rows.Count - 1
                       Tw = "WHERE "
                       For Ci = 0 To keys - 1
                           Tw = Tw & "[" & .Columns(Ci).ColumnName & "]='" & .Rows(Ri).Item(Ci) & "' AND "
                       Next
                       Tw = Left(Tw, Len(Tw) - 4)
                       Tu = Su & Tw
                       Ts = Ts & Tu & " " & Chr(10)
                   Next
               End With
           End If

           '追加
           Tdt = udt.GetChanges(DataRowState.Added)
           If Not IsNothing(Tdt) Then
               With Tdt
                   Su = "INSERT INTO [" & name & "] "
                   Tf = ""
                   For Ci = 0 To .Columns.Count - 1
                       Tf = Tf & "[" & .Columns(Ci).ColumnName & "],"
                   Next
                   Tf = Left(Tf, Len(Tf) - 1)
                   For Ri = 0 To .Rows.Count - 1
                       Tv = " VALUES("
                       For Ci = 0 To .Columns.Count - 1
                           Select Case .Columns(Ci).DataType.Name
                               Case "String", "Char"
                                   Tv = Tv & "'" & .Rows(Ri).Item(Ci) & "',"
                               Case "DateTime"
                                   Tv = Tv & "'" & Format(.Rows(Ri).Item(Ci), "yyyy-MM-dd") & "',"
                               Case "Boolean"
                                   Tv = Tv & IIf(IIf(.Rows(Ri).IsNull(Ci), 0, .Rows(Ri).Item(Ci)), 1, 0) & ","
                               Case "Decimal", "Double", "Int16", "Int32", "Int64", "UInt16", "UInt32", "UInt64", "Single", "Byte", "SByte"
                                   Tv = Tv & IIf(.Rows(Ri).IsNull(Ci), 0, .Rows(Ri).Item(Ci)) & ","
                           End Select
                       Next
                       Tv = Left(Tv, Len(Tv) - 1) & ")"
                       Tu = Su & "(" & Tf & ")" & Tv
                       Ts = Ts & Tu & " " & Chr(10)
                       'TJcm.ExecuteNonQuery()
                   Next
               End With
           End If

           '更改
           Tdt = udt.GetChanges(DataRowState.Modified)
           If Not IsNothing(Tdt) Then
               With Tdt
                   Su = "UPDATE [" & name & "] SET "
                   Tf = ""
                   For Ri = 0 To .Rows.Count - 1
                       Tv = ""
                       Tw = " WHERE "
                       For Ci = 0 To keys - 1
                           Tw = Tw & " [" & .Columns(Ci).ColumnName & "]='" & .Rows(Ri).Item(Ci) & "' AND "
                       Next
                       Tw = Left(Tw, Len(Tw) - 4)
                       For Ci = keys To .Columns.Count - 1
                           Tf = " [" & .Columns(Ci).ColumnName & "]="
                           Ttype = .Columns(Ci).DataType.Name
                           Select Case Ttype
                               Case "String", "Char"
                                   Tv = Tv & Tf & "'" & .Rows(Ri).Item(Ci) & "',"
                               Case "DateTime"
                                   Tv = Tv & Tf & "'" & Format(.Rows(Ri).Item(Ci), "yyyy-MM-dd") & "',"
                               Case "Boolean"
                                   Tv = Tv & Tf & IIf(IIf(.Rows(Ri).IsNull(Ci), 0, .Rows(Ri).Item(Ci)), 1, 0) & ","
                               Case "Decimal", "Double", "Int16", "Int32", "Int64", "UInt16", "UInt32", "UInt64", "Single", "Byte", "SByte"
                                   Tv = Tv & Tf & IIf(.Rows(Ri).IsNull(Ci), 0, .Rows(Ri).Item(Ci)) & ","
                           End Select
                       Next
                       Tv = Left(Tv, Len(Tv) - 1)
                       Tu = Su & Tv & Tw
                       Ts = Ts & Tu & " " & Chr(10)
                   Next
               End With
           End If
           TJcm.CommandText = Ts
           TJcm.ExecuteNonQuery()
           hyDB.DBScalar("EXEC PMLTJ '" & name & "'")
           Return True
       Catch ex As SqlException
           Throw ex
           Return False
       Catch ey As Exception
           Throw ey
           Return False
       Finally
           TJcm.Dispose()
       End Try
   End Function

转载于:https://www.cnblogs.com/kshyrj/archive/2009/07/05/1517186.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值