我以前的答案不同意,因爲提供的代碼生成多個CREATE TABLE語句與單個列,自表已經存在將在第二次迭代失敗。
您可以使用此行來看看爲什麼你的原始代碼不起作用:
CREATE TABLE [TABLE_NAME] ([id] INT NULL, [name] CHAR (20) NULL, [test1,test2] CHAR (20) NULL)
它:
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] 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);
...
我同意,所以一般不好的做法來創建這樣的表,所以我建議你考慮你的應用程序的範圍內這種方法的安全隱患;
數組包含什麼?字段的名稱?如果是這樣,你會在哪裏獲得類型? –
爲什麼ArrayList而不是列表? –
你不覺得你應該遍歷你的列表並將你的字段附加到你的命令字符串! – VahidNaderi