这应该是一个简单的。在Windows窗体中使用日期时间选择器时,我希望执行一个SQL语句,如下所示:
string sql = "SELECT * FROM Jobs WHERE JobDate = '" + dtpJobDate.Text + "'";
不幸的是,这实际上并没有提供任何结果,因为JobDate字段存储为DateTime值。我希望能够搜索这个日期的所有记录,无论存储的时间是什么,有什么帮助吗?
新查询:
SqlDataAdapter da2 = new SqlDataAdapter();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "SELECT * FROM Jobs WHERE JobDate >= @p_StartDate AND JobDate < @p_EndDate";
cmd.Parameters.Add ("@p_StartDate", SqlDbType.DateTime).Value = dtpJobDate.Value.Date;
cmd.Parameters.Add ("@p_EndDate", SqlDbType.DateTime).Value = dtpJobDate.Value.Date.AddDays(1);
cmd.Connection = conn;
da2.SelectCommand = cmd;
da2.Fill(dt);
dgvJobDiary.DataSource = dt;
非常感谢所有的帮助!
答案 0 :(得分:9)
只需一个答案:使用parametrized queries。
这是出于不同的原因:
因此,写下你的陈述:
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "SELECT * FROM Jobs WHERE JobDate = @p_Date"
cmd.Parameters.Add ("@p_Date", SqlDbType.DateTime).Value = dtpJobDate.Value;
如果你想忽略时间,那么我认为最好的办法是进行范围搜索,如果时间存储在数据库中,那就是。 像这样的东西(只是SQL查询):
SELECT * FROM Jobs WHERE JobDate >= @p_StartDate AND JobDate < @p_EndDate
StartDate将为dtpJobDate.Value.Date
,EndDate为dtpJobDate.Value.Date.AddDays(1)
如果时间未存储在数据库中,则可以执行以下操作:
SELECT * FROM Jobs WHERE JobDate = @p_Date
其中搜索参数应为dtpJobDate.Value.Date
答案 1 :(得分:1)
尝试dtpJobDate.Value。
答案 2 :(得分:1)
除了其他答案中的SQL注入内容,您可以使用以下内容:
dtpJobDate.Value.ToString("yyyyMMdd HH:mm:ss");
但是,您可能找不到具有完全时间匹配的任何内容,因此您可以更改
之类的查询string sql = "SELECT * FROM Jobs WHERE JobDate BETWEEN '" + dtpJobDateStart.Value.ToString("yyyyMMdd HH:mm:ss") + "' AND '" + + dtpJobDateEnd.Value.ToString("yyyyMMdd HH:mm:ss") + " + "'";
答案 3 :(得分:0)
首先 - 在您的示例中,您为SQL注入打开了一扇门。
除此之外 - 要回答您的问题,您必须将时间从JobDate列中删除以完成匹配。尝试这样的事情(示例中留下的SQL注入代码用于比较)...
string sql = "SELECT * FROM Jobs WHERE CAST(CONVERT(CHAR(8), JobDate, 112) AS DATETIME) = '" + dtpJobDate.Text + "'";
如果您要参数化您的查询 - 您可以这样做......
using (var conn = new SqlConnection(myConnectionString))
using (var cmd = new SqlCommand("SELECT * FROM Jobs WHERE JobDate = @JobDate", conn))
{
cmd.Parameters.Add(new SqlParameter("@JobDate", dtpJobDate.Value));
conn.Open();
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
// your code here to deal with the records...
}
}
}