2016-10-13 8 views
1

VS2015のC#およびMySQlでデータベースを照会し、VARCHAR型列の "method"という名前の情報を返します。ただし、クエリはメソッドの列の値ではなく、文字列 "method"を返します。MySQLクエリの戻り値パラメータ列名

 method 
     method 
     method 
      . 
      . 
      . 

..方法列の行数のため:これは出力される一方

 string queryOne = "SELECT " + "@columnName" + " FROM log.transactions"; 

     MySqlCommand cmdOne = new MySqlCommand(queryOne, connectionString); 

     cmdOne.Parameters.AddWithValue("@columnName", "method"); 

     MySqlDataReader dataReaderOne = cmdOne.ExecuteReader(); 
     while (dataReaderOne.Read()) 
     { 
      Console.WriteLine(dataReaderOne.GetString(0)); 
     } 
     dataReaderOne.Close(); 

:以下

コードです。これは書式設定の問題ですか?私のデータベースの構成がVarCharが正しく戻るのを妨げる可能性はありますか? INT型の列を照会するように照会を変更すると、INT型列の正しい値が戻されます。

答えて

2

select文で列名をパラメータ化することはできません。あなたがしていることは、select 'foo' from log.transactionsと言ったような奇妙なことです。各行に対して文字列 'foo'を1回選択します。そこに文字列値を貼り付けるだけです。それはSQLとして文字列値を解析していません。

できることがあれば、select * from log.transactionsです。その場合、C#コードは、呼び出し元があなたに渡した列のデータを取得できます。行が多いと、DBから無駄なたくさんの迷惑メールを取り戻すことができます。

あなたが表示されたコードで何をしたいです、しかしこれだけです:あなたは本当に「方法」をパラメータ化したい場合はそれがあるため、SQLインジェクションの脆弱性の大ざっぱだ、

string queryOne = "SELECT method FROM log.transactions"; 

。あなたのアプリケーションを使用して、いくつかのコメディアンがあなたにテキストボックスに"0; drop table log.transactions;--"の値を与えるまではよさそうだ

string queryOne = "SELECT " + fieldname + " FROM log.transactions"; 

。それから、悩みがあります。あなたが実行しようとしているSQL文字列に文字列変数を連結したことがあるならば、それを消毒することに熱狂しなければなりません。それはロシアのルーレットです。

+0

大変ありがとうございます。 – KM2001

1

カラムをダイナミックに保ちたい場合は、クエリのフォーメーションは、カラムの名前を適切に渡すようにする必要があります。

string queryOne = "SELECT " + column_name + " FROM log.transactions"; 

MySqlCommand cmdOne = new MySqlCommand(queryOne, connectionString);   
MySqlDataReader dataReaderOne = cmdOne.ExecuteReader(); 
while (dataReaderOne.Read()) 
    { 
     Console.WriteLine(dataReaderOne[column_name]); 
    } 
dataReaderOne.Close(); 
関連する問題