C#|在DB中工作的MySql查询无法在应用程序中工作

时间:2016-06-20 14:19:07

标签: c# mysql datetime

我有这个问题:

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

最终查询将如下所示:

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

当我在PHPMYADMIN中执行查询时,它返回该行。但是当我在C#中这样做时,我说我的MySqldatareader是空的

以下是我用于此的代码:

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();

当执行此操作时,它将在while(reader1.read)部分上给出System.NullreferenceException。任何解决方案?

1 个答案:

答案 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
}

数据库层:

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。绑定你的参数。

一个人应该引导数据绑定的原因,而不是你在尝试中看到的字符串连接,包括失去Configuring Parameters and Parameter Data Types中所见的绑定提供的功能以及该主题附近或之外的其他链接。并且,它将查询转换为PHP中的混乱,并将连接的现代用法转向参数数据绑定。

想象一下,如果没有绑定,以下查询会有多么困难且调试密集型

enter image description here

Sql注入攻击:

与concat方法不同,参数绑定可以保护您免受此类攻击。有关存储过程的使用,请参阅以下question,包括此answer