使用日期和时间段之间的记录填充数据网格-使用C#和OLE DB
我在两个日期时间值之间筛选一组数据时遇到困难 例如:从以下位置检索所有记录:24/04/2013下午3:54;至:2013年4月24日下午4:30 我正在用C#编程,并使用OLE DB从Access数据库中提取数据。 “To”和“From”日期时间值是从GUI上的DateTimePicker控件检索的。 我试图在数据源的“receiveDateTime”字段中查询数据-它以DateTime格式存储在Access中 我的代码如下所示:使用日期和时间段之间的记录填充数据网格-使用C#和OLE DB,c#,sql,datetime,datagrid,oledb,C#,Sql,Datetime,Datagrid,Oledb,我在两个日期时间值之间筛选一组数据时遇到困难 例如:从以下位置检索所有记录:24/04/2013下午3:54;至:2013年4月24日下午4:30 我正在用C#编程,并使用OLE DB从Access数据库中提取数据。 “To”和“From”日期时间值是从GUI上的DateTimePicker控件检索的。 我试图在数据源的“receiveDateTime”字段中查询数据-它以DateTime格式存储在Access中 我的代码如下所示: string SQLQuery = "SELECT Email
string SQLQuery = "SELECT EmailID, ServerName, receiveDateTime, Type, status, received, processed"
+ "FROM EmailTable, EmailTypesTable, ServerTable, StatusTable"
+ "WHERE EmailTypesTable.emailTypeID = EmailTypesTable.EmailType "
+ "AND ServerTable.ServerID = EmailTable.serverID "
+ "AND StatusTable.statusID = EmailTable.statusID "
+ "AND EmailTable.receiveDateTime BETWEEN "
+ fromDateTime.Value.ToString("g") + "AND " + toDateTime.Value.ToString("g")";
loadDataGrid(SQLQuery);
任何解决方案或建议将不胜感激
谢谢
Allan.1-似乎您忘记了日期之间的单引号值:
string SQLQuery = "SELECT EmailID, ServerName, receiveDateTime, Type, status, received, processed"
+ "FROM EmailTable, EmailTypesTable, ServerTable, StatusTable"
+ "WHERE EmailTypesTable.emailTypeID = EmailTypesTable.EmailType "
+ "AND ServerTable.ServerID = EmailTable.serverID "
+ "AND StatusTable.statusID = EmailTable.statusID "
+ "AND EmailTable.receiveDateTime BETWEEN '"
+ fromDateTime.Value.ToString("g") + "' AND '" + toDateTime.Value.ToString("g") +"' ";
2-如果您也使用参数化参数会更好:
SqlConnection con = new SqlConnection(MyconnectionString);
con.Open();
string SQLQuery = "SELECT EmailID, ServerName, receiveDateTime, Type, status, received, processed"
+ "FROM EmailTable, EmailTypesTable, ServerTable, StatusTable"
+ "WHERE EmailTypesTable.emailTypeID = EmailTypesTable.EmailType "
+ "AND ServerTable.ServerID = EmailTable.serverID "
+ "AND StatusTable.statusID = EmailTable.statusID "
+ "AND EmailTable.receiveDateTime BETWEEN @dateFrom AND @dateTo";
SqlCommand cmd = new SqlCommand(SQLQuery );
cmd.Parameters.AddWithValue("@dateFrom", fromDateTime.Value.ToString("g"));
cmd.Parameters.AddWithValue("@dateTo", toDateTime.Value.ToString("g"));
SqlDataReader reader = cmd.ExecuteReader();
//...
您可以通过尝试直接在数据库中执行此查询来猜测问题
(我已经使用了SQLConnection、SQLCommand…在这里,您需要根据正在使用的连接更改该部分。)对于将来在比较DateTime值时遇到此问题的任何人,将C#DateTime作为OLE自动化日期传递给数据库是可行的 要访问此值,请使用ToOADate()方法 例如:
SqlConnection con = new SqlConnection(MyconnectionString);
con.Open();
string SQLQuery = "SELECT EmailID, receiveDateTime "
+ "WHERE EmailTable.receiveDateTime "
+ "BETWEEN @dateFrom AND @dateTo";
SqlCommand cmd = new SqlCommand(SQLQuery );
cmd.Parameters.AddWithValue("@dateFrom", fromDateTime.Value.ToOADate());
cmd.Parameters.AddWithValue("@dateTo", toDateTime.Value.ToOADate());
这很奇怪,因为尽管DateTime值在DataGrid中以常规DateTime格式出现,但数据库必须读取它们:
通用日期时间格式:2013年4月26日上午9:47
OLE自动化日期:41390.408219832
谢谢你给我指明了正确的方向 不要在查询中使用字符串连接。始终使用。这类代码会受到攻击。请注意,添加单引号后,我现在收到一个类型不匹配错误。@allanpoley如果您可以调试代码并复制SQLQuery字符串中的内容,请在数据库中执行它。可能有什么遗漏我在MS Access 2007中执行了它,我收到了相同的错误。我是说这很有道理,不是吗?不能将时间和日期作为字符串进行比较,对吗?但我不知道还有什么办法。事实上,将时间和日期作为字符串进行比较并不是问题。应该将
DateValue.Value.ToString(“g”)
更改为服务器可读的内容。不知道访问日期格式是什么。使其在数据库中工作,然后更正查询。