数据导入导出所存在的问题?
上一篇文章我已经提到了用事务来处理数据的导入导出问题,但是还存在一些问题,那就是插入数据的过程中,插入的值如果有单引号就会出现问题,还有就是日期型的数据如果不加以转换也会出现问题,一旦出现问题,事务就不能再提交了,所以我在原有代码的基础上加以修正这些存在的问题,如果还有问题的话,希望路过此地的朋友能够批评指出,并给本人提点建议.
string FLServerConnString = ConfigurationManager.ConnectionStrings ["ImportData.Properties.Settings.FLServerConnectionString"].ConnectionString;
string FLClientConnString = ConfigurationManager.ConnectionStrings["ImportData.Properties.Settings.FLClientConnectionString"].ConnectionString;
public DownloadDB()
{
InitializeComponent();
}
public bool ImportToClient(string tableName)
{
SqlConnection connServer = new SqlConnection(FLServerConnString);
connServer.Open();
SqlCommand cmdServer = new SqlCommand();
cmdServer.Connection = connServer;
cmdServer.CommandTimeout = 0;
cmdServer.CommandText = "select * from " + tableName;
SqlDataReader drServer = cmdServer.ExecuteReader();
SqlConnection connClient = new SqlConnection(FLClientConnString);
connClient.Open();
SqlCommand cmdClient = new SqlCommand();
SqlTransaction clientTran;
clientTran = connClient.BeginTransaction();
cmdClient.Connection = connClient;
cmdClient.Transaction = clientTran;
cmdClient.CommandTimeout = 0;
cmdClient.CommandText = "delete from " + tableName;
cmdClient.ExecuteNonQuery();
try
{
string insertClientSql = "";
object[] objectServerColumns = new object[drServer.FieldCount];
while (drServer.Read())
{
insertClientSql = "insert into " + tableName + " values(";
for (int i = 0; i < objectServerColumns.Length - 1; i++)
{
int j = drServer.GetValues(objectServerColumns);//此處一定不可缺少
string s = objectServerColumns[i].GetType().ToString();
if (objectServerColumns[i].GetType().ToString() == "System.DBNull")
{
insertClientSql += "null,";
}
else if (objectServerColumns[i].GetType().ToString() == "System.DateTime")
{
insertClientSql += "'"+Convert.ToDateTime(objectServerColumns[i]).ToShortDateString()+"',";
}
else
{
insertClientSql += "'" + objectServerColumns[i].ToString().Replace("'","''") +"',";
}
}
if (objectServerColumns[objectServerColumns.Length - 1].GetType().ToString() == "System.DBNull")
{
insertClientSql += "null)";
}
else if(objectServerColumns[objectServerColumns.Length-1].GetType().ToString()=="System.DateTime")
{
insertClientSql += "'"+Convert.ToDateTime(objectServerColumns[objectServerColumns.Length-1]).ToShortDateString()+"')";
}
else
{
insertClientSql += "'" + objectServerColumns[objectServerColumns.Length - 1].ToString().Replace("'","''") + "')";
}
cmdClient.CommandText = insertClientSql;
cmdClient.ExecuteNonQuery();
}
connServer.Close();//此處一定要關閉
clientTran.Commit();
drServer.Close();
return true;
}
catch (Exception ee)
{
clientTran.Rollback();
return false;
}
finally
{
connClient.Close();
}
}
private void downDB_Click(object sender, EventArgs e)
{
string[] tableNames ={ "BM", "BZ","CSCP","XCLCZ"};
int k;
progressBar1.Maximum = tableNames.Length - 1;
for (k = 0; k < tableNames.Length - 1; k++)
{
progressBar1.Value=k;
if (ImportToClient(tableNames[k]) == false)
{
MessageBox.Show("表" + tableNames[k] + "之後的數據復制失敗!");
break;
}
}
if (k == (tableNames.Length - 1))
{
if (ImportToClient(tableNames[k]))
{
progressBar1.Value = tableNames.Length - 1;
MessageBox.Show("所有指定表數據都已成功復制!");
}
else
MessageBox.Show("最後一個表復制失敗!");
}