我狂顶顶顶!我相信一定有解决方法!
我的思路:即然两个表的结构一样,我只要把产生的数据集的ROWS合并到数据库的数据集中,不就行了???实验中......
我的思路:即然两个表的结构一样,我只要把产生的数据集的ROWS合并到数据库的数据集中,不就行了???实验中......
解决方案 »
- 【原创】C#导出数据到EXCEL方法谈(附实例源码和超级无敌详细讲解)
- 如何将两个下拉列表框进行相对绑定
- HttpWebRequest请求百度 为何返回的是乱码
- C#中怎么调用cmd来执行SQL脚本实现用户创建等操作
- C#异常
- 有搞过C#写PI数据库的高手吗?
- 用户控件中的 static 函数怎么引用?
- 我想GridView与文本框绑定,GridView移到那条记录的时候,文本框里就显示那条
- 为什么我的工具箱中没AxWebBrowser控件
- 如何让header背后为透明色,无属性设置的难题(tabcontrol)
- 从datagrid中删除一行,但是不删除数据库中的这行数据!
- C#中不能正确读取二进制文件中的汉字,请高手指点
按道理直接用DataAdapter.Update就可以了。
关于DataAdapter的使用参见MSDN。
这可能吗?适配器的更新是把来自于它的数据源的数据先填充到一个数据集上,然后把数据集的修改反映到数据源上,也就是说,适配器同数据集是有关系的。但是,我现在是程序在运行中动态生成一个数据集,这个数据集的产生同适配器没有任何联系,他的数据并不来自于一个适配器对象,这样可以填充吗?我现在的思路是:首先创建一个适配器,并填充到一个数据集,然后将此数据集的结构复制到一个临时的数据集中,取得临时数据集产生的数据行,然后将行合并到原有的数据集中,然后在更新。
创建SQLBuilder对象填充DataAdapter....(其实.。嘿
填写表映射数据库表和数据集的映射关系
。。
就这样
da.UpDate(ds);
那么da要不要指定select字符串,如:
SqlDataAdapter da =new SqlDataAdapter("select * from table",newconn);
通过SELECTCOMMAND来构造SqlDataAdapter
然后再生成对应的SqlCommandBuilder
不过可以手动生成对应的UPDATE的SQL语句也可以,有点杂习(。NET数据服务C#高级编程有提及)
{
DataRow targetRow = dataTable.Rows[lbCustomers.SelectedIndex];
lblMessage.Text = "Updating " + targetRow["CompanyName"];
Application.DoEvents();
targetRow.BeginEdit();
targetRow["CompanyName"] = txtCompanyName.Text;
targetRow.EndEdit(); DataSet DataSetChanged = DataSet.GetChanges(DataRowState.Modified);
bool okayFlag = true; if (DataSetChanged.HasErrors)
{ okayFlag = false;
string msg = "Error in row with customer ID";
foreach( DataTable theTable in DataSetChanged.Tables)
{
if (theTable.HasErrors)
{
DataRow[] errorRows = theTable.GetErrors(); foreach(DataRow theRow in errorRows)
{
msg = msg + theRow["CustomerID"]; }
}
}
lblMessage.Text = msg;
}
//如无错
if (okayFlag)
{
//合并
DataSet.Merge(DataSetChanged); //更新数据库**************************
DataAdapter.Update(DataSet,"Customers"); //执行这一句出现如下信
息。
//***********************************************
//通知用户
lblMessage.Text = DataAdapter.UpdateCommand.CommandText;
Application.DoEvents();
DataSet.AcceptChanges();
PopulateLB();
}
else
DataSet.RejectChanges();
}
===================================未处理的“System.InvalidOperationException”类型的异常出现在 system.data.dll 中其他信息:当传递具有已修改行的 DataRow 集合时,更新要求有效的 UpdateCommand。
分别建立SqlCommand 实现插入删除修改数据库数据的功能
比如建立一个删除数据库数据的command
SqlCommand sqlInser = new SqlCommand ();
sqlInsert.CommandText = "delete from table where primekey = @key";
然后添加参数@key
最后建立数据适配器与dataset之间的数据映射关系
添加表之间的映射关系
sda.TableMappins.add(sourceTabel,DatasetTable);
添加列之间的数据映射关系
this.sqlDataAdapter1.TableMappings[0].ColumnMappings.Add();
加上没有?
因为客户一次性会输入多条数据,并且输入完以后还要进行编辑修改确认无误后才保存,所以需要方便的向前向后进行数据操作,所以我想所有的文本框绑定到数据集,利用其this.BindingContext[dataset1,"table"].Position就可以了。本来问题很简单就可以解决,但是客户的资料是非常庞大的,我不可能在一个仅仅实现资料输入功能的窗口中利用下面的代码进行绑定:
myadapter=new SqlDataAdapter("select * from table",myconn);
mybuilder=new SqlCommandBuilder(this.myadapter);
dataset1=new DataSet();
myadapter.fill(dataset1);//简单表示
我不可能绑定dataset1啊??我启动窗体岂不要等N久?况且,窗口出现后,总会显示数据集中的一条数据,总不太好吧?
所以,我想,当客户输入时,不管他输入多少,临时生成一个数据集(当然里面表的结构同数据库中表的结构是一样的),然后把这个数据集中的数据存在数据库中。这就避免了操作大量数据而影响程序速度的问题。
大家看看,有什么意见说说
批量输入写入dataset 可以用sql 语句任意处理,最后更新
可否说得详细点,我第一次用SQL啊,手头上又没有资料,或者发点资料给我好吗
你用一个查不出数据的语句
然后你可以随便搞,
最后更新,
当然 数据库会理解为INSERT
当然约束要控制好
修改为SqlDataAdapter sda =new SqlDataAdapter(("select * from table where ....",newconn);
where 条件你可以自己选择一个合适的,比如最大的那个记录等等
总之不要把所有的记录都选择出来吧
sql 处理
我的方法是这样的:
1、生成一个临时数据集,克隆用适配器填充的数据集的数据结构
2、窗体控件绑定临时数据集
3、直接用适配器更新临数据集。henryfan1(henry)说:
即然在内存中的表同数据库中的表的结构是一样,
按道理直接用DataAdapter.Update就可以了。其实,henryfan1一早就说对了,直接更新临时数据集就行了,跟其数据来源是否来自于适配器一点关系都没有。唉,走了不少弯路,晕,呵呵,再次感谢各位。过一会就结贴