采用数据代理如何使用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更新就可以了。

    这种方法在一定程度上能够减少后面的代码编写量,又保证了数据的安全性,但总觉得有点笨拙,应该还有更好的办法吧!

你可能感兴趣的:(.net,数据库,dataset,数据库,数据库服务器,string,insert,delete)