1

我是 C# .net 的初学者,我的问题是关于在 C# 中创建一个程序,该程序显示从月历中选择的每个日期的小型数据库的结果。例如,我选择25/5/2013并显示在与 john smith 的 Richtextbox 约会中。

我得到了约会

this.richTextBox1.Text = monthCalendar1.SelectionRange.Start.Date.ToShortDateString();

但是当我尝试显示我想要的行时,程序崩溃了。我使用此代码在数据网格中显示它

SqlConnection conn = new SqlConnection("Data Source=.\\SQLEXPRESS;Initial Catalog=event_agenda;Integrated Security=True");
DataTable dt = new DataTable();
SqlDataAdapter SDA = new SqlDataAdapter("Select * from event where date_event =" + monthCalendar1.SelectionRange.Start.Date.ToShortDateString(), conn);
SDA.Fill(dt);

dataGridView1.DataSource = dt;

它没有显示任何东西

但是这样它就可以毫无问题地显示数据库中的所有行

SqlConnection conn = new SqlConnection("Data Source=.\\SQLEXPRESS;Initial Catalog=event_agenda;Integrated Security=True");
DataTable dt = new DataTable();
SqlDataAdapter SDA = new SqlDataAdapter("Select * from event", conn);
SDA.Fill(dt);

dataGridView1.DataSource = dt;

我的数据库有一个表事件和两列:(date_eventvarchar(9)notesvarchar(150)

我的错误在哪里?如果有人帮助我,我将不胜感激

4

2 回答 2

1

第一件事。您永远不应该在数据库中用字符串表示日期。
所以我真的建议你将该字段更改为 DateTime 列

其次,您的查询失败,因为您传递了一个字符串而没有在其周围使用引号

让我展示如何正确执行(将您的列更改为日期时间之后)

DateTime mDate = monthCalendar1.SelectionRange.Start.Date;
SqlDataAdapter SDA = new SqlDataAdapter("Select * from event where date_event=@dt", conn);
SDA.SelectCommand.Parameters.AddWithValue("@dt", mDate);
SDA.Fill(dt);

此代码使用参数化查询。查询文本中的占位符@dt将由框架代码使用分配给名为@dt 的参数的值来处理。
此参数被添加到 SqlDataAdapter 用于检索数据的 SelectCommand 的参数集合中。

这样您就不必担心如何表示(格式为字符串)日期,并且避免了Sql Injection的风险

如果您真的坚持使用字符串来表示日期(从长远来看,这是一种非常糟糕的做法,对您的程序没有任何好处),您可以简单地添加日历提取的日期的字符串表示形式作为值。

于 2013-05-25T10:03:04.287 回答
0

我建议您应该将表格列更改为date. 然后,在您的代码中,您可以按如下方式格式化日期:

var d = monthCalendar1.SelectionRange.Start.Date;
var formattedDate = d.ToString("yyyyMMdd");

您的查询看起来像:

SqlDataAdapter SDA = 
    new SqlDataAdapter("Select * from event where date_event ='" + formattedDate + "'", conn);
于 2013-05-25T10:01:12.673 回答