2016-08-05 17 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); 
      }