将DataTable更新到数据库一法

将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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值