求DataSet更新数据库的完整示例


大家好: 有个一直困扰我的问题:

将DataTable的数据更新到数据库:
现在采用的办法是:先采用SQL + cmd.ExecuteNonQuery()把整个数据库记录全部删除
然后再采用DataTable 的Update方法更新数据库,因为这样不会报错, 但受不了这种做法,请帮忙看看这段代码,目的是:

在不删除记录的前提下使用 Update 方法,已上传附件(VB2008)  
邮箱:457878#163.com
.




Option Strict On
Option Explicit On

Imports System.Data.OleDb

'Adaptor操作类
Public Class cAdaptor

    Private m_fName As String = Application.StartupPath & "\SMBus.mdb"
    Private m_ds As New DataSet         '待填充和操作的数据集
    Private m_da As New OleDbDataAdapter
    Public m_table As DataTable
    Private m_tbName As String = "Factory"

    '测试程序1
    Public Sub TestUpdate1()
        Create_a_Adaptor(m_tbName)                                                  '创建一个适配器
        m_ds.Tables(m_tbName).Rows(0).Item("FactName") = "Girl_03" & 10 * Rnd()     '修改内容
        UpdateTable(m_tbName)                                                       '★★★ 若删除主键,则这里通不过 Why ?? 
    End Sub

    '测试程序2
    Public Sub TestUpdate2()
        m_table = Create_a_Adaptor(m_tbName)
        m_table.Clear()                     '清除DataTable(有效)
        'm_ds.Tables(m_tbName).Clear()      '清除DataTable(无效)
        UpdateTable(m_tbName)
    End Sub

    Public Sub TestUpdate3()
        m_table = Create_a_Adaptor(m_tbName)
        m_table.Clear()

        Dim row As DataRow
        Dim lsv As ListViewItem

        For Each lsv In Form1.ListView1.Items '遍历listview控件,填充DataTable
            row = m_table.NewRow()
            row.Item("FactNo") = lsv.Index
            row.Item("FactName") = lsv.Text
            m_table.Rows.Add(row)
        Next
        PrintTable(m_table)

        UpdateTable(m_tbName)
    End Sub

    '更新 1 个数据表
    Private Function UpdateTable(ByVal m_tbName As String) As Boolean

        'cDBOP.DBOperate("delete * from " & m_tbName)   '★★★ 注释掉就出错,"主关键字,索引......" Why ?? 
        m_da.Update(m_ds.Tables(m_tbName))              '★★★ 若删除数据库的主键,可以通过,但数据添加到记录的尾部,而不是更新, Why ?? 
        m_ds.Tables(m_tbName).AcceptChanges()
    End Function

    '创建 1 个数据表和相应的DataAdaptor
    Private Function Create_a_Adaptor(ByVal m_tbName As String) As DataTable
        Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & m_fName)
        m_da = New OleDbDataAdapter("select * from " & m_tbName, cn)
        Dim cb As New OleDbCommandBuilder(m_da)
        cn.Open()
        m_da.Fill(m_ds, m_tbName)
        cn.Close()
        m_ds.Tables(m_tbName).TableName = m_tbName
        Return m_ds.Tables(m_tbName)
    End Function


End Class

6 个解决方案

#1


更新出错是因为冲突吧?你得先找找为什么冲突.是因为并发操作吗? 如果是并发,就没有别的办法

#2


用自带的UpdateDataSet语句

  
stringBuilder strSql=new stringBuilder ();
                    strSql.Append("update table1 set A=@a,");
                    strSql.Append("B=@b,");
                    strSql.Append("C=@c");                              
                    strSql.Append(" WHERE id=@id");

              
                    string sqlUpdate = strSql.ToString();
                    DbCommand cbInfoUpdate = db.GetSqlStringCommand(sqlUpdate);
                    db.AddInParameter(cbInfoUpdate , "@A", DbType.String, "A", DataRowVersion.Current);
                    db.AddInParameter(cbInfoUpdate , "@b", DbType.String, "b", DataRowVersion.Current);
                    db.AddInParameter(cbInfoUpdate , "@c", DbType.String, "c", DataRowVersion.Current);
                     db.AddInParameter(cbInfoUpdate , "@id", DbType.String, "id", DataRowVersion.Current);
 db.UpdateDataSet(数据源, "表", insert语句, update语句, Delete语句, 事物);

#3


你需要做的只是做相应的操作语句的定义就行了.象我例子中给了update语句的定义!

#4


mqcan, 没看懂:
cbInfoUpdate = db.GetSqlStringCommand(sqlUpdate);//是创建更新字符串?如何实现?

拜托贴点源码出来...或发到我邮箱,有分相赠!!

#5


非要以整个datatable为单位吗?
我见过的都是循环每一行数据,一条条的更新。

#6


是RowState的问题。
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告