2016-06-20 3 views
-1

で働いていないDBでの作業のMySQLのクエリは、私はこのクエリを持っている:C#|アプリケーション

string query = "SELECT afspraak_locatie FROM Afspraak WHERE date(datum) = '" + datum +"'"; 

最終クエリは次のようになります。私は私のphpMyAdminでクエリを実行すると

SELECT afspraak_locatie FROM Afspraak WHERE date(datum) = '2016-06-16' 

それは行を返します。

MySqlCommand cmd1 = new MySqlCommand(query1, connection); 
cmd1.CommandType = CommandType.Text; 
using (MySqlDataReader reader1 = cmd1.ExecuteReader()) 
{ 
     while (reader1.Read()) 
     { 
      result1.Add(reader1.GetString(0)); 
     } 
     reader1.Close(); 
} 
cmd1.Cancel(); 

これが実行されます場合は、それはしばらく(reader1にSystem.NullreferenceExceptionを与える:しかし、私はC#でそれを行うとき、それは私のMySqldatareaderがここ

空であると言う私はそのために使用するコードです。読み取り)部分。どんな解決策ですか?ロード

+3

文字列連結の代わりにSQLパラメータを使用します。あなたが 'NullReferenceException'を取得した場合、' result1'は 'List 'と思われるnullなので、 'var result1 = new List ();' –

+4

を使ってください。 。パラメータ化されたSQLを使用します。 'using'ステートメントのためにあなたの読者に' Close'を呼び出す必要はないことに注意してください。 –

+0

これらの変数はプログラム自体で作成されますが、ユーザーの操作はありません。 –

答えて

1

スキーマとデータ:

create table Afspraak 
(
    id int auto_increment primary key, 
    afspraak_locatie varchar(100) not null, -- just an example (we don't know your datatype) 
    datum datetime not null -- you said it was a datetime in a comment under your question 
); 

insert Afspraak (afspraak_locatie,datum) values 
('Rome','2016-06-14 13:55:55'), 
('London','2016-06-15 15:12:12'), 
('Cairo','2016-06-16 07:00:33'), 
('Boston','2016-06-17 01:30:00'); 

select * from afspraak; 
+----+------------------+---------------------+ 
| id | afspraak_locatie | datum    | 
+----+------------------+---------------------+ 
| 1 | Rome    | 2016-06-14 13:55:55 | 
| 2 | London   | 2016-06-15 15:12:12 | 
| 3 | Cairo   | 2016-06-16 07:00:33 | 
| 4 | Boston   | 2016-06-17 01:30:00 | 
+----+------------------+---------------------+ 

GUIレイヤー:

private void button1_Click(object sender, EventArgs e) 
{ 
    myDB.FindThatRow("2016-06-16"); // get data 
} 

DB層:

public void FindThatRow(string theDate) 
{ // or all those rows 
    // 

    using (MySqlConnection lconn = new MySqlConnection(connString)) 
    { 
     lconn.Open(); 
     using (MySqlCommand cmd = new MySqlCommand()) 
     { // 
      cmd.Connection = lconn; 
      cmd.CommandText = @"select id,afspraak_locatie FROM Afspraak WHERE date(datum) = @pTheDate"; 
      cmd.Prepare(); 
      cmd.Parameters.AddWithValue("@pTheDate", theDate); 
      using (MySqlDataReader rs = cmd.ExecuteReader()) 
      { // 
       while (rs.Read()) 
       { 
        int qId = (int)rs.GetInt32("id"); 
        string sViewIt = rs.GetString("afspraak_locatie"); 
       } 
      } 
     } 
    } 
} 

これは、データが見つかりました:

enter image description here

皆が推奨するようusing blocksを使用してください。パラメータをバインドします。


1は、データバインディング、あなたの試みに見られるように、対文字列連結に向かって操縦する必要がある理由は、近くまたはそのトピックオフConfiguring Parameters and Parameter Data Typesや他のリンクで見られるようなオファーを結合するものの機能を失っています。また、PHPで見られる混乱の中で、パラメータのデータバインディングに近代的な使い方を導いた連結をクエリに変換します。

次のクエリは、束縛なしだろういかに難しいかとデバッグ集約型想像:

enter image description here

SQLインジェクション攻撃:結合

パラメータは、あなたと違って、このような攻撃からあなたを守ります連結の方法。ストアドプロシージャの使用方法についてはquestionを参照してください。answerを参照してください。

+0

でそれを使用すると、クエリは動作します。私は問題を発見した可能性があります、私は現在、接続を開いて、次に私は2つの異なるクエリの最初の1つは常に動作しますが、2番目は常にapparantly失敗しますcmd1とcmd2を使用します。あなたはなぜそれが事実だろうか考えていますか? 誰かがMySqlストアドプロシージャを提案しました。それは解決策かもしれません –

+0

結果セットが途中で完了していないとエラーをスローします。私はセグメント化された使用方法を持つ接続ブロック(非常に小さなブロック)を使用します。あるいは、一回限りのクエリでは、connect、cmd、resultsetを 'using'でラップし、接続オブジェクトとすべてが処分されていることを知るルーチンを逃します。だから、異なる接続オブジェクトを持っている。それが正しいとすれば、サーバ上の接続がなくなることを意味するわけではありません。それはそれらのすべてのエラーがなくなることを意味します。 – Drew

+0

私は現在、(connection.open)経由で開いている1つのMySql接続を持っています。同じ関数/メソッドでクエリごとに新しいクエリを作成するか、ストアドプロシージャを使用するように提案する必要がありますか? –

関連する問題