这两天在做一个可以转换数据库的小程序,用于将不同结构的两个数据库之间导数据。之前几乎从没有接触过数据库,只会一些简单的删除插入,这次面对复杂的,截然不同的表结构,一时间竟无从下手。百度谷歌都用上了,最后决定使用SQLBulkCopy类。
作为新人,面对一个从没有做过的Demo总是会有种种恐惧,生怕一不小心走了歪路。虽然从学习的角度来说,设计过程中走走歪路是有好处的。但是工作耽误不得,7天的开发时间是不容马虎的。
理清表结构之间的对应关系,就用了2天时间。最后确定用SQLBulkCopy,是在周公的博客上看到关于SQLBulkCopy类的使用方法,非常简单易懂,SQLBulkCopy类可以从多张不同字段名,不同表结构的数据表中,提取出需要的数据,导入到你需要的表格字段中。在这之前你只需要设置一下对应关系就行了。毫无疑问这能解决我的需求。花了2天时间,做好了这个Demo,通过从配置文件中读取的信息,分离出对应关系,SQL语句,目标表名,传入到导数据的函数中就可以了。
SQL语句和表名都是STRING,对应关系则可以用哈希表来存储。3个属性最好都储存在一个对象中。以下是关键代码
private void convert(string SQL, string TableNmae,Hashtable st)
{
SqlDataReader sdr = null;
count = 0;
try
{
SqlCommand cmd = new SqlCommand(SQL, dbcOld.DB_SQLConnection);
sdr = cmd.ExecuteReader();
SqlBulkCopy bulkCopy = new SqlBulkCopy(dbcNew.DB_SQLConnection);
//通过提取哈希表的元素,来记录对应关系
foreach (string str in st.Keys)
{
bulkCopy.ColumnMappings.Add(str, st[str].ToString());
}
//设置目标表名称
bulkCopy.DestinationTableName = TableName;
//每导入1条数据就执行一次SqlRowsCopied方法
bulkCopy.NotifyAfter = 1;
bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied);
bulkCopy.WriteToServer(sdr);
}
catch (Exception ex)
{
throw ex;
}
finally
{
sdr.Close();
}
}
经理说,数据量比较大,需要设置进度条。5个表一共6000条左右的记录,我导入用了大概1秒钟。我开玩笑说,可惜了这根进度条!
今天是第5天,结束了埋头苦干的日子,感觉终于有时间来总结一下了。于是就去周公的博客逛了逛,发现里面的文章大都是非常宝贵的实战开发经验,范围也很广,从C#开发和JAVA开发,还有数据库实用语句等。给人感觉仿佛是他的这一路走来,把脚印都一个个写在了博客中。对于新人来说,是非常有启发的。