数据库之间数据交换,是比较费时,也是比较麻烦的,人们在做类似操作的时候,不希望一条一条的去写SQL语句。那么我最近作了一个DEMO,通过使用DataAdapter+Dataset可以方便的完成数据库之间的更新操作。
我的例子是把Access数据库中的数据去更新SQL Server数据库,其中用到数据表的结构一样(这儿只是为了简化操作,并不是必要条件,其实只要两个数据库中数据表的字段要进行匹配即可,数据表可以是不一样的)。
首先,先说说数据表结构,表名为“EmployeeInfo”。
字段名 |
类型 |
备注 |
EmployeeID |
Int |
自增字段 |
EmployeeName |
Varchar(20) |
|
Password |
Varchar(20) |
|
Desciption |
Varchar(255) |
|
接着,要先从Access数据库中读取数据,代码如下:
private const string TABLE_NAME = "EmployeeInfo";
private DataSet dsData = null;
private void btnLoad_Click(object sender, System.EventArgs e)
{
// Load data from access db file
OleDbConnection oleDBConn = new OleDbConnection();
oleDBConn.ConnectionString = yourDBConnectionString
try
{
oleDBConn.Open();//Open access db file
}
catch( Exception err )
{
MessageBox.Show( err.Message );
return;
}
string strQuery = "SELECT * FROM EmployeeInfo";
OleDbDataAdapter myDAdapter = new OleDbDataAdapter( strQuery, oleDBConn );
DataSet dsSource = new DataSet();
try
{
// Get data from access db file
myDAdapter.Fill( dsSource, TABLE_NAME );
// Release ado.net resource
myDAdapter.Dispose();
oleDBConn.Close();
}
catch( Exception err )
{
MessageBox.Show( err.Message );
oleDBConn.Close();
return;
}
// Process data set
ExchangeDS( out dsData, ref dsSource );
}
private void ExchangeDS( out DataSet dsDest, ref DataSet dsSource )
{
// Create new data set
dsDest = new DataSet( );
DataTable dtDest = new DataTable( TABLE_NAME );
dsDest.Tables.Add( dtDest );
// Add data column
dsDest.Tables[TABLE_NAME].Columns.Add(
new DataColumn( "EmployeeID", typeof(int) ) );
dsDest.Tables[TABLE_NAME].Columns.Add(
new DataColumn( "EmployeeName", typeof(string) ) );
dsDest.Tables[TABLE_NAME].Columns.Add(
new DataColumn( "Password", typeof(string) ) );
dsDest.Tables[TABLE_NAME].Columns.Add(
new DataColumn( "Description", typeof(string) ) );
// Add data row from source data set
while( dsSource.Tables[TABLE_NAME].Rows.Count > 0 )
{
DataRow dr = dsSource.Tables[TABLE_NAME].Rows[0];
dsDest.Tables[TABLE_NAME].Rows.Add( dr.ItemArray );
dsSource.Tables[TABLE_NAME].Rows.Remove( dr );
}
}
这里需要注意的是“ExchangeDS”函数,如果DataSet没有发生任何变化,那么用DataAdapter是无法更新数据库的,那么这个函数的目的造成DataSet中的记录发生变化,本来想用DataSet.Merge方法,发现也无法用DataAdapter来无法更新数据库的,因此只能一条记录一条记录进行复制了。
下面就是如何用DataSet来更新SQL Server数据库了。我这里调用的是一个存储过程,有存储过程去判断到底是插入数据,还是在原有记录上去更新,存储过程如下:
CREATE PROCEDURE UpdateEmployee
@EmployeeName varchar(20),
@Password varchar(20),
@Description varchar(255)
AS
IF EXISTS( SELECT EmployeeID FROM EmployeeInfo WHERE EmployeeName = @EmployeeName )
BEGIN
-- Update the previous record in EmployeeRegionInfo table
UPDATE EmployeeInfo SET Password = @Password, Description = @Description
WHERE EmployeeName = @EmployeeName
END
ELSE
BEGIN
-- Insert a new record in EmployeeRegionInfo table
INSERT INTO EmployeeInfo
( EmployeeName, Password, Description )
VALUES ( @EmployeeName, @Password, @Description )
END
GO
实际更新操作的代码如下:
private void btnSave_Click(object sender, System.EventArgs e)
{
// Save data into sql-server using data set
// Stored procedure named "UpdateEmployee"
SqlConnection sqlConn = new SqlConnection();
sqlConn.ConnectionString = yourDBConnectionString
try
{
sqlConn.Open();//Connect to sql server
}
catch( Exception err )
{
MessageBox.Show( err.Message );
return;
}
SqlDataAdapter myDAdapter = new SqlDataAdapter();
myDAdapter.InsertCommand = new SqlCommand( "UpdateEmployee" );
myDAdapter.InsertCommand.Connection = sqlConn;
myDAdapter.InsertCommand.CommandType = CommandType.StoredProcedure;
myDAdapter.InsertCommand.Parameters.Add( "@EmployeeName",
SqlDbType.VarChar, 20, "EmployeeName" );
myDAdapter.InsertCommand.Parameters.Add( "@Password",
SqlDbType.VarChar, 20, "Password" );
myDAdapter.InsertCommand.Parameters.Add( "@Description",
SqlDbType.VarChar, 255, "Description" );
try
{
myDAdapter.Update( dsData, TABLE_NAME );
myDAdapter.Dispose();
sqlConn.Close();
}
catch( Exception err )
{
MessageBox.Show( err.Message );
sqlConn.Close();
return;
}
}