Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用日期和时间段之间的记录填充数据网格-使用C#和OLE DB_C#_Sql_Datetime_Datagrid_Oledb - Fatal编程技术网

使用日期和时间段之间的记录填充数据网格-使用C#和OLE DB

使用日期和时间段之间的记录填充数据网格-使用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

我在两个日期时间值之间筛选一组数据时遇到困难

例如:从以下位置检索所有记录:24/04/2013下午3:54;至:2013年4月24日下午4:30

我正在用C#编程,并使用OLE DB从Access数据库中提取数据。 “To”和“From”日期时间值是从GUI上的DateTimePicker控件检索的。 我试图在数据源的“receiveDateTime”字段中查询数据-它以DateTime格式存储在Access中

我的代码如下所示:

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”)
更改为服务器可读的内容。不知道访问日期格式是什么。使其在数据库中工作,然后更正查询。