使用SqlCommandBuilder更新DataTable的原始碼

hljhrbsjf發表於2006-09-14
使用SqlCommandBuilder更新DataTable的原始碼,你可以選擇看,也可以不(技術共享) 首先說明一下,這一大堆東西是一堆共通函式拿出來的,由於時間倉促,所以有些地方還有很多改進的地方,個人認為很容易,看到老是有人問這些東西,所以特別貼出來,希望對大家有點幫助.
這個東西可能誰都會,但這是我自己的API,我拿出來共享,大家可以拿來就用.也可以編譯成為Dll,在中國的軟體環境中,我希望大家可以團結.

public void SaveDataFromDt(DataTable argdtData,string argstrTableName)//這裡的引數就是要更新的DataTable和要更新的表名
{
if(argdtData ==null)
{
throw new Exception("DataTable不存在!");
}
//下面是初始化資料庫連線自己設定吧
SqlConnection conn = new SqlConnection(“連線字串,這個不用寫了吧”);
SqlCommand scommGlobal;
Sql Transaction stracGlobal; //可以新增事物處理
SqlDataAdapter sdaGlobal;

//做一個DataTable,取資料庫中表名和主鍵用的
DataTable dtColStat;

//初始化這個DataTable
dtColStat = new DataTable();
//下面這個東西個人人為是精華
scommGlobal = new SqlCommand("select distinct objs.name as tblname,cols.name as colname,cols.colstat as colstat"+" from sysobjects objs join syscolumns cols on (objs.id=cols.id) "+" where colstat='1'",sconnGlobal);

//可以設定TimeOut,隨便寫吧
scommGlobal.CommandTimeout = 1000;

//初始化事物
scommGlobal.Transaction = stracGlobal;
sdaGlobal = new SqlDataAdapter(scommGlobal, conn);
try
{
//開啟資料連線,這個我就不寫了
//這裡拿到資料庫中所有的表名和主鍵
sdaGlobal.Fill(dtColStat);
}
catch(System.Exception ex)
{
//異常處理,自己寫吧
}
string strSelect; //準備用SelectCommand

string strStatColName=string.Empty; //準備得到的Column名稱
string strColName=string.Empty; StringBuilder sbCols = new StringBuilder(128);
DataRow[] drs = dtColStat.Select("tblname='"+ argstrTableName+"'");
if(drs.Length>0)
{
strStatColName = drs[0]["colstat"].ToString();
}
//下面拼裝Select語句,取出主鍵和要更新的所有Column
sbCols.Append("select ");
foreach(DataColumn dc in argdtData.Columns)
{
strColName = dc.ColumnName; if(strColName!=strStatColName)
{
sbCols.Append(strColName);
sbCols.Append(",");
}
}
if(sbCols.Length>7)
sbCols.Remove(sbCols.Length-1,1);
sbCols.Append(" from ");
sbCols.Append(argstrTableName);
strSelect = sbCols.ToString();

//設定SelectCommand
sdaGlobal.SelectCommand = new SqlCommand(strSelect,conn);
sdaGlobal.SelectCommand.Transaction = stracGlobal;

//重要的地方來了
SqlCommandBuilder scombuilder = new SqlCommandBuilder(sdaGlobal);
scombuilder.RefreshSchema();
//該生成可供執行的資料庫操作命令
sdaGlobal.UpdateCommand = scombuilder.GetUpdateCommand();
sdaGlobal.InsertCommand = scombuilder.GetInsertCommand();
sdaGlobal.DeleteCommand = scombuilder.GetDeleteCommand();

//可以設定一把TimeOut,隨便設定
sdaGlobal.UpdateCommand.CommandTimeout=1000;
sdaGlobal.InsertCommand.CommandTimeout=1000;
sdaGlobal.DeleteCommand.CommandTimeout=1000;

//可以加上你們事物
sdaGlobal.UpdateCommand.Transaction = stracGlobal;
sdaGlobal.DeleteCommand.Transaction = stracGlobal;
sdaGlobal.InsertCommand.Transaction = stracGlobal;
try
{
//資料庫連線就自己去寫吧
//可以進行更新了
sdaGlobal.Update(argdtData);
argdtData.AcceptChanges();
//關閉資料連線什麼的,我也不寫了,偷懶
}
catch(Exception ex)
{
//異常處理自己寫
}
}
到此結束,由於時間太短和公司的不方便(系統不是中文的,鬱悶ing,家裡開這個網站象牛一樣慢),所以到此為止,希望可以對大家有一些幫助,本人不是在炫耀什麼,因為我越來越明白,技術共享對程式設計師來說是多麼的重要(我需要的是完全的共享).由於是多個方法組合成了一個方法,所以可能會有不合適的地方,比如資料庫連線,事物什麼的以前都是全域性變數,大家可以從命名上看出來,這些程式碼本人在.net2002和2003版本甚至是在2005微軟2月預覽版中測試都沒問題,如果有問題希望大家可以DeBug一把,也就變數有些命名或者找不到什麼的錯誤,但是中心部分都沒有錯誤,如果大家需要原來完整的程式碼,我也可以貼出來,但是就太多了,還有別的邏輯在裡面,比如說,在更新資料之前,要對DataTable中所有的資料進行EndEdit();當然還有檢查DataTable中的資料有沒有做過更改,如果沒有更改就不進行任何更新,但是我都給省略了,祝大家好運.
[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/631872/viewspace-864908/,如需轉載,請註明出處,否則將追究法律責任。

相關文章