在VS2003下把一个DataTable Update 到数据库
生活随笔
收集整理的這篇文章主要介紹了
在VS2003下把一个DataTable Update 到数据库
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
假設一個常見的場景先吧----實際也是我當前的場景-----把一個excel 文件導入到數據庫. 這實在是一個常見的功能,但是,沒想到的是, 我著實費了一把勁.
實際上,我以前寫的有現成的函數來完成這個工作, 但是, 可惜那函數只能在VS2005 下工作, 在2003下面無效,無效的原因是,vs2003 的DataTable.Rows[i].SetAdded() 方法不存在. 也就是說, 你沒有辦法去更改一行的RowState, 而從excel 讀到的dataTable的 行狀態"默認" 是unChanged.
如果不信, 你也可以嘗試去google或百度上搜一下試試看, 關于這個功能的貼子真是少得可憐,大約大家都換用vs2005了吧, 我找了半天, 零零碎碎地找到一些信息, 這些信息都指向DataTable.GetChanges(RowState) 函數, 由于都是語焉不詳, 所以我高興地認為, 這個函數能將表的所有行的狀態都設置為參數所指定的RowState, 就像我原來的函數用一個for循環為每一行調用SetAdded 的效果一樣, 我一邊還慚愧, 以前用了那么笨的辦法. 然而心底卻在奇怪, 微軟怎么會起了這么笨的一個函數名.
一番測試后, 終于弄明白原來不是微軟笨,而是我弄錯了, GetChanges函數果然是用來Get, 而不是set的, 它返回母表中指定狀態的行組成的子表, 也就是說, 剛才的查找白費了.
再找了一會兒, 借助于Mitch Milam 先生十分專業的一篇文章, 終于找到了正確的solution, 這篇文章的url:
http://blogs.infinite-x.net/2006/09/21/the-saga-of-net-dataadapterupdate-and-multiple-tables/print/
說它專業, 是因為這篇文章幾乎是以正規科技論文的格式來寫的, 雖然我自己寫論文的時候很討厭麻煩的格式, 但是閱讀的時候, 卻不得不承認, 這種嚴謹的格式讀起來實在是愉快地多. ----廢話少說, 問題的關鍵在于行狀態, 從excel 讀取后成了unchanged, 而且又無法修改, 問題就在于讀取. 原來數據適配器有一個AcceptChangesDuringFill 屬性, 這個屬性默認為true, 所以調用Fill 方法后, 它就自動地AcceptChange了 , 然后行狀態就變成unchanged了, 只要把這個屬性置為false, fill 后, 就可以保持行狀態為Added, 然后在update 函數里就不需要考慮行狀態了.
以下為不太熟悉這兩種操作的朋友列出源代碼, 為了閱讀方便,去掉了錯誤檢查部分的代碼,但在實際應用中, try語句是不可缺少的:
<0>調用代碼:
1string?path="upload";
2DataTable?dt=ImportFromExcel(path);
3string?selectCommand="SELECT?*?FROM?T1";
4UpdateToDataBase(selectCommand,dt);
<1> 從excel 讀取數據
?1DataTable?ImportFromExcel(string?path)
?2{
?3????path=Server.MapPath(path);
?4????upload1.PostFile.SaveAs(path);
?5
?6?string?connString?=?"Provider=Microsoft.Jet.OLEDB.4.0;Data?Source="?+?path?+";Extended?Properties='Excel?8.0;HDR=yes;IMEX=1;'";
?7????string?selectCommand?=?"?SELECT?*?FROM?[Sheet1$]?";
?8???DataTable?dt=new?DataTable();
?9
10????System.Data.OleDb.OleDbConnection?conn=new?System.Data.OleDb.OleDbConnection(connString);
11????conn.Open();
12????System.Data.OleDb.OleDbCommand?cmd?=?new?System.Data.OleDb.OleDbCommand(selectCommand,?conn);
13????System.Data.OleDb.OleDbDataAdapter?adt?=?new?System.Data.OleDb.OleDbDataAdapter(cmd);
14????adt.AcceptChangesDuringFill=false;
15????adt.Fill(dt);
16????conn.Close();
17????System.IO.File.Delete(path);
18????return?dt;
19
20} 這里面的trick 就是第14 行.
<2>提交DataTable 到數據庫
?2{
?3????string?connString=GetConnectionString();
?4
?5???System.Data.SqlClient.SqlConnection?con?=?new?System.Data.SqlClient.SqlConnection(connString);
?6???System.Data.SqlClient.SqlDataAdapter?adt?=?new?System.Data.SqlClient.SqlDataAdapter(sql,?con);
?7???System.Data.SqlClient.SqlCommandBuilder?builder?=?new?System.Data.SqlClient.SqlCommandBuilder(adt);
?8????adt.InsertCommand=builder.GetInsertCommand();
?9????con.Open();
10????adt.Update(dt).ToString();
11????con.Close();
12}
13
實際上,我以前寫的有現成的函數來完成這個工作, 但是, 可惜那函數只能在VS2005 下工作, 在2003下面無效,無效的原因是,vs2003 的DataTable.Rows[i].SetAdded() 方法不存在. 也就是說, 你沒有辦法去更改一行的RowState, 而從excel 讀到的dataTable的 行狀態"默認" 是unChanged.
如果不信, 你也可以嘗試去google或百度上搜一下試試看, 關于這個功能的貼子真是少得可憐,大約大家都換用vs2005了吧, 我找了半天, 零零碎碎地找到一些信息, 這些信息都指向DataTable.GetChanges(RowState) 函數, 由于都是語焉不詳, 所以我高興地認為, 這個函數能將表的所有行的狀態都設置為參數所指定的RowState, 就像我原來的函數用一個for循環為每一行調用SetAdded 的效果一樣, 我一邊還慚愧, 以前用了那么笨的辦法. 然而心底卻在奇怪, 微軟怎么會起了這么笨的一個函數名.
一番測試后, 終于弄明白原來不是微軟笨,而是我弄錯了, GetChanges函數果然是用來Get, 而不是set的, 它返回母表中指定狀態的行組成的子表, 也就是說, 剛才的查找白費了.
再找了一會兒, 借助于Mitch Milam 先生十分專業的一篇文章, 終于找到了正確的solution, 這篇文章的url:
http://blogs.infinite-x.net/2006/09/21/the-saga-of-net-dataadapterupdate-and-multiple-tables/print/
說它專業, 是因為這篇文章幾乎是以正規科技論文的格式來寫的, 雖然我自己寫論文的時候很討厭麻煩的格式, 但是閱讀的時候, 卻不得不承認, 這種嚴謹的格式讀起來實在是愉快地多. ----廢話少說, 問題的關鍵在于行狀態, 從excel 讀取后成了unchanged, 而且又無法修改, 問題就在于讀取. 原來數據適配器有一個AcceptChangesDuringFill 屬性, 這個屬性默認為true, 所以調用Fill 方法后, 它就自動地AcceptChange了 , 然后行狀態就變成unchanged了, 只要把這個屬性置為false, fill 后, 就可以保持行狀態為Added, 然后在update 函數里就不需要考慮行狀態了.
以下為不太熟悉這兩種操作的朋友列出源代碼, 為了閱讀方便,去掉了錯誤檢查部分的代碼,但在實際應用中, try語句是不可缺少的:
<0>調用代碼:
1string?path="upload";
2DataTable?dt=ImportFromExcel(path);
3string?selectCommand="SELECT?*?FROM?T1";
4UpdateToDataBase(selectCommand,dt);
<1> 從excel 讀取數據
?1DataTable?ImportFromExcel(string?path)
?2{
?3????path=Server.MapPath(path);
?4????upload1.PostFile.SaveAs(path);
?5
?6?string?connString?=?"Provider=Microsoft.Jet.OLEDB.4.0;Data?Source="?+?path?+";Extended?Properties='Excel?8.0;HDR=yes;IMEX=1;'";
?7????string?selectCommand?=?"?SELECT?*?FROM?[Sheet1$]?";
?8???DataTable?dt=new?DataTable();
?9
10????System.Data.OleDb.OleDbConnection?conn=new?System.Data.OleDb.OleDbConnection(connString);
11????conn.Open();
12????System.Data.OleDb.OleDbCommand?cmd?=?new?System.Data.OleDb.OleDbCommand(selectCommand,?conn);
13????System.Data.OleDb.OleDbDataAdapter?adt?=?new?System.Data.OleDb.OleDbDataAdapter(cmd);
14????adt.AcceptChangesDuringFill=false;
15????adt.Fill(dt);
16????conn.Close();
17????System.IO.File.Delete(path);
18????return?dt;
19
20} 這里面的trick 就是第14 行.
<2>提交DataTable 到數據庫
?
?1void?UpdateToDataBase(string?sql,DataTable?dt)?2{
?3????string?connString=GetConnectionString();
?4
?5???System.Data.SqlClient.SqlConnection?con?=?new?System.Data.SqlClient.SqlConnection(connString);
?6???System.Data.SqlClient.SqlDataAdapter?adt?=?new?System.Data.SqlClient.SqlDataAdapter(sql,?con);
?7???System.Data.SqlClient.SqlCommandBuilder?builder?=?new?System.Data.SqlClient.SqlCommandBuilder(adt);
?8????adt.InsertCommand=builder.GetInsertCommand();
?9????con.Open();
10????adt.Update(dt).ToString();
11????con.Close();
12}
13
轉載于:https://www.cnblogs.com/Moosdau/archive/2007/12/21/1008959.html
總結
以上是生活随笔為你收集整理的在VS2003下把一个DataTable Update 到数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在阳光下歌唱
- 下一篇: javascript动态创建radio