我仍在学习相当多的编程,所以这可能是一个明显的问题,但我正在编写一个程序,用户可以导入没有列约束的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