日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

在VS2003下把一个DataTable Update 到数据库

發(fā)布時(shí)間:2023/12/2 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在VS2003下把一个DataTable Update 到数据库 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
假設(shè)一個(gè)常見的場(chǎng)景先吧----實(shí)際也是我當(dāng)前的場(chǎng)景-----把一個(gè)excel 文件導(dǎo)入到數(shù)據(jù)庫. 這實(shí)在是一個(gè)常見的功能,但是,沒想到的是, 我著實(shí)費(fèi)了一把勁.

實(shí)際上,我以前寫的有現(xiàn)成的函數(shù)來完成這個(gè)工作, 但是, 可惜那函數(shù)只能在VS2005 下工作, 在2003下面無效,無效的原因是,vs2003 的DataTable.Rows[i].SetAdded() 方法不存在. 也就是說, 你沒有辦法去更改一行的RowState, 而從excel 讀到的dataTable的 行狀態(tài)"默認(rèn)" 是unChanged.

如果不信, 你也可以嘗試去google或百度上搜一下試試看, 關(guān)于這個(gè)功能的貼子真是少得可憐,大約大家都換用vs2005了吧, 我找了半天, 零零碎碎地找到一些信息, 這些信息都指向DataTable.GetChanges(RowState) 函數(shù), 由于都是語焉不詳, 所以我高興地認(rèn)為, 這個(gè)函數(shù)能將表的所有行的狀態(tài)都設(shè)置為參數(shù)所指定的RowState, 就像我原來的函數(shù)用一個(gè)for循環(huán)為每一行調(diào)用SetAdded 的效果一樣, 我一邊還慚愧, 以前用了那么笨的辦法. 然而心底卻在奇怪, 微軟怎么會(huì)起了這么笨的一個(gè)函數(shù)名.

一番測(cè)試后, 終于弄明白原來不是微軟笨,而是我弄錯(cuò)了, GetChanges函數(shù)果然是用來Get, 而不是set的, 它返回母表中指定狀態(tài)的行組成的子表, 也就是說, 剛才的查找白費(fèi)了.

再找了一會(huì)兒, 借助于Mitch Milam 先生十分專業(yè)的一篇文章, 終于找到了正確的solution, 這篇文章的url:
http://blogs.infinite-x.net/2006/09/21/the-saga-of-net-dataadapterupdate-and-multiple-tables/print/
說它專業(yè), 是因?yàn)檫@篇文章幾乎是以正規(guī)科技論文的格式來寫的, 雖然我自己寫論文的時(shí)候很討厭麻煩的格式, 但是閱讀的時(shí)候, 卻不得不承認(rèn), 這種嚴(yán)謹(jǐn)?shù)母袷阶x起來實(shí)在是愉快地多. ----廢話少說, 問題的關(guān)鍵在于行狀態(tài), 從excel 讀取后成了unchanged, 而且又無法修改, 問題就在于讀取. 原來數(shù)據(jù)適配器有一個(gè)AcceptChangesDuringFill 屬性, 這個(gè)屬性默認(rèn)為true, 所以調(diào)用Fill 方法后, 它就自動(dòng)地AcceptChange了 , 然后行狀態(tài)就變成unchanged了, 只要把這個(gè)屬性置為false, fill 后, 就可以保持行狀態(tài)為Added, 然后在update 函數(shù)里就不需要考慮行狀態(tài)了.

以下為不太熟悉這兩種操作的朋友列出源代碼, 為了閱讀方便,去掉了錯(cuò)誤檢查部分的代碼,但在實(shí)際應(yīng)用中, try語句是不可缺少的:
<0>調(diào)用代碼:
1string?path="upload";
2DataTable?dt=ImportFromExcel(path);
3string?selectCommand="SELECT?*?FROM?T1";
4UpdateToDataBase(selectCommand,dt);
<1> 從excel 讀取數(shù)據(jù)
?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 到數(shù)據(jù)庫

?

?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

轉(zhuǎn)載于:https://www.cnblogs.com/Moosdau/archive/2007/12/21/1008959.html

總結(jié)

以上是生活随笔為你收集整理的在VS2003下把一个DataTable Update 到数据库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。