採用數據代理如何使用SqlDataAdapter

    在項目開發時,經常需要把數據庫中的數據通過內存表讀出,然後綁定到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更新就可以了。

    這種方法在一定程度上能夠減少後面的代碼編寫量,又保證了數據的安全性,但總覺得有點笨拙,應該還有更好的辦法吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章