首先套用我原先例子資料轉換模式,即把Access資料庫中的資料去更新SQL Server資料庫,其中用到資料表結構是一樣的(這兒只是為了簡化操作,並不是必要條件,其實只要兩個資料庫中資料表的欄位要進行匹配即可,資料表可以是不一樣的)。
首先,先說說資料表結構,表名為“EmployeeInfo”。
欄位名 |
類型 |
備忘 |
EmployeeID |
Int |
自增欄位 |
EmployeeName |
Varchar(20) |
|
Password |
Varchar(20) |
|
Desciption |
Varchar(255) |
|
接著,在採用DBCommand+DataReader來進行資料庫資料的交換時,由於DataReader每次唯讀條資料,因此要立刻把當前讀到的資料去更新另一個資料庫。
具體代碼如下:
private void btnExchange_Click(object sender, System.EventArgs e)
{
OleDbConnection oleDBConn = new OleDbConnection();
oleDBConn.ConnectionString = yourFirstDBConnection + Application.StartupPath + @"/" + ACCESS_FILENAME;
try
{
oleDBConn.Open();//Open access db file
}
catch( Exception err )
{
MessageBox.Show( err.Message );
return;
}
string strQuery = "SELECT * FROM EmployeeInfo";
OleDbCommand myOleComm = new OleDbCommand( strQuery, oleDBConn );
OleDbDataReader myOleReader = null;
try
{
// Get data-reader from db command
myOleReader = myOleComm.ExecuteReader( CommandBehavior.CloseConnection );
UpdateWithReader( ref myOleReader );
myOleReader.Close();
}
catch( Exception err )
{
MessageBox.Show( err.Message );
oleDBConn.Close();
return;
}
}
private void UpdateWithReader( ref OleDbDataReader OleReader )
{
// Save data into sql-server using data set
// Stored procedure named "UpdateEmployee"
SqlConnection sqlConn = new SqlConnection();
sqlConn.ConnectionString = yourSecondDBConnection;
try
{
sqlConn.Open();//Connect to sql server
}
catch( Exception err )
{
MessageBox.Show( err.Message );
return;
}
// Init update-command
SqlCommand commUpdate = new SqlCommand( "UpdateEmployee" );
commUpdate.Connection = sqlConn;
commUpdate.CommandType = CommandType.StoredProcedure;
// Add command's parameters
commUpdate.Parameters.Add( "@EmployeeName",
SqlDbType.VarChar, 20 );
commUpdate.Parameters.Add( "@Password",
SqlDbType.VarChar, 20 );
commUpdate.Parameters.Add( "@Description",
SqlDbType.VarChar, 255 );
try
{
while( OleReader.Read() )
{
// Set parameters' value
commUpdate.Parameters["@EmployeeName"].Value = OleReader["EmployeeName"];
commUpdate.Parameters["@Password"].Value = OleReader["Password"];
commUpdate.Parameters["@Description"].Value = OleReader["Description"];
// Execute update-command
try
{
commUpdate.ExecuteNonQuery();
}
catch( SqlException err )
{
MessageBox.Show( err.Message );
}
}
commUpdate.Dispose();
sqlConn.Close();
}
catch( Exception err )
{
MessageBox.Show( err.Message );
sqlConn.Close();
return;
}
}
以上匯入到第二資料庫的時候,程式是去執行一個預存程序,即我在資料庫預存程序中去判斷是否要添加
一條新的記錄還是在原有記錄上進行修改,這樣可以減少程式中查詢判斷,那麼如果要匯入的資料庫支援
預存程序的話,我建議用此方法來做。
預存程序如下:
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