我仍在學習相當多的編程,所以這可能是一個明顯的問題,但我正在編寫一個程序,用戶可以導入沒有列約束的excel文件這意味着每個excel文件可能有不同數量的列,等等)。我想要做的是能夠使用SQLite將導入的Excel文件轉換爲數據庫表。據我所知,SQLite的語法與ADO語法相同,但我不確定如何在數據庫中動態創建表。我正在尋找任何形式的建議,如果有人覺得在代碼中展示一個很酷的例子。C#動態添加列到數據庫中的表
謝謝! Nathan
我仍在學習相當多的編程,所以這可能是一個明顯的問題,但我正在編寫一個程序,用戶可以導入沒有列約束的excel文件這意味着每個excel文件可能有不同數量的列,等等)。我想要做的是能夠使用SQLite將導入的Excel文件轉換爲數據庫表。據我所知,SQLite的語法與ADO語法相同,但我不確定如何在數據庫中動態創建表。我正在尋找任何形式的建議,如果有人覺得在代碼中展示一個很酷的例子。C#動態添加列到數據庫中的表
謝謝! Nathan
下面是SQLite中創建表的一段代碼:
SQLiteConnection mDBcon = new SQLiteConnection();
mDBcon.ConnectionString = "Data Source=" + DataSourcePath;
mDBcon.Open();
SQLiteCommand cmd = new SQLiteCommand(mDBcon);
cmd.CommandText = "CREATE TABLE IF NOT EXISTS tags (ISBN VARCHAR(15), Tag VARCHAR(15));";
cmd.ExecuteNonQuery();
注意,SQLite中只能添加coloumn到現有的表,並只對表的末尾:
cmd.CommandText = "ALTER TABLE books ADD COLUMN PublishDate DateTime;";
cmd.ExecuteNonQuery();
加成
假設您導入從Excel數據到數據集中, 您現在可以伊特通過數據集的數據表率,建立相應的表格,並填寫他們: (免責聲明,沒有測試過)
foreach(DataTable table in dataSet.Tables)
{
SQLiteCommand cmd = new SQLiteCommand(mDBcon);
cmd.CommandText = "CREATE TABLE IF NOT EXISTS " + table.Name + "(";
bool first = true;
foreach (DataColumn column in table.Columns)
{
cmd.CommandText += "@"+column.Name;
if (!first) cmd.CommandText += ",";
else first = false;
cmd.Parameters.Add(new SQLiteParameter("@"+column.Name, column.Name));
}
cmd.CommandText += ");";
cmd.ExecuteNonQuery();
// Fill the new table:
SQLiteDataAdapter da = new SQLiteDataAdapter("select * from " + table.Name, mDBcon);
da.Fill(table);
}
啊,我不知道你必須得製作一張桌子,但這並不是什麼大事。我想我的主要問題是我無法弄清楚如何逐步從Excel文件中獲取列名,獲取它們的關聯類型,然後如何將它轉換爲創建表語句。如果我將導入轉換爲數據集,我可以使用數據集模式作爲我的數據庫表模式嗎? – Nathan 2009-10-15 00:39:35
@Nathan:沒有使用數據集來將數據導入sqlite,但由於它具有完整的ADO支持,我假定你可以。 – Amirshk 2009-10-15 00:49:25
你可以想一想我如何從數據集中取出列並使用ADO將它添加到Create Table語句的例子嗎? – Nathan 2009-10-15 00:59:31
您可以使用ExecuteNonQuery創建您的表格,使用標準SQLite Query Language for CREATE TABLE。
是否尋找到另一種解決方案成爲可能。爲每個加載的文件創建一個表是一個壞主意,想想擁有10000個表。 – 2009-10-15 01:25:56