问题描述:

打算对一个公司自己的行业软件A的项目进行管理,但是不想在原项目代码上修改,因为一方面源程序不是我开发的,还没完全熟悉;二是我要写的模块没有太多数据要求,只要获取已有项目清单由用户标记是否可以清理或者需不需要加密。所以我打算自己写一个独立的软件B,而借用软件A中的项目数据表tableP。于是我就需要从A的数据库服务器读取tablePA,完全复制给我自己的软件B的数据库表tablePB。在B的代码中仅操作tablePB,呈现给需要管理项目的用户,所以用户对项目的操作不会影响A服务器数据,保障了A的数据安全。当需要获得最新的项目清单,可触发同步操作获取数据。但是在进行同步的时候遇到问题,网上查询各种方法后,选用了DataSet更新的方法:

       SqlConnection tmpConn = new SqlConnection();

DataSet ds = new DataSet();

tmpConn.ConnectionString = "Data Source=**;Initial Catalog=**;user=sa;pwd=**;Integrated Security=false";//源数据库连接字符串

curConn.ConnectionString = "Data Source=**;Initial Catalog=**;user=sa;pwd=**;Integrated Security=false";//目标数据库连接字符串

try

{

SqlCommand cmdSelectData1=new SqlCommand ("Select * from dbo.xProject",tmpConn );

SqlCommand cmdSelectData2 = new SqlCommand("Select * from dbo.xProject", curConn);

tmpConn.Open();

         curConn.Open();

SqlDataAdapter adaFrom = new SqlDataAdapter(cmdSelectData1);

SqlDataAdapter adaTo = new SqlDataAdapter(cmdSelectData2);

adaFrom.Fill(ds);

SqlCommandBuilder cb= new SqlCommandBuilder(adaTo); //新建一个 SqlCommandBuilder

foreach (DataRow dr in ds.Tables[0].Rows)//此部分用于将DataSet中的 DataRow 的 Rowstate 更改为 Added

{

dr.SetAdded();

}

     //这里是必须的,DbDataAdapter.Update (DataSet)为指定 DataSet 中每个已插入、已更新或已删除的行调用相应的 INSERT、UPDATE 或 DELETE 语句。如果不调用setAdded(),DataSet中数据状态都是无改变的,所以     不能进行更新操作

adaTo.Update(ds);

tmpConn.Close();

labelMessage.Text = "同步已完成!";

}

catch (Exception ex)

{

if (tmpConn.State ==ConnectionState.Open)

tmpConn.Close();

MessageBox.Show(ex.Message.ToString());

}