首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

100分﹗C#中SqlDataApter.update()使用經驗及技巧 ,C#新手請學習之﹐高手請指點之解决思路

2012-02-10 
100分﹗C#中SqlDataApter.update()使用經驗及技巧 ,C#新手請學習之﹐高手請指點之*************************

100分﹗C#中SqlDataApter.update()使用經驗及技巧 ,C#新手請學習之﹐高手請指點之
*******************************************************************
更多內容請去我的blog:
http://blog.csdn.net/lanpeng/archive/2007/07/27/1710824.aspx
******************************************************************
C#新手請學習之﹐高手請指點之﹗
我原來是用delphi7.0開發ERP系統﹐從2007年開始轉向C#2005,可是在做測試數據保存時總出現如下錯誤﹕

Update   requires   a   valid   InsertCommand   when   passed   DataRow   collection   with   new   rows.

當時很納悶。

部分代碼如下﹕

scn.ConnectionString   =   GlobMsg.DbConnection;
                        scn.Open();
                       
                        SqlCommand   scmdpc_hd   =   new   SqlCommand();
                        scmdpc_hd.Connection   =   scn;
                        scmdpc_hd.CommandText   =   "select   *   from   pc_hd ";
                        scmdpc_hd.CommandType   =   CommandType.Text;

                        SqlCommand   scmdpc_ln   =   new   SqlCommand();
                        scmdpc_ln.Connection   =   scn;
                        scmdpc_ln.CommandText   =   "select   *   from   pc_ln ";
                        scmdpc_ln.CommandType   =   CommandType.Text;
                       

                        //SqlDataAdapter   sda_PC_HD   =   new   SqlDataAdapter( "select   *   from   pc_hd ",scn   );

                        sda_PC_HD.SelectCommand   =   scmdpc_hd;
                                         
                        sda_PC_HD.Fill(ds,   "pc_hd ");
                       
                        //SqlDataAdapter   sda_PC_LN   =   new   SqlDataAdapter( "select   *   from   pc_ln ",scn);
                        sda_PC_LN.SelectCommand   =   scmdpc_ln;
                       
                        sda_PC_LN.Fill(ds,   "pc_ln ");

                        dvpc_hd   =   ds.Tables[ "pc_hd "].DefaultView   ;
                        pc_hdDataGridView.DataSource   =   dvpc_hd;



                        dvpc_ln   =   ds.Tables[ "pc_ln "].DefaultView;
                        pc_lnDataGridView.DataSource   =   dvpc_ln;

==========================

if   (ds.GetChanges()   ==   null)
                        {
                                MessageBox.Show( "is   null ");
                                return;
                        }
                        //ds.EnforceConstraints   =   false;

//如下紅色代碼原本調試時是沒有的。仔細閱讀c#相關資料才發現﹐只要寫上此二行代碼完全搞定﹐ok.
                        SqlCommandBuilder   scb_pc_hd   =   new   SqlCommandBuilder(sda_PC_HD);
                        SqlCommandBuilder   scb_pc_ln   =   new   SqlCommandBuilder(sda_PC_LN);


                        sda_PC_LN.Update(ds,   "pc_ln ");
                      //   sda_PC_HD.
                        sda_PC_HD.Update(ds,   "pc_hd ");

 

=======================

總結﹕

1.為什么不能直接用sqlcommand,一定要加上一個sqlcommandbuilder﹐才可以保存?這個我不明白為什么。

2.在DELPHI中可以看到修改后的數據﹐也就是說我們調用delphi中clientdataset.delta時將出現成對的記錄﹐一條原數據記錄﹐一條修改后的數據記錄﹐而在c#中調用dataset.getchanges()時得到的是一條修改后的數據記錄﹐這有有區別了。(在delphi中這種方式可以知道我修改了哪個字段數據﹐或是將哪個數據置為空了﹐而在c#中因只有一條數據﹐沒辦法知道我修改了哪些字段)有沒有知道這個機理的朋友﹖有的話請在此留言并發表意見。

3.多交流。

4.多學習。

//引用此文章請注明﹕本文章原創作者﹕馮鵬飛(蘭鵬電腦軟件開發部總設計師)

C#新手請學習之﹐高手請指點之﹗
2007-08-01結貼給分﹗﹗

[解决办法]
一般不用这个方法更新
[解决办法]
個人認為應該是VS檢測蛭SQL語句是一條查詢語句所以不能夠update.而重新實例化一個SqlCommandBuilder對象卻沒有檢測了
[解决办法]
我是新手~~
---------
1.因为是ms规定这样用的~~

[解决办法]
1、SqlCommandBuilder只有在用DataAdpater读取的表中含有主关键字时才会自动生成InsertCommand, UpdateCommand, DeleteCommand, (没有主关键字信息无法确定唯一行)。
你也可以自定义InsertCommand, UpdateCommand, DeleteCommand的。

2、.net也是保留已修改和原数据两份拷贝的,具体看看DataRowView.RowState, DataRow.RowState(具体什么属性忘了)。
[解决办法]
1、為什么不能直接用sqlcommand,一定要加上一個sqlcommandbuilder﹐才可以保存?這個我不明白為什么。
-----------------
可以直接用sqlcommand的啊,不过要自己写更新、添加SQL语句,而用sqlcommandbuilder是自动生成了这些SQL语句。
[解决办法]
繁体,台湾同胞??
呵呵,顶了在看.
[解决办法]
2、NET也会保存原来的值,可以这样取原来的值
ds.Tables[0].Rows[0][ "name ",DataRowVersion.Original]
DataRowVersion枚举有几个值,Original代表取原来的值。

注:如果调用了ds.AcceptChanges()方法,则DS就会清空所有DataRowVersion.Original的值


[解决办法]
1、為什么不能直接用sqlcommand,一定要加上一個sqlcommandbuilder﹐才可以保存?這個我不明白為什么。
-----------------
sqlcommandbuilder可以生成update 语句 所以要

但一般情况下可以不用这样,你可以自己拼凑SQL语句

2
建议你把DATASET作为只读的,如果update的话还是手动写SQL的好
[解决办法]
SqlCommandBuilder只有在用DataAdpater读取的表中含有主关键字时才会自动生成InsertCommand, UpdateCommand, DeleteCommand, (没有主关键字信息无法确定唯一行)。
你也可以自定义InsertCommand, UpdateCommand, DeleteCommand的。


UP

[解决办法]
為什么不能直接用sqlcommand,一定要加上一個sqlcommandbuilder﹐才可以保存?這個我不明白為什么?
====================================================================================
这是因为这样他就会自动生成Command语句,不用自己手动去配置这些Command语句
[解决办法]
sqlcommand不是.net的推荐方法吗?
[解决办法]
顶了再说
[解决办法]
up
[解决办法]
up

热点排行