在之前操作了EXCEL存入数据库之后,我发现存在好多问题,这次加以改进。
本次主要进行的工作有:
1,创建一个XML文件,主要在里面定义数据库表名,是否重建表,excel文件路径,是否导入该文件。
2,操作该XML读取信息并根据属性值创建数据库表,插入数据等。
XML文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<Files>
<File Finished="false">
<TableName IsExist="false">
Interments
</TableName>
<Path>
C:\\projects\\CMS\\UserData\\CemeCare_Excel\\Interment Records (through 8-1-2009).xls
</Path>
</File>
<File Finished="false">
<TableName IsExist="false">
Plots
</TableName>
<Path>
C:\\projects\\CMS\\UserData\\CemeCare_Excel\\PLOT FILES (Sections 1 - 99).xls
</Path>
</File>
</Files>
有了这个XML,我们就可以自由定位xls数据文件位置,并可以自己给表设定名字。对于多个excel插入一个表的情况,则只需指定IsExist="false"即可。
相关代码如下:
static void Main( string [] args)
{
XmlDocument doc = new XmlDocument();
string xmlFile = " ImportFiles.xml " ;
doc.Load(xmlFile);
XmlNode node = doc.SelectSingleNode( " Files " );
foreach (XmlNode xn in node.ChildNodes)
{
if (xn.Attributes[ " Finished " ].Value.ToString().ToLower() == " false " )
{
XmlNode tableNode = xn.FirstChild;
XmlNode pathNode = xn.LastChild;
string tableName = tableNode.InnerText.Trim();
string path = pathNode.InnerText.Trim();
string fileName = System.IO.Path.GetFullPath(path);
DataSet ds = ImportExcel(fileName);
if (tableNode.Attributes[ " IsExist " ].Value == " false " )
{
CreateTable(tableName, ds.Tables[ 0 ]);
}
ToDataBase(ds, tableName);
}
}
Console.WriteLine( " Finished " );
Console.ReadLine();
}
private static void CreateTable( string tableName, DataTable dt)
{
string sql = " IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ " + tableName + " ]') AND type in (N'U')) "
+ " DROP TABLE [dbo].[ " + tableName + " ] "
+ " " ;
Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery( " server=local;database=TestData;uid=sa;pwd=; " , CommandType.Text, sql);
string sqlCreate = @" CREATE TABLE [dbo].[ " + tableName + " ]( " ;
for ( int i = 0 ; i < dt.Columns.Count; i ++ )
{
sqlCreate = sqlCreate + " [ " + dt.Columns[i].ColumnName + " ] " + " nvarchar(255) null " ;
if (i != dt.Columns.Count - 1 )
{
sqlCreate = sqlCreate + " , " ;
}
}
sqlCreate = sqlCreate + " ) ON [PRIMARY] " ;
Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery( " server=local;database=TestData;uid=sa;pwd=; " , CommandType.Text, sqlCreate);
}
关于数据访问我就没有细写,大家可以根据自己的数据访问层情况自由改动就可以了。本文没什么技术含量,但真的对我的DataMigration帮助很大,使转移过程更自动化并且可配置,并且这是真实的应用。欢迎筒子们拍砖。
另有一个问题,也就是因为这个问题才导致的这些代码的出现:大家在使用sqlserver的import data时有没有出现这样一种状况---某列数据大多是(特别是前100行)数字,但是后来有些是数字+字符,这样在import结束后,那些带字符的数据就变成null了,并且系统自动认为该列是数字型。这个问题困扰我很久,到现在也没能解决。