OleDbDataAdapter.update进行更新数据库的问题??求助!

lanlanq 2007-04-12 04:11:53
第一种方式,一个dataset和并另一个dataset,提示"无法找到TableMapping[Table]或DataTable"

private bool writeTowDataSetAccess(string tablename, string dataepath, OleDbConnection con01)
{
bool bl = false;
//定义第二个数据库连接
OleDbConnection conn = null;
//OleDbCommand comm = null;
OleDbDataAdapter oleda02 = null;
//定义第一个数据库连接
OleDbDataAdapter oleda01 = null;
DataSet ds = null;
DataSet ds02 = null;
try
{
//第一个数据库写入datagrid

oleda01 = new OleDbDataAdapter("select * from " + tablename, con01);
ds = new DataSet();
//dataGrid.DataSource = ds;
oleda01.Fill(ds);
//dataGrid.Refresh();

//另一个数据库连接

//创建第二个连接
if (conn != null) conn.Close();
conn = ModelUtility.getAccessConnection();
//创建第二个数据集
oleda02 = new OleDbDataAdapter();
oleda02.SelectCommand = new OleDbCommand("select * from " + tablename, conn);
OleDbCommandBuilder builder = new OleDbCommandBuilder(oleda02);
//打开连接
conn.Open();
//创建第二个dataset,填充dataset
ds02 = new DataSet();
oleda02.Fill(ds02);

//把第一个dataset和第二个合并
ds02.Merge(ds, true, MissingSchemaAction.Add);



//conn.Open();
//comm = new OleDbCommand("select * from " + tablename, conn);
//oleda02 = new OleDbDataAdapter("select * from " + tablename, conn);
//oleda02.SelectCommand = comm;
//OleDbCommandBuilder oledbcb = new OleDbCommandBuilder(oleda02);
////创建第二个dataset
//ds02 = new DataSet();//建立DataSet对象
//oleda02.Fill(ds02);

////把第一个dataset和第二个合并
//ds02.Merge(ds, true, MissingSchemaAction.Add);

//开始写入
label5.Text = "开始写入表:" + tablename;
oleda02.TableMappings.Add(tablename, tablename);
//更新操作
builder.RefreshSchema();
builder.GetUpdateCommand();
oleda02.Update(ds02, tablename);
ds02.AcceptChanges();
label5.Text = "表:[" + tablename + "]写入成功!";

bl = true;
}
catch (Exception ex)
{
bl = false;
MessageBox.Show(ex.Message.ToString());
}
finally
{
if (oleda01 != null)
oleda01.Dispose();
if (oleda02 != null)
oleda02.Dispose();
if (ds != null)
ds.Dispose();
conn.Dispose();
conn.Close();
}
return bl;
}
...全文
850 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
shoushii 2007-05-07
  • 打赏
  • 举报
回复
mark
htjuw 2007-05-07
  • 打赏
  • 举报
回复
首先感谢zhzuo(秋枫) 的提示

for (i = 0; i < ds1.Tables["t1"].Rows.Count; i++)
{

ds1.Tables["t2"].ImportRow(ds1.Tables["t1"].Rows[i]);
//ds1.Tables["t2"].Rows[i].SetAdded();
}

我之前这样更新数据,没有在导入后变更该行的RowState状态,结果出现了和搂住一样的问题,可参阅http://community.csdn.net/Expert/topic/5505/5505298.xml?temp=8.220851E-03
之后把上述代码中的注释去掉就可以如期望一样写回数据库了

gis_yifan 2007-05-02
  • 打赏
  • 举报
回复
只设置主键还不行,还要将主键这一列显示出来才行,就是返回值必须有主键这一列。
marvelstack 2007-05-01
  • 打赏
  • 举报
回复
出现问题的很大原因如下:
1.使用OleDbCommandBuilder生成的的更新代码是不是会有问题。
2.DataSet.Merge方式,它又多个重载方式。
3.确认是否对DataSet中的数据进行了修改,又就是说DataRowState发生了改变。

强烈建议楼主设置断点进行单部调试,应该会比较容易发现问题。

htjuw 2007-04-30
  • 打赏
  • 举报
回复
和我碰到一样的问题
lanlanq 2007-04-29
  • 打赏
  • 举报
回复
这么长时间,有没有会的,帮忙给解决以下
lanlanq 2007-04-18
  • 打赏
  • 举报
回复
这个问题有没有朋友解决的,请帮忙解决以下
yuanwhfly 2007-04-13
  • 打赏
  • 举报
回复
我的也是,merge之后,如果直接将合并结果用一个datagridview显示出来,明明看到合并到一块了,可是数据库死活就是更新不进去,而且也不出错.
lanlanq 2007-04-12
  • 打赏
  • 举报
回复
那我的怎么还是不行,不抱错,就是数据库不变,郁闷
chmodyou 2007-04-12
  • 打赏
  • 举报
回复
using (SqlConnection connection =
new SqlConnection(connectionString))
{
SqlDataAdapter adapter =
new SqlDataAdapter(
"SELECT CustomerID, CompanyName FROM dbo.Customers",
connection);

connection.Open();

DataSet customers = new DataSet();
adapter.FillSchema(customers, SchemaType.Source, "Customers");
adapter.Fill(customers, "Customers");

DataSet orders = new DataSet();
orders.ReadXml("Orders.xml", XmlReadMode.ReadSchema);
orders.AcceptChanges();

customers.Merge(orders, true, MissingSchemaAction.AddWithKey);

jiatong1981 2007-04-12
  • 打赏
  • 举报
回复
不了哦 我都这么做的怎么没问题呢

oleda02.Update(datainfoDataSet);


…………

datainfoDataSet.AcceptChanges();
lanlanq 2007-04-12
  • 打赏
  • 举报
回复
还是一样没有变化
jiatong1981 2007-04-12
  • 打赏
  • 举报
回复
直接调用ds.AcceptChanges();试一下
lanlanq 2007-04-12
  • 打赏
  • 举报
回复
都有主健
jiatong1981 2007-04-12
  • 打赏
  • 举报
回复
使用OleDbCommandBuilder 数据表必须有主键。

lanlanq 2007-04-12
  • 打赏
  • 举报
回复
请大家帮帮我,已经困惑好几天了
lanlanq 2007-04-12
  • 打赏
  • 举报
回复
这种方式行不通,我采用第二种方式,就是打开一个dataset直接更新到第二个数据库。
执行正常,可是数据库没有更新。然后我查看dataset里面有内容。可是数据库没有变化
private bool writeDataSetAccess(string tablename, string dataepath)
{
bool bl = false;
//定义第二个数据库连接
OleDbConnection conn = null;
OleDbDataAdapter oleda02 = null;
try
{

//先把原先数据库连接属性值放入全局属性中
this.connString = cwsoft.Properties.Settings.Default.cDatabaseConnectionString.ToString();
//更新数据库连接属性值
cwsoft.ModelUtility.eidtSettingDatabase(dataepath);

cwsoft.datainfoDataSetTableAdapters.TBL_BMTableAdapter tBL_BMTableAdapter = new cwsoft.datainfoDataSetTableAdapters.TBL_BMTableAdapter();

datainfoDataSet datainfoDataSet = new cwsoft.datainfoDataSet();
tBL_BMTableAdapter.Fill(datainfoDataSet.TBL_BM);

//创建第二个连接
if (conn != null) conn.Close();
conn = ModelUtility.getAccessConnectionAll(connString);
//创建第二个数据集
oleda02 = new OleDbDataAdapter();
oleda02.SelectCommand = new OleDbCommand("select * from " + tablename, conn);
OleDbCommandBuilder builder = new OleDbCommandBuilder(oleda02);
MessageBox.Show(datainfoDataSet.TBL_BM.Rows[0][3].ToString());
//打开连接
conn.Open();
//开始写入
label5.Text = "开始写入表:" + tablename;
//oleda02.TableMappings.Add(tablename, tablename);
//更新操作
builder.RefreshSchema();
builder.GetUpdateCommand();
oleda02.Update(datainfoDataSet,tablename);
datainfoDataSet.Tables[tablename].AcceptChanges();
label5.Text = "表:[" + tablename + "]写入成功!";

bl = true;
}
catch (Exception ex)
{
bl = false;
MessageBox.Show(ex.Message.ToString());
}
finally
{
if (oleda02 != null)
oleda02.Dispose();
conn.Dispose();
conn.Close();
cwsoft.ModelUtility.eidtSettingDatabase(this.connString);
}
return bl;

}
本文介绍C#访问操作Access数据库的基础知识,并提供一个相关的例程。 1.通过ADO.NET的OleDb相关类来操作Access 主要知识点如下: using System.Data.OleDb; using System.Data; 连接字符串:String connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=product.mdb"; 建立连接:OleDbConnection connection = new OleDbConnection(connectionString); 使用OleDbCommand类来执行Sql语句: OleDbCommand cmd = new OleDbCommand(sql, connection); connection.Open(); cmd.ExecuteNonQuery(); 2.取得Access自增标识字段在插入数据后的id值 cmd.CommandText = @"select @@identity"; int value = Int32.Parse(cmd.ExecuteScalar().ToString()); return value; 3.执行事务 需要用到OleDbTransaction,关键语句如下: OleDbConnection connection = new OleDbConnection(connectionString); OleDbCommand cmd = new OleDbCommand(); OleDbTransaction transaction = null; cmd.Connection = connection; connection.Open(); transaction = connection.BeginTransaction(); cmd.Transaction = transaction; cmd.CommandText=sql1; cmd.ExecuteNonQuery(); cmd.CommandText=sql2; cmd.ExecuteNonQuery(); transaction.Commit(); 4.执行查询,返回DataSet OleDbConnection connection = new OleDbConnection(connectionString); DataSet ds = new DataSet(); connection.Open(); OleDbDataAdapter da = new OleDbDataAdapter(sql, connection); da.Fill(ds,"ds"); 5.分页查询 分页查询使用OleDbDataReader来读取数据,并将结果写到一个DataSet中返回。 以上内容封装为三个可重用的类:AccessDBUtil,AccessPageUtil,Page 代码这里下载AccessDBUtilDemo.rar (191.37 KB , 下载:999次) 本例程是一个c#的winform程序,但是数据访问类可以在Web环境下使用。 本例程演示了: 1.Access数据库的插入,更新,修改,查询; 2.带参数的sql语句的使用,而不是拼SQL; 3.使用DataReader的分页查询,而不是用嵌套的SQL语句来分页; 4.用事务同时执行多个SQL语句; 5.在插入数据的同时返回最新的ID值; 6.整型,实型,字符串,日期型,布尔型五种数据类型的操作; 7.使用正则表达式来验证整数和实数; 8.listview用来显示数据的一些基本用法。 本示例不包括: 1.高效的分页查询,仅仅是提供了一种分页的方法,但我认为DataReader应该比嵌套的SQL语句快(未测试)。 2.完善的分页封装,只提供了分页的简单包装。 3.嵌套的事务处理,提供了同时执行多个sql语句的事务处理,但不支持嵌套事务。 4.listview的使用,只是利用winform控件来演示数据访问,因此不能作为winform编程的良好示例,例如添加数据时界面并没有很好地更新

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧