(100高分求助)在C#中的dataGrid中,如何修改多表查询出来的数据并保存回数据库? 这个问题以前有很多人问过,通过DataAdapter直接更新数据库不行,只能分别更新3个表,把他们放在一个事务中。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我用的数据库是access,请楼上的大侠说清楚一点啊,急啊 去我的blog里看看吧!通过扩展的dataset很方便的!blog.csdn.net/xinyulou 你现在的问题在哪啊?把datagrid里的三张表的数据分别UPDATE三张表就可以了啊 不行啊,因为我的那三张表并不是要显示所有的字段,有些字段不在dataGrid中显示出来,但是在数据库中确实存在 xinyulou(心雨楼) 你的那篇文章有问题啊,还有,能不能给出你的思路 但是我使用的是access数据库,好像不支持视图的哦 或者采用循环语句分别对三个表写update或insert.做项目时,一般来说采用这两种方法. 我再次回答这个问题,曾经有网友问过类似的问题,并给我500分,结果让版主认为我倒分,把分子都扣掉了。整体思路是利用DataAdapter的Updata方法和SqlCommandBuilder类的自动生成语句。 回复人: SimerJoe(浪月) ( ) 信誉:100 2004-6-17 12:51:42 得分: 100 这是一个好问题,我在开发中遇到的时候是这样解决的:DataAdapter实例化后始终是一个对象,只要保留了它的引用那么它就跑不了。在需要的时候定义一个新的DataAdapter对象,并得到当初那个对象的引用就ok了。请看代码: internal static string[] TableNameTotal={ "Employee", "IncContact", "Linkman", "IndividualContact", "ConfigureDocument", "ServiceAcceptDocument", "BizChance", "ServiceSort", "Ware", "ServiceDispatchDocument", "BankAccount", "ConfigureDocumentDetail", "SaleDocument", "SaleDocumentDetail", "Client" };//搞一个数组,这里是我数据库的所有表名。 internal ArrayList Adapters { get { SqlConnection myCn = new SqlConnection(strConn); ArrayList SqlDataAdapters=new ArrayList(DBOperator.TableNameTotal.Length); for(int i=0;i<DBOperator.TableNameTotal.Length;i++) { string strSQL="select * from "+DBOperator.TableNameTotal[i]; SqlDataAdapters.Insert(i,new SqlDataAdapter(strSQL,myCn)); } return SqlDataAdapters; } }//这里是一个对象列表,大家都可以看到里面放的是什么吧,这里是关键。 internal override DataSet ExecuteTotalData() { SqlConnection myCn = new SqlConnection(strConn); try { for(int i=0;i<DBOperator.TableNameTotal.Length;i++) { SqlDataAdapter adapter=(SqlDataAdapter)Adapters[i]; adapter.Fill(TotalData,DBOperator.TableNameTotal[i]); } return TotalData; } catch(System.Data.SqlClient.SqlException e) { throw new Exception(e.Message); } finally { myCn.Close(); } }//这里得到了我需要的DataSet,这可是15个表哦。 internal override bool UpdateDB(DataSet TotalDS) { SqlConnection myCn = new SqlConnection(strConn); try { for(int i=0;i<DBOperator.TableNameTotal.Length;i++) { SqlDataAdapter adapter=(SqlDataAdapter)Adapters[i]; SqlCommandBuilder cb=new SqlCommandBuilder(adapter); adapter.Update(TotalDS,TotalDS.Tables[i].TableName); } return true; } catch { return false; } finally { myCn.Close(); } }//更新的方法就在这里啦,怎么样,从此高枕无忧。由于这些代码是写在不同的类里面,我又只贴了一些关键部分,所以还希望大家看的时候多多包含。 其实我这些代码还有可以优化的地方。总之,得到了DataSet以后在程序里面就可以直接对DataSet进行操作,然后利用Updata方法进行数据库的保存。在这里有3个关键的地方,1、数组保存了表名以后是存在顺序的,不至于表名混乱。2、对象列表是传引用的,不至于对象丢失。3、DataAdapter对象是传引用的,不至于对象丢失。我就是利用对象并没有被销毁来得到其引用的。 原贴在这里:http://community.csdn.net/Expert/topic/3098/3098045.xml?temp=.9816553 至于想隐藏表中某些列的话,可以用DataGrid的TableStyles属性,参考以下代码: internal static DataGridTableStyle getSaleDocumentFromStyls() { DataGridTableStyle style=new DataGridTableStyle(); style.MappingName="FormWareTable"; DataGridTextBoxColumn serialNumber=new DataGridTextBoxColumn(); serialNumber.MappingName="serialNumber"; serialNumber.HeaderText="序号"; serialNumber.ReadOnly=true; serialNumber.Width=30; DataGridTextBoxColumn WareName=new DataGridTextBoxColumn(); WareName.MappingName="WareName"; WareName.HeaderText="商品名称及型号"; WareName.Width=130; DataGridTextBoxColumn Unit=new DataGridTextBoxColumn(); Unit.MappingName="Unit"; Unit.HeaderText="单位"; Unit.Width=50; DataGridTextBoxColumn Number=new DataGridTextBoxColumn(); Number.MappingName="Number"; Number.HeaderText="数量"; DataGridTextBoxColumn Prix=new DataGridTextBoxColumn(); Prix.MappingName="Prix"; Prix.HeaderText="单价"; DataGridTextBoxColumn Money=new DataGridTextBoxColumn(); Money.MappingName="Money"; Money.HeaderText="金额"; Money.ReadOnly=true; Money.Width=100; style.GridColumnStyles.AddRange(new DataGridColumnStyle[]{serialNumber,WareName,Unit,Number,Prix,Money}); style.HeaderBackColor=Color.White; style.RowHeadersVisible=false; return style; }DataGrid dg=new DataGrid();dg.TableStyless.Add(getSaleDocumentFromStyls);如果你想隐藏Money列,那么不写 Money.MappingName="Money"; Money.HeaderText="金额"; Money.ReadOnly=true; Money.Width=100;就不会出现这列了。 关键在于,我的是多表,能用updata吗? datagird和dataset绑定了的三,直接用oldbdataadapter就可以了 对不起,我昨天没有上班,所以没来这里看。让你久等了。这样做的前提是数据库里面的每个表都对应DataSet里面单独的表。而且这些表都是由DataAdapter的Fill方法填充的。如果是混合表的话必须写代码将它门拆分,分别添加或修改当前的填充表。再利用以上代码更改数据库。其实我自己在工作中就是这样做的。 自定义控件的问题 怎么接收值 .net如何格式化输出字符串!用format?(在账票中) 用asp.net做网站,网站中需要一个进度条显示某个业务关注人的多少!!!求啊怎么做啊!! 关于文件的查找替换效率问题。。急求高手进。。(我只能发20分的帖) 希望高手来帮个忙 超急的问题,请各位高手帮帮忙?????? 我做的网站要有这个特点,怎么搞? 水晶报表d版的并发量到底受不受限制 提一个C#的基础问题. 怎么将16进制,转换成10进制阿? "protracker.form1"并不包含对"columnheader2"的定义
你的那篇文章有问题啊,还有,能不能给出你的思路
整体思路是利用DataAdapter的Updata方法和SqlCommandBuilder类的自动生成语句。 回复人: SimerJoe(浪月) ( ) 信誉:100 2004-6-17 12:51:42 得分: 100 这是一个好问题,我在开发中遇到的时候是这样解决的:
DataAdapter实例化后始终是一个对象,只要保留了它的引用那么它就跑不了。
在需要的时候定义一个新的DataAdapter对象,并得到当初那个对象的引用就ok了。
请看代码:
internal static string[] TableNameTotal={
"Employee",
"IncContact",
"Linkman",
"IndividualContact",
"ConfigureDocument",
"ServiceAcceptDocument",
"BizChance",
"ServiceSort",
"Ware",
"ServiceDispatchDocument",
"BankAccount",
"ConfigureDocumentDetail",
"SaleDocument",
"SaleDocumentDetail",
"Client"
};
//搞一个数组,这里是我数据库的所有表名。
internal ArrayList Adapters
{
get
{
SqlConnection myCn = new SqlConnection(strConn);
ArrayList SqlDataAdapters=new ArrayList(DBOperator.TableNameTotal.Length);
for(int i=0;i<DBOperator.TableNameTotal.Length;i++)
{
string strSQL="select * from "+DBOperator.TableNameTotal[i];
SqlDataAdapters.Insert(i,new SqlDataAdapter(strSQL,myCn));
} return SqlDataAdapters;
}
}//这里是一个对象列表,大家都可以看到里面放的是什么吧,这里是关键。 internal override DataSet ExecuteTotalData()
{
SqlConnection myCn = new SqlConnection(strConn);
try
{
for(int i=0;i<DBOperator.TableNameTotal.Length;i++)
{
SqlDataAdapter adapter=(SqlDataAdapter)Adapters[i];
adapter.Fill(TotalData,DBOperator.TableNameTotal[i]);
}
return TotalData;
}
catch(System.Data.SqlClient.SqlException e)
{
throw new Exception(e.Message);
}
finally
{
myCn.Close();
}
}//这里得到了我需要的DataSet,这可是15个表哦。 internal override bool UpdateDB(DataSet TotalDS)
{
SqlConnection myCn = new SqlConnection(strConn);
try
{
for(int i=0;i<DBOperator.TableNameTotal.Length;i++)
{
SqlDataAdapter adapter=(SqlDataAdapter)Adapters[i];
SqlCommandBuilder cb=new SqlCommandBuilder(adapter);
adapter.Update(TotalDS,TotalDS.Tables[i].TableName);
}
return true;
}
catch
{
return false;
}
finally
{
myCn.Close();
}
}//更新的方法就在这里啦,怎么样,从此高枕无忧。由于这些代码是写在不同的类里面,我又只贴了一些关键部分,所以还希望大家看的时候多多包含。 其实我这些代码还有可以优化的地方。
总之,得到了DataSet以后在程序里面就可以直接对DataSet进行操作,然后利用Updata方法进行数据库的保存。
在这里有3个关键的地方,
1、数组保存了表名以后是存在顺序的,不至于表名混乱。
2、对象列表是传引用的,不至于对象丢失。
3、DataAdapter对象是传引用的,不至于对象丢失。
我就是利用对象并没有被销毁来得到其引用的。 原贴在这里:
http://community.csdn.net/Expert/topic/3098/3098045.xml?temp=.9816553
可以用DataGrid的TableStyles属性,参考以下代码:
internal static DataGridTableStyle getSaleDocumentFromStyls()
{
DataGridTableStyle style=new DataGridTableStyle(); style.MappingName="FormWareTable"; DataGridTextBoxColumn serialNumber=new DataGridTextBoxColumn();
serialNumber.MappingName="serialNumber";
serialNumber.HeaderText="序号";
serialNumber.ReadOnly=true;
serialNumber.Width=30; DataGridTextBoxColumn WareName=new DataGridTextBoxColumn();
WareName.MappingName="WareName";
WareName.HeaderText="商品名称及型号";
WareName.Width=130; DataGridTextBoxColumn Unit=new DataGridTextBoxColumn();
Unit.MappingName="Unit";
Unit.HeaderText="单位";
Unit.Width=50; DataGridTextBoxColumn Number=new DataGridTextBoxColumn();
Number.MappingName="Number";
Number.HeaderText="数量"; DataGridTextBoxColumn Prix=new DataGridTextBoxColumn();
Prix.MappingName="Prix";
Prix.HeaderText="单价"; DataGridTextBoxColumn Money=new DataGridTextBoxColumn();
Money.MappingName="Money";
Money.HeaderText="金额";
Money.ReadOnly=true;
Money.Width=100; style.GridColumnStyles.AddRange(new DataGridColumnStyle[]{serialNumber,WareName,Unit,Number,Prix,Money});
style.HeaderBackColor=Color.White;
style.RowHeadersVisible=false; return style;
}DataGrid dg=new DataGrid();
dg.TableStyless.Add(getSaleDocumentFromStyls);
如果你想隐藏Money列,那么不写
Money.MappingName="Money";
Money.HeaderText="金额";
Money.ReadOnly=true;
Money.Width=100;
就不会出现这列了。
oldbdataadapter就可以了
让你久等了。这样做的前提是数据库里面的每个表都对应DataSet里面单独的表。
而且这些表都是由DataAdapter的Fill方法填充的。如果是混合表的话必须写代码将它门拆分,分别添加或修改当前的填充表。
再利用以上代码更改数据库。其实我自己在工作中就是这样做的。