2016-08-05 43 views
0

我有一個SqlCommand字符串創建一個SqlServer的數據表如下:C#,SqlCommand的字符串

`string EFTGeneral = @`"CREATE TABLE [EFT.GER2] (
           [TestOrderName] VARCHAR(20) NOT NULL,  
           [Template]  VARCHAR(50) NULL, 
           [Purpose]   VARCHAR(100) NULL, 
           [Category]  VARCHAR(50) NULL, 
           [DateCreated]   DATETIME NULL, 
           [CreatedBy]  VARCHAR(30) NULL, 
           [TestObjectBatch] VARCHAR(20) NULL, 
           [LoadDirection] VARCHAR(2) NULL, 
           [ElementType]  VARCHAR(10) NULL, 
           [FatigueTestType] VARCHAR(50) NULL, 
           [LoadAmplitude]   INT NULL, 
           [LoadStatic]  INT NULL, 
           [UntilBreakage] VARCHAR(5) NULL, 
           [NumberOfObject]   INT NULL, 
           [Remarks]   VARCHAR(200) NULL, 
           PRIMARY KEY CLUSTERED([TestOrderName] ASC));"; 

但我想通過dynamitically創建表的名稱由文本框上面的字符串替換表名。文字,我該怎麼辦?非常感謝

回答

0

通常我會說「不要這樣做」,因爲將用戶輸入插入到您的查詢中會打開SQL injection漏洞。正確的方法是使用參數化查詢。

不幸的是,參數只能用於值,而不能用於表或列名。所以可以輕鬆地在您的查詢替換表名,你可以簡單地做一個Replace()這樣的:

EFTGeneral = EFTGeneral.Replace("[EFT.GER2]", "[" + textBox.Text + "]"); 

你應該確保textBox.Text是一個有效的表名,而不是像"; DROP TABLE Users --"This answer顯示瞭如何驗證表名。

+0

親愛的,謝謝你非常適合你的快速回答。我修復了這個問題: – Nam

0

使用SqlCommand動態構建查詢,避免注射的風險:

string EFTGeneral = @"CREATE TABLE [[email protected]] (
           [TestOrderName] VARCHAR(20) NOT NULL,  
           [Template]  VARCHAR(50) NULL, 
           [Purpose]   VARCHAR(100) NULL, 
           [Category]  VARCHAR(50) NULL, 
           [DateCreated]   DATETIME NULL, 
           [CreatedBy]  VARCHAR(30) NULL, 
           [TestObjectBatch] VARCHAR(20) NULL, 
           [LoadDirection] VARCHAR(2) NULL, 
           [ElementType]  VARCHAR(10) NULL, 
           [FatigueTestType] VARCHAR(50) NULL, 
           [LoadAmplitude]   INT NULL, 
           [LoadStatic]  INT NULL, 
           [UntilBreakage] VARCHAR(5) NULL, 
           [NumberOfObject]   INT NULL, 
           [Remarks]   VARCHAR(200) NULL, 
           PRIMARY KEY CLUSTERED([TestOrderName] ASC));"; 

using (SqlConnection connection = new SqlConnection(yourConnectionString)) 
{ 
    using (SqlCommand command = new SqlCommand(EFTGeneral, connection)) 
    { 
     SqlParameter tableNameParam = new SqlParameter("tableName", SqlDbType.Varchar); 
     tableNameParam.Value = textBox.Text; 
     command.Parameters.Add(tableNameParam); 
     command.ExecuteNonQuery(); 
    } 
} 
+0

謝謝。我也會嘗試你的幫助。 – Nam

+0

Plz通知我在代碼中修復了CREATE TABLE [EFT。@ tableName](' –

0

這裏是我的代碼,現在我可以創建SQL表的名字,因爲我想:

try 
      { 
       string EFTGeneral = @"CREATE TABLE [EFTGNR] (
           [TestOrderName] VARCHAR(20) NOT NULL,  
           [Template]  VARCHAR(50) NULL, 
           [Purpose]   VARCHAR(100) NULL, 
           [Category]  VARCHAR(50) NULL, 
           [DateCreated]   DATETIME NULL, 
           [CreatedBy]  VARCHAR(30) NULL, 
           [TestObjectBatch] VARCHAR(20) NULL, 
           [LoadDirection] VARCHAR(2) NULL, 
           [ElementType]  VARCHAR(10) NULL, 
           [FatigueTestType] VARCHAR(50) NULL, 
           [LoadAmplitude]   INT NULL, 
           [LoadStatic]  INT NULL, 
           [UntilBreakage] VARCHAR(5) NULL, 
           [NumberOfObject]   INT NULL, 
           [Remarks]   VARCHAR(200) NULL, 
           PRIMARY KEY CLUSTERED([TestOrderName] ASC));"; 
       //// 

       SqlConnection conn = new SqlConnection(ConnString); 
       conn.Open(); 
       EFTGeneral = EFTGeneral.Replace("[EFTGNR]", "[" + txtbox_testorder.Text + ".GERNERAL]"); 
       SqlCommand cmd = new SqlCommand(EFTGeneral, conn); 
       cmd.ExecuteNonQuery(); 
       conn.Close(); 
      }catch(Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      }