高分解决dataset更新数据库问题

wf20032723 2009-03-28 01:40:15
各位大虾,小弟用c#(不是asp.net,是form)写了个程序,就是一个access中有数据,我使用dataset1把数据提出来了,如何更新数据库啊,最好是用olecommend,因为我是批量更改,(不能通过绑定datagird更新),我看了网上好多人提问,感觉好像都不是写的很清楚哈,最好是能给点代码,谢谢了
...全文
242 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wf20032723 2009-03-30
  • 打赏
  • 举报
回复
非常感谢王哥,你加我qq,我想我们认识下,做个朋友
POWER_WONG 2009-03-30
  • 打赏
  • 举报
回复
兄弟,我终于查出你的是什么问题了,主要是数据库的列名问题,我看到你的wf表中有一个名为1的列
所以在编辑时,比如你的代码:
DataRow dr = ds.Tables[0].Rows[0];
dr.BeginEdit();
dr["1"]=333;
dr.EndEdit();
da.Update(ds);

这段代码中dr["1"]=333可能同时指向第二列,因为第二列有两种表示方式dr[1]或dr["1"]都可以,程序会认为你同时编辑这一列就会出现并发冲突的问题,建议你把数据表的第二列的列名另外改一个名称,应该就可以了,我试过了,以后也少用这样的列名。
jietuan 2009-03-30
  • 打赏
  • 举报
回复
你循环datatable的时候,判断datarow有没有被更新过,如果有就用ado.net update,否则就忽略!
jlj84237485 2009-03-30
  • 打赏
  • 举报
回复
帮顶一下
wf20032723 2009-03-30
  • 打赏
  • 举报
回复
王哥,我已经把代码发给你了,麻烦帮我看看,呵呵,谢谢
POWER_WONG 2009-03-30
  • 打赏
  • 举报
回复
DataTable dt = this.dataset1.Tables[0]; //dataset1是我新设立的一个DataSet,取的是excel里面的数据
这个也要注意和上面一样的问题,如果已经读取过数据就要将它的数据清除再读新的。
POWER_WONG 2009-03-30
  • 打赏
  • 举报
回复
兄弟,还有个地方你要注意啊:你在代码中写到:
private void FormMain_Load(object sender, EventArgs e)
{
string file_name = Application.StarupPath + @"\test.mdb"; //本地数据库在bin里面
string password = "123";
string ConnectionString = string.Format("Provider=Microsoft.JET.OLEDB.4.0;Data Source='{0}';Persist Sercurity Info=false; JET OLEDB:Database Password={1}", file_name, password);
conn = new OleDbConnection(ConnectionString);
string sql = "SELECT * FROM test";//test为表名
da = new OleDbDataAdapter(sql, conn);
ds = new DataSet();
da.Fill(ds);
cb = new OleDbCommandBuilder(da);
}


标红色粗体部分你这是在窗体加载时显示全部的数据,这个没有必要,而且速度也会很慢的,如果你是想导入数据的话就直接用:string sql="SELECT * FROM test WHERE 1=2";这样就会返回一个空行的数据集,里面就没有数据,如果导入成功后再导入另个一个excel档案就要清除ds里面的内容,否则会出现数据重复的问题(因为之前ds已经读取一个档案的数据,且这个档案的内容已经导入到数据库,再次导入肯定会出现主键冲突的问题)ds.Tables["表名"].Rows.Clear()应该就可以了
POWER_WONG 2009-03-30
  • 打赏
  • 举报
回复
或者你试下以下代码:
if (ds!= null && ds.Tables.Count > 0)
{
ds.Tables["表名"].Rows.Clear();
//ds.Tables.Clear();
}
POWER_WONG 2009-03-30
  • 打赏
  • 举报
回复
这样吧,你不要用ds.Clear(),用ds.Tables[0].Rows.Clear()就会清除相应的数据行,里面就不会有数据了,如果是用ds.Clear()会清除所有的表数据的。
POWER_WONG 2009-03-30
  • 打赏
  • 举报
回复
不用客气了,我先记下你的QQ,到时我上Q的时候加你啊!
wf20032723 2009-03-28
  • 打赏
  • 举报
回复
delete清空指的是把数据库全部删除
wf20032723 2009-03-28
  • 打赏
  • 举报
回复
我用的是access,不是sql,好像语句有点不对,另外,我因为是用的OleDbCommandBuilder来更新数据,代码如下:
private void FormMain_Load(object sender, EventArgs e)
{
string file_name = Application.StarupPath + @"\test.mdb"; //本地数据库在bin里面
string password = "123";
string ConnectionString = string.Format("Provider=Microsoft.JET.OLEDB.4.0;Data Source='{0}';Persist Sercurity Info=false; JET OLEDB:Database Password={1}", file_name, password);
conn = new OleDbConnection(ConnectionString);
string sql = "SELECT * FROM test";//test为表名
da = new OleDbDataAdapter(sql, conn);
ds = new DataSet();
da.Fill(ds);
cb = new OleDbCommandBuilder(da);
}
private void btnImport_Click(object sender,EventArgs e) //更新数据库
{
DataTable dt = this.dataset1.Tables[0]; //dataset1是我新设立的一个DataSet,取的是excel里面的数据
for (int i = 0; i < dt.Rows.Count; i++)
{
ds.Tables[0].Rows.Add(dt.Rows[i].ItemArray);
Application.DoEvents();
}
da.Update(ds);//在此处更新数据
MessageBox.Show("提示操作成功。");
}
//用上面的代码,在数据库里面没数据的时候,更新很快,运行成功
但是数据库里面有数据的时候,我添加了一条语句
ds.Clear();在for循环的前面
for (int i = 0; i < dt.Rows.Count; i++)
{
ds.Tables[0].Rows.Add(dt.Rows[i].ItemArray);
Application.DoEvents();
}
da.Update(ds);//在此处更新数据
MessageBox.Show("提示操作成功。");
然后运行,就会报错,说数据库重复主键不能更新成功,
我感觉 da.Update(ds);好像在把dataset1里面的数据又重新写入数据库,而不是只改变有变化的样,但是我已经把ds清空了,还是不得行。
不过把数据库先用delete清空,运行上面的数据,才能da.Update(ds);成功样,
请问下各位高手,这是怎么回事,
周公 2009-03-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wf20032723 的回复:]
for(int i=0; i <ds.Tables["table"].Rows.Count; i++)
{
ds.Tables["table"].Rows.BeginEdit();
ds.Tables["table"].Rows[1] = "**********";
ds.Tables["table"].Rows.EndEdit();
}
这样写,更新数据库好像很慢哦,因为是一条一条更新的,如果数据量很大的话,时间很长,因为我的数据量很大,所以不能采用这种方法
[/Quote]
用你的办法更慢,实际上是如果对数据做了更新才会去更新数据库,如果没有就不做修改。当然DataSet中有这么一个标识,但是我更喜欢直接用ADO.NET直接操作,代码更容易维护。
wf20032723 2009-03-28
  • 打赏
  • 举报
回复
我的数据库表是这样的:字段是:索引 企业名字 1月 2月 3月...12月,是每月根据当月的数据,填充到当月的字段中去,其中,企业名字可能每月都有变化,数据量比较大,如果是先使用下面的语句的话,
String strUpdateSql = "Update table set Name=@name where Id=@id";
cmd = new SqlCommand(strUpdateSql , conn);
会非常慢,因为要每月都要先做一个企业名字的比对(大概有几千条数据),如果名字对了,就在相应的月里面加入数据,如果没有的话,就要在数据库的最后一条里面加入新数据,所以你的方法可能不得行。
wf20032723 2009-03-28
  • 打赏
  • 举报
回复
for(int i=0; i <ds.Tables["table"].Rows.Count; i++)
{
ds.Tables["table"].Rows.BeginEdit();
ds.Tables["table"].Rows[1] = "**********";
ds.Tables["table"].Rows.EndEdit();
}
这样写,更新数据库好像很慢哦,因为是一条一条更新的,如果数据量很大的话,时间很长,因为我的数据量很大,所以不能采用这种方法
stonehy520 2009-03-28
  • 打赏
  • 举报
回复
void Page_Load(object sender, System.EventArgs e)
{
SqlConnection conn = new SqlConnection("server=localhost;uid=sa;pwd=;database=db");
SqlDataAdapter da = new SqlDataAdapter();
SqlCommand cmd = new SqlCommand("select Id AS id, Name AS name from table",conn);
DataSet ds = new DataSet();
conn.Open();
da.SelectCommand = cmd;
da.Fill(ds,"table");
for(int i=0; i<ds.Tables["table"].Rows.Count; i++)
{
Response.Write(ds.Tables["table"].Rows[1]+"<br>");
}
for(int i=0; i<ds.Tables["table"].Rows.Count; i++)
{
ds.Tables["table"].Rows.BeginEdit();
ds.Tables["table"].Rows[1] = "**********";
ds.Tables["table"].Rows.EndEdit();
}
String strUpdateSql = "Update table set Name=@name where Id=@id";
cmd = new SqlCommand(strUpdateSql , conn);
cmd.Parameters.Add("@id",SqlDbType.Int,4, "id");
cmd.Parameters.Add("@name ",SqlDbType.Char,10, "name ");
da.UpdateCommand = cmd;
da.Update(ds, "table");
ds.AcceptChanges();
conn.Close();
}
wf20032723 2009-03-28
  • 打赏
  • 举报
回复
不好意思,写错了,是OleDbCommandBuilder,不是olecommend

110,535

社区成员

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

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

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