2016-08-05 6 views
0

私は以下のようにSqlServerのデータテーブルを作成するために、SqlCommandオブジェクトの文字列を持っている者:テキストボックスで上記の文字列のテーブル名を置き換えの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の脆弱性が発生します。正しい方法は、パラメータ化されたクエリを使用することです。

残念ながら、パラメータは値としてのみ使用できますが、テーブル名や列名には使用できません。あなたはtextBox.Textが有効なテーブル名ではなく"; DROP TABLE Users --"のようなものであることを確認する必要があり

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

しかし:そう簡単にあなたは、単にそのようReplace()を行うことができ、あなたのクエリでテーブル名を置き換えます。 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

私は '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); 
      } 
関連する問題