当前位置:编程学习 > C#/ASP.NET >>

使用 OleDbDataAdapter 更新 DataSet 无法更新,诚请各位指教 谢谢

阐述一下情况:
我自己从数据库加载了数据到一个静态DataSet中.
然后我做了一些调整以后,准备批量将DataSet中的数据更新回数据库中...
运行结果没有报错,但是数据库没有任何更新.

我在网上找了很多解决办法都不行,真的是太郁闷了....
希望大家能帮帮我, 在此感谢大家了 :)

下面是完整的源代码
/////////////////////////////////////////////////////////////////////
OleDbConnection Connection = new OleDbConnection(Kevin_Parameter.Dbs_Path); 
da=new OleDbDataAdapter();
da.SelectCommand=new OleDbCommand("select * from links",Connection);

Connection.Open(); 
da.FillSchema(Kevin_Parameter.Dir_Info_DataSet, SchemaType.Mapped);
da.Fill(Kevin_Parameter.Dir_Info_DataSet);

Kevin_Parameter.Links_Info_DataSet.Tables["links"].Rows[0][1]=true;
OleDbCmdBuilder = new OleDbCommandBuilder(da);



da.Update(Kevin_Parameter.Dir_Info_DataSet);

///////////////////////////////////////////////////////////////////////
以上代码 数据库链接没问题.就是不更新

谢谢大家了. --------------------编程问答-------------------- 上面的格式不太好看... 我重新发了一遍

OleDbConnection Connection = new OleDbConnection(Kevin_Parameter.Dbs_Path); 
da=new OleDbDataAdapter();
da.SelectCommand=new OleDbCommand("select * from links",Connection);

Connection.Open(); 
da.FillSchema(Kevin_Parameter.Dir_Info_DataSet, SchemaType.Mapped);
da.Fill(Kevin_Parameter.Dir_Info_DataSet);

Kevin_Parameter.Links_Info_DataSet.Tables["links"].Rows[0][1]=true;
OleDbCmdBuilder = new OleDbCommandBuilder(da);



da.Update(Kevin_Parameter.Dir_Info_DataSet); --------------------编程问答-------------------- Kevin_Parameter.Dir_Info_DataSet  这个就是我的那个静态DataSet --------------------编程问答-------------------- mark --------------------编程问答-------------------- 帮顶
da.Fill(Kevin_Parameter.Dir_Info_DataSet);
DbDataAdapter.Fill (DataSet)  在 DataSet 中添加或刷新行以匹配使用 DataSet 名称的数据源中的行,并创建一个名为“Table”的 DataTable。 
由 .NET Compact Framework 支持。 
 而你后来那个"link"表名??
我猜的,慢慢来 --------------------编程问答-------------------- 还是不行啊~~~

links 是表名 是我创建 DataSet 的时候设定的~~

都3天没有解决了~~~~痛苦啊!~~~~

大家帮帮我 谢谢了`~~~~~~~~~~~ --------------------编程问答-------------------- MSDN:

果在运行时动态指定 SelectCommand 属性(例如通过接受用户提供的文本命令的查询工具),可能无法在设计时指定合适的 InsertCommand、UpdateCommand 或 DeleteCommand。如果 DataTable 映射到单个数据库表或从单个数据库表生成,则可以利用 DbCommandBuilder 对象自动生成 DbDataAdapter 的 DeleteCommand、InsertCommand 和 UpdateCommand。

为了自动生成命令,必须设置 SelectCommand 属性,这是最低的要求。SelectCommand 属性所检索的表架构确定自动生成的 INSERT、UPDATE 和 DELETE 语句的语法。

为了返回构造 INSERT、UPDATE 和 DELETE SQL 命令所必需的元数据,DbCommandBuilder 必须执行 SelectCommand。因此,必须额外经历一次到数据源的行程,这可能会降低性能。若要实现最佳性能,请显式指定命令而不是使用 DbCommandBuilder。

SelectCommand 还必须返回至少一个主键或唯一列。如果不存在任何主键或唯一列,则将生成 InvalidOperation 异常,并且不会生成命令。

当与 DataAdapter 关联时,DbCommandBuilder 将自动生成 DataAdapter 的 InsertCommand、UpdateCommand 和 DeleteCommand 属性(如果它们是空引用)。如果已存在用于某属性的 Command,则将使用现有 Command。

通过联接两个或更多个表来创建的数据库视图不会被视为单个数据库表。在这种情况下,不能使用 DbCommandBuilder 自动生成命令,必须显式指定命令。有关通过显式设置命令将对 DataSet 的更新解析回数据源的信息,请参见使用 DataAdapter 更新数据源。

您可能需要将输出参数映射回 DataSet 的更新行。一项常见的任务是从数据源中检索自动生成的标识字段或时间戳的值。默认情况下,DbCommandBuilder 不会将输出参数映射到更新行中的列。在这种情况下,必须显式指定命令。有关将自动生成的标识字段映射回插入行的列的示例,请参见检索“标识”或“自动编号”值。

--------------------编程问答-------------------- private void button4_Click(object sender, EventArgs e)
        {
            string con =@" Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
            string dbname=@"\ElectronMap.mdb";
            try
            {
                this.oleDbConnection1.Close();
                this.oleDbConnection1.ConnectionString = con + Directory.GetCurrentDirectory() + dbname;
                this.oleDbConnection1.Open();

                this.oleDbDataAdapter1.SelectCommand.CommandText = "select * from AlarmType ";
                this.oleDbDataAdapter1.SelectCommand.ExecuteNonQuery();
                this.dataSet1.Clear();
                this.oleDbDataAdapter1.Fill(this.dataSet1,"AlarmType");
                this.dataGridView1.DataSource = this.dataSet1.Tables[0];
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                if (this.oleDbConnection1.State == ConnectionState.Open)
                {
                    this.oleDbConnection1.Close();
                }
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            try
            {

                this.oleDbDataAdapter1.Update(this.dataSet1,"AlarmType");
            }
            finally
            { 
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            builder = new System.Data.OleDb.OleDbCommandBuilder(this.oleDbDataAdapter1);
        }
    }

代码如上所示:自己写的,其中有一个字段必是主键或唯一列 --------------------编程问答-------------------- 谢谢楼上的 lianshaohua  兄弟.

不过可能是我没有表达清楚~~~~

我已经从数据库加载信息到一个独立创建的dataset中,然后手动修改这个dataset中的数据.
最后由于更新的数量比较多,而且没有规律可言,所以我想批量更新数据.

然后我就试图通过创建新的OleDbDataAdapter来帮助我直接更新dataset到数据库.

也就是说 我需要更新的dataset已经在OleDbDataAdapter操作之前就把数据更新完了.

然后直接更新. 这就是我想实现的.

但是我上面写的程序可以运行,但是数据库就是不更新.

希望朋友们 帮我修改下我的程序 我很着急,

不过再次感谢lianshaohua  兄弟.

--------------------编程问答-------------------- 标记一下。我也出现了同样的问题 --------------------编程问答-------------------- 建议你检查一下数据库的复制本地属性,是否是每次都拷贝,还有数据的连接字符串之类,我觉得应该这些错误的可能性比较大。。。呵呵
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,