2013-10-10 63 views
0

一個ArrayList,我想創建通過Visual Studio C#SQL表,並有其字段創建SQL與字段的表來自一個ArrayList。我現在的代碼看起來像這樣。如何從在Visual Studio C#

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

UPDATE: 使用ArrayList中的原因Im爲,我需要的用戶能夠通過應用程序來創建表(我知道它不是好的做法)和字段可能會有所不同的量。 (該應用從用戶獲得字段名,將它們存儲在一個ArrayList或者任何其它會工作列表,然後會在DB

謝謝表, Rifath

+2

數組包含什麼?字段的名稱?如果是這樣,你會在哪裏獲得類型? –

+0

爲什麼ArrayList而不是列表? –

+0

你不覺得你應該遍歷你的列表並將你的字段附加到你的命令字符串! – VahidNaderi

回答

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

我以前的答案不同意,因爲提供的代碼生成多個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); 
... 

我同意,所以一般不好的做法來創建這樣的表,所以我建議你考慮你的應用程序的範圍內這種方法的安全隱患;