【问题标题】:C# Dynamically Add Columns to table in DatabaseC# 动态地将列添加到数据库中的表中
【发布时间】:2009-10-16 21:41:31
【问题描述】:

我还在学习很多关于编程的知识,所以这可能是一个显而易见的问题,但我正在编写一个程序,用户可以在其中导入没有列约束的 excel 文件(这意味着每个 excel 文件可能有不同的列数等)。我想要做的是能够使用 SQLite 将导入的 excel 文件转换为数据库表。据我所知,SQLite 的语法与 ADO 语法相同,但我不确定如何在数据库中动态创建表。如果有人想在代码中展示一个很酷的示例,我正在寻找任何形式的建议。

谢谢! 内森

【问题讨论】:

  • 是否可以研究另一种解决方案。为每个加载的文件创建一个表是个坏主意,想想拥有 10000 个表。

标签: c# sqlite


【解决方案1】:

下面是一段在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 中,您只能将列添加到现有表中,并且只能添加到表的末尾:

cmd.CommandText = "ALTER TABLE books ADD COLUMN PublishDate DateTime;";
cmd.ExecuteNonQuery();

加法

假设您将数据从 excel 导入数据集, 您现在可以遍历 DataSet 的 DataTables,创建相应的表并填充它们: (免责声明,未测试)

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 文件中获取列名,获取它们的关联类型,然后如何将其转换为 Create Table 语句。如果我将导入转换为数据集,我可以使用数据集模式作为我的数据库表模式吗?
  • @Nathan:还没有使用数据集将数据导入 sqlite,但由于它具有完整的 ADO 支持,我认为你可以。
  • 你能想出一个例子,说明我如何从数据集中获取列并使用 ADO 将其添加到 Create Table 语句中?
  • 哇,谢谢,我会把它应用到我的代码中。明天我会告诉你结果如何。
【解决方案2】:

您可以只使用ExecuteNonQuery 来创建您的表,使用标准的SQLite Query Language for CREATE TABLE。

【讨论】:

    猜你喜欢
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 2014-12-20
    相关资源
    最近更新 更多