2012-12-22 32 views
6

私はC#とSQLの初心者です。実行したいSQL挿入ステートメントがあります。それは、挿入したい他の変数の中でテーブル名を尋ねます。テーブル変数@tableを宣言する必要があります

しかし、私は、このコンソールアプリケーションを実行したときに私はこのエラーを取得:

StreamReader my_reader = getFile(args); 
string CS = formCS(); 
try 
{ 
    using (SqlConnection con = new SqlConnection(CS)) 
    { 
     SqlCommand com = new SqlCommand("insert into @table (time, date, pin) values (@time, @date, @pin)", con);      
     con.Open(); 
     Console.WriteLine("Enter table name:"); 
     Console.Write(">> "); 
     string tblname = Console.ReadLine(); 
     com.Parameters.AddWithValue("@table", tblname); 

     string line = ""; 
     int count = 0; 
     while ((line = my_reader.ReadLine()) != null) 
     { 
      Dictionary<string, string> result = extractData(line);       
      com.Parameters.AddWithValue("@time", result["regTime"]); 
      com.Parameters.AddWithValue("@date", result["regDate"]); 
      com.Parameters.AddWithValue("@pin", result["regPin"]); 
      count += com.ExecuteNonQuery(); 
      com.Parameters.Clear();       

     } 
     Console.WriteLine("Recoreds added : {0}", count.ToString()); 
     Console.WriteLine("Press Enter to exit."); 
    } 
    Console.ReadLine(); 
} 
catch (SqlException ex) 
{ 
    Console.WriteLine(ex.Message); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex.Message);     
} 
+5

あなたのinsert statememtのテーブル名を変数として持つことは許されません。もし必要ならばsp_execを見てください。 それ。 – rene

答えて

11

これはコードの一部である

変数@tableテーブルを宣言する必要がありますあなたはこれをすることはできません。あなたが代わりにこれを行うことができ

SqlCommand com = new SqlCommand("insert into @table ..."); 
... 
com.Parameters.AddWithValue("@table", tblname); 

Console.WriteLine("Enter table name:"); 
Console.Write(">> "); 
string tblname = Console.ReadLine(); 

string sql = String.Format("insert into {0} (time, date, pin) values ... ", tblname); 

SqlCommand com = new SqlCommand(sql, con);      

... 
+3

これはどのような方法でもSQLインジェクションを許可しますか? –

+3

@RafaelAdelはい、あります。 'tblname'がデータベース内のテーブルであるかどうかをチェックするべきです(' SELECT * FROM INFORMATION_SCHEMA.TABLES')。 – ctusch

+2

@RafaelAdel、[と]のテーブル名をチェックします。いずれかが含まれている場合は停止します。次に、テーブル名を[]に囲みます。 –

4

は、テーブル名がSQLクエリの入力パラメータにはできませんあなたは、パラメータとして、あなたが行った方法をテーブル名を渡すことはできません。しかし、あなたは常に「次のようにSqlCommandオブジェクトに渡す前に、SQL文字列を準備することができます:

var sqlString = string.Format("insert into {0} (time, date, pin) values (@time, @date, @pin)", tblname) 

、その後

SqlCommand com = new SqlCommand(sqlString); 
... 
0

string tblname = "; DROP TABLE users;"; 
var sqlString = string.Format("insert into {0} (time, date, pin) values (@time, @date, @pin)", tblname) 

https://en.wikipedia.org/wiki/SQL_injection

...これを試してみてください
関連する問題