在項目開發時,經常需要把數據庫中的數據通過內存表讀出,然後綁定到datagridview等控件上進行顯示和修改.那麼在編輯完後要講所有數據更新回數據庫用什麼方法好呢?在我看來用dataadapter.update就是非常號的方法,因爲dataadapter的機制是根據內存表中各行的狀態(insert,update,delete)來採用對應的方案進行數據的插入、修改或刪除,而程序設計人員使用時根本不用考慮這些,只需要一條update語句就可以了。主要代碼如下:
string strSelectQuery=" select ........";
DataSet ds=new DataSet();
SqlConnection conn = new SqlConnection(數據庫連接字符串);
da.SelectCommand = new SqlCommand(strSelectQuery, conn);
SqlCommandBuilder cb = new SqlCommandBuilder(da);
if (conn.State == ConnectionState.Closed)
conn.Open();
ds.Tables.Clear();
da.Fill(ds);
..........
da.update(ds);//或者da.update(ds.Tables[0]);
但這種方法是萬能的嗎?
現在人們對數據傳輸的安全性越來越重視,在實際使用時往往禁止客戶端直接向數據庫服務器發送連接信息,也就是類似“Data Source=xxx;Database=yyy;User ID=aaa;Password=bbb”這樣的信息。那用戶怎麼連接訪問數據庫呢?方法是在數據庫服務器上運行個數據代理,這個代理就是接收用戶的inser,update等數據操作字符串,並且負責連接數據庫進行操作,最後把結果打抱傳回到客戶斷。到這裏我們已經清楚,通過數據代理,我們把連接數據庫的操作都放到服務器上由數據代理完成,這樣就可以把安全性做的更高。
現在我們回到我們前面的問題,dataadapter.update的方法是萬能的嗎?通過上面的介紹我們知道,要使用數據代理或數據庫做了安全限制只允許本地訪問,那麼我們就沒有辦法在客戶端使用dataadapter讀取並更新數據庫,因爲客戶端要想使用dataadapter就必須向數據庫發送連接字符串,而這是安全性不允許的;那麼可不可以在數據代理中定義一個函數,其功能是連接數據庫並返回個dataadapter供客戶端使用呢?當然不可以.很簡單,客戶端無法訪問服務端定義的對象,返回的必定是null.
那怎麼辦呢?這裏可以採用一種沒有辦法的辦法。主要程序如下:
private bool UpdateDatabyAdapter(string strSelectQuery, DataTable dt)
{
try
{
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter();
SqlConnection myConn = new SqlConnection(數據庫連接字符串);
da.SelectCommand = new SqlCommand(strSelectQuery, myConn);
SqlCommandBuilder cb = new SqlCommandBuilder(da);
if (myConn.State == ConnectionState.Closed)
myConn.Open();
da.Fill(ds);
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = 0; j < dt.Columns.Count; j++)
{
ds.Tables[0].Rows[i][j] = dt.Rows[i][j];
}
}
da.Update(ds.Tables[0]);
}
catch
{
return false;
}
return true;
}
這個函數是封裝在數據代理中的,客戶端通過查詢串strSelectQuery將數據讀到內存表後綁定並修改,保存時需要將strSelectQuery原封不動的傳給UpdateDatabyAdapter函數(內容變動後的內存表也要傳進來,即dt),在該函數內部重新讀取到內存表(該內存表結構和dt是一樣的),然後把dt各行各列的值賦給它,最後用update更新就可以了。
這種方法在一定程度上能夠減少後面的代碼編寫量,又保證了數據的安全性,但總覺得有點笨拙,應該還有更好的辦法吧!