我有这个问题:
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。任何解决方案?
答案 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");
}
}
}
}
}
它找到了数据:
按照大家的建议使用using blocks
。绑定你的参数。
一个人应该引导数据绑定的原因,而不是你在尝试中看到的字符串连接,包括失去Configuring Parameters and Parameter Data Types中所见的绑定提供的功能以及该主题附近或之外的其他链接。并且,它将查询转换为PHP中的混乱,并将连接的现代用法转向参数数据绑定。
想象一下,如果没有绑定,以下查询会有多么困难且调试密集型:
Sql注入攻击:
与concat方法不同,参数绑定可以保护您免受此类攻击。有关存储过程的使用,请参阅以下question,包括此answer。