2016-07-15 5 views
0

私の問題は、AddWithValueを使用すると2つの望ましくない一重引用符が表示されるということです。 これは私の関数を呼び出す方法です:c#MySqlCommand.Parameters.AddWithValue、テーブルを表現するパラメータ、結果のコマンドに一重引用符が追加されました

string sqlTableName = "the_table_i_want"; 
DataTable myDataTable = SQLcom.SelectLastValueInTab(sqlTableName); 

My Function;

"SELECT * FROM 'the_table_i_want' ORDER BY id DESC LIMIT 1" 

となると仮定されています:

public static DataTable SelectLastValueInTab(string TableName) 
    { 
     using (MySqlConnection con = new MySqlConnection(ConnStr)) 
     { 
      using (MySqlCommand myCommand = new MySqlCommand("SELECT * FROM @TabName ORDER BY id DESC LIMIT 1", con)) 
      { 
       myCommand.Parameters.AddWithValue("@TabName", TableName); 
       try 
       { 
        con.Open(); 
        MySqlDataReader testreader = myCommand.ExecuteReader(); 

たコマンドがある

a syntax error near ''the_table_i_want' ORDER BY id DESC LIMIT 1' 

PS:

"SELECT * FROM the_table_i_want ORDER BY id DESC LIMIT 1" 

それはプログラムが私が持っているbeacauseクラッシュを引き起こします私がAddWithValuechangeを使用しない場合変更します。

@TabName for the_table_i_want 

MySqlCommandで完全に動作します。

ありがとうございます!

ダニエルG.B

+4

パラメータを使用して表またはフィールド名を表すことはできません。値に対してのみ使用できます。 – Steve

+2

準備されたステートメントは、このように使用されることを意味しませんでした。 'AddWithValue'メソッドはそれが文字列であるとみなし、それを引用します。 'TableName'がユーザから提供されていない場合は、あなたのクエリでそれを連結しますが、それを大括弧で囲みます:' 'SELECT * FROM [" + TableName + "] ..." 'またはRDBMSが使用するシステム)。あなたはまた、どこかにリストされたテーブル名の有効なリストを持っていたい。 'TableName'がそのリストにない場合は、クエリを実行しないでください。これはSQLインジェクションからあなたを十分に保護するはずです。 –

+0

@スティーブありがとうございましたそれはまさに私の問題でした!しかし、[メソッド定義?](https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue(v = vs.110).aspx)にはこれの仕様はありません。 –

答えて

1

コメントが示すように、あなたは、テーブルやフィールド名を表現するためのパラメータを使用することはできません。代わりの方法は、クエリにテーブル名を追加することです。

public static DataTable SelectLastValueInTab(string TableName) 
{ 
    using (MySqlConnection con = new MySqlConnection(ConnStr)) 
    { 
     string qry = "SELECT * FROM " + TableName + " ORDER BY id DESC LIMIT 1"; 
     using (MySqlCommand myCommand = new MySqlCommand(qry, con)) 
     { 
      try 
      { 
       con.Open(); 
       MySqlDataReader testreader = myCommand.ExecuteReader(); 
+0

ありがとう。 –

関連する問題