0

我想通过 Visual Studio C# 创建一个 SQL 表,并让它的字段来自一个数组列表。我当前的代码如下所示。

    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);
        }
    }

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

谢谢,里法斯

4

2 回答 2

1

我不太明白您要做什么,也无法发表评论,因为我没有足够的积分。但我认为你将不得不在你的阵列上使用 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);
    }
}
于 2013-10-10T18:39:39.530 回答
0

我不同意前面的答案,因为提供的代码正在生成具有单个列的多个 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);
...

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

于 2013-10-10T22:01:16.543 回答