如何在 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 或任何其他可用的列表中,然后在数据库中创建一个表
谢谢里法特
我不太明白你想做什么,我无法发表评论,因为我没有足够的积分。但我认为您将不得不在阵列上使用 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);
...
我同意创建这样的表通常是不好的做法,因此我建议您在应用程序的上下文中考虑此方法的安全影响;