我不同意前面的答案,因为提供的代码正在生成具有单个列的多个 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);
...
我同意创建这样的表通常是不好的做法,因此我建议您在应用程序的上下文中考虑这种方法的安全隐患;