在之前操作了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了,並且系統自動認為該列是數字型。這個問題困擾我很久,到現在也沒能解決。