问题描述:
打算对一个公司自己的行业软件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());
}