如何在 sql 中使用 Visual Studio c# 中的数组列表中的字段创建表

本文关键字:列表 数组 字段 创建 Visual sql Studio | 更新日期: 2023-09-27 18:34:52

我想通过Visual Studio c#创建一个SQL表,并使其字段来自arraylist。我当前的代码如下所示。

    private void Create_Click(object sender, EventArgs e)
    {
        try
        {
            ArrayList flds = new ArrayList();
            flds.Add("test1");
            flds.Add("test2");
            conn.Open();
            cmd = new SqlCommand("CREATE TABLE [" + Tbname.Text + "] ([id] INT NULL, [name] CHAR (20) NULL, [" + flds + "] CHAR (20) NULL)", conn);
            cmd.ExecuteNonQuery();
            conn.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

更新:我使用 arraylist 的原因是,我需要用户能够通过应用程序创建表(我知道这不是好的做法(,并且字段的数量可能会有所不同。(该应用程序从用户那里获取字段名称,将它们存储在 arraylist 或任何其他可用的列表中,然后在数据库中创建一个表

谢谢里法特

如何在 sql 中使用 Visual Studio c# 中的数组列表中的字段创建表

我不太明白你想做什么,我无法发表评论,因为我没有足够的积分。但我认为您将不得不在阵列上使用 FOREACH...

仅供参考...通过应用程序创建表通常是一个巨大的禁忌。您通常希望将数据插入到预先存在的表中。

应该看起来像这样...

private void Create_Click(object sender, EventArgs e)
{
    try
    {
        ArrayList flds = new ArrayList();
        flds.Add("test1");
        flds.Add("test2");
        conn.Open();
Foreach Item in flds
{
        cmd = new SqlCommand("CREATE TABLE [" + Tbname.Text + "] ([id] INT NULL, [name] CHAR (20) NULL, [" + Item + "] CHAR (20) NULL)", conn);
        cmd.ExecuteNonQuery();
}
        conn.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

我不同意前面的答案,因为提供的代码正在生成具有单个列的多个 CREATE TABLE 语句,并且在第二次迭代时将失败,因为表已经存在。

您可以使用此行查看原始代码不起作用的原因:

System.Diagnostics.Debug.WriteLine("CREATE TABLE [" + Tbname.Text + "] ([id] INT NULL, [name] CHAR (20) NULL, [" + flds + "] CHAR (20) NULL)");

您将从输出中看到您错误地构造了 SQL:

CREATE TABLE [TABLE_NAME] ([id] INT NULL, [name] CHAR (20) NULL, [test1,test2] CHAR (20) NULL)

它应该是:

CREATE TABLE [TABLE_NAME] ([id] INT NULL, [name] CHAR (20) NULL, [test1] CHAR (20) NULL, [test2] CHAR (20) NULL)

以下是一些执行所需操作的方法。若要使用这些示例,需要导入 Linq 命名空间(如果尚未导入

(:
using System.Linq;

要尽可能少地修改现有代码,这应该可以工作:

private void Create_Click(object sender, EventArgs e)
{
    try
    {
        ArrayList flds = new ArrayList();
        flds.Add("test1");
        flds.Add("test2");
        var columnDef = string.Join(",", flds.Select(fld => string.Format("[{0}] CHAR (20) NULL", fld)));
        conn.Open();
        cmd = new SqlCommand("CREATE TABLE [" + Tbname.Text + "] ([id] INT NULL, [name] CHAR (20) NULL, " + columnDef + ")", conn);
        cmd.ExecuteNonQuery();
        conn.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

如果要对可读性进行一些更改,可以执行以下操作:

var flds = new [] { "test1", "test2" };
...
var rawSql = "CREATE TABLE [{0}] ([id] INT NULL, [name] CHAR (20) NULL, {1})";
var rawColumnDef = "[{0}] CHAR (20) NULL";
var columnDef = string.Join(",", flds.Select(fld => string.Format(rawColumnDef, fld)));
var sql = string.Format(rawSql, Tbname.Text, columnDef);
...
cmd = new SqlCommand(sql, conn);
...

然后,仅仅因为我喜欢单行:

...
var cmd = new SqlCommand(string.Format("CREATE TABLE [{0}] ([id] INT NULL, [name] CHAR (20) NULL, {1})", 
                                       Tbname.Text, 
                                       string.Join(",", flds.Select(fld => string.Format("[{0}] CHAR (20) NULL", fld)))), conn);
...

同意创建这样的表通常是不好的做法,因此我建议您在应用程序的上下文中考虑此方法的安全影响;