尝试从 WPF 中的 Access 数据库中获取给定条件的日期时出错
Error when trying to get dates given a condition from Access database in WPF
我正在开发一个将用户注册和日期保存到 Access 数据库中的 WPF 应用程序。
我在插入日期时没有遇到任何问题,但现在我想在给定特定条件(例如,当月的所有日期)的情况下使用 DataReader 检索一些日期。
当我尝试通过我的应用程序读取它时,DataReader return 没有任何行。但是当我在 DBeaver 上尝试相同的查询时,它会执行 return 数据。
只有当我尝试读取给定特定条件的日期时才会出现此读取问题,因为如果我尝试读取所有日期,就没有问题。
我试过使用参数化命令并直接插入带有 String.Format()
的条件。
我目前有这个功能(如果我们不计算数据库中保存的天数,它会尝试计算该月还剩多少天):
public static int CalculateDaysLeftInMonth()
{
int days = 0;
List<DateTime> dates = new List<DateTime>();
try
{
if (dbConnection.State != ConnectionState.Open)
dbConnection.Open();
OleDbCommand dbCommandQuery = new OleDbCommand {
CommandText = "SELECT * FROM DatesTable WHERE Date LIKE @Condition"
}
dbCommandQuery.Parameters.AddWithValue("@Condition", String.Format("{0:yyyy-MM}-%", DateTime.Now));
OleDbDataReader dbReader = dbCommandQuery.ExecuteReader();
if (!dbReader.HasRows)
return -1;
while (dbReader.Read())
{
dates.Add(new FechaFestivo(dbReader.GetDateTime(0).Date));
}
dbConnection.Close();
DateTime startDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1),
endDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month));
for (DateTime date = startDate; date <= endDate; date = date.AddDays(1))
{
if (!dates.Any(ff => ff.Date == date.Date))
{
days++;
}
}
}
catch (OleDbException ex)
{
dbConnection.Close();
return -1;
}
return days;
}
这是参数化版本。
我也试过使用:
dbCommandQuery.CommandText = String.Format("SELECT * FROM DatesTable WHERE Date " +
"LIKE '{0:yyyy-MM}-%'", DateTime.Now);
我希望得到这样的日期列表,因此我可以遍历它们:
(CalendarioLaboral
将是 DatesTable
而 FechaFestivo
将是 Dates
)
提前谢谢你。
最终对我有用的代码如下:
public static int CalculateDaysLeftInMonth()
{
int days = 0;
List<DateTime> dates = new List<DateTime>();
try
{
if (dbConnection.State != ConnectionState.Open)
dbConnection.Open();
OleDbCommand dbCommand = new OleDbCommand {
CommandText = String.Format("SELECT * FROM {0} WHERE (DATEPART('yyyy', FechaFestivo) = @Year " +
"AND DATEPART ('m', FechaFestivo) = @Month)", TablaCalendario)
}
dbCommandQuery.Parameters.AddWithValue("@Year", DateTime.Now.Year);
dbCommandQuery.Parameters.AddWithValue("@Month", DateTime.Now.Month);
OleDbDataReader dbReader = dbCommandQuery.ExecuteReader();
if (!dbReader.HasRows)
return -1;
while (dbReader.Read())
{
dates.Add(new FechaFestivo(dbReader.GetDateTime(0).Date));
}
dbConnection.Close();
DateTime startDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1),
endDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month));
for (DateTime date = startDate; date <= endDate; date = date.AddDays(1))
{
if (!dates.Any(ff => ff.Date == date.Date))
{
days++;
}
}
}
catch (OleDbException ex)
{
dbConnection.Close();
return -1;
}
return days;
}
使用评论中@Holger 和@June7 所述的 DatePart 函数。谢谢!
Like '2019-10-%'
表示2019年10月的一天,所以相当于date between 2019-10-01 AND 2019-10-31
。试一试:
SELECT * FROM DatesTable WHERE Date between '2019-10-01' AND' 2019-10-31'
我正在开发一个将用户注册和日期保存到 Access 数据库中的 WPF 应用程序。 我在插入日期时没有遇到任何问题,但现在我想在给定特定条件(例如,当月的所有日期)的情况下使用 DataReader 检索一些日期。 当我尝试通过我的应用程序读取它时,DataReader return 没有任何行。但是当我在 DBeaver 上尝试相同的查询时,它会执行 return 数据。
只有当我尝试读取给定特定条件的日期时才会出现此读取问题,因为如果我尝试读取所有日期,就没有问题。
我试过使用参数化命令并直接插入带有 String.Format()
的条件。
我目前有这个功能(如果我们不计算数据库中保存的天数,它会尝试计算该月还剩多少天):
public static int CalculateDaysLeftInMonth()
{
int days = 0;
List<DateTime> dates = new List<DateTime>();
try
{
if (dbConnection.State != ConnectionState.Open)
dbConnection.Open();
OleDbCommand dbCommandQuery = new OleDbCommand {
CommandText = "SELECT * FROM DatesTable WHERE Date LIKE @Condition"
}
dbCommandQuery.Parameters.AddWithValue("@Condition", String.Format("{0:yyyy-MM}-%", DateTime.Now));
OleDbDataReader dbReader = dbCommandQuery.ExecuteReader();
if (!dbReader.HasRows)
return -1;
while (dbReader.Read())
{
dates.Add(new FechaFestivo(dbReader.GetDateTime(0).Date));
}
dbConnection.Close();
DateTime startDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1),
endDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month));
for (DateTime date = startDate; date <= endDate; date = date.AddDays(1))
{
if (!dates.Any(ff => ff.Date == date.Date))
{
days++;
}
}
}
catch (OleDbException ex)
{
dbConnection.Close();
return -1;
}
return days;
}
这是参数化版本。 我也试过使用:
dbCommandQuery.CommandText = String.Format("SELECT * FROM DatesTable WHERE Date " +
"LIKE '{0:yyyy-MM}-%'", DateTime.Now);
我希望得到这样的日期列表,因此我可以遍历它们:
(CalendarioLaboral
将是 DatesTable
而 FechaFestivo
将是 Dates
)
提前谢谢你。
最终对我有用的代码如下:
public static int CalculateDaysLeftInMonth()
{
int days = 0;
List<DateTime> dates = new List<DateTime>();
try
{
if (dbConnection.State != ConnectionState.Open)
dbConnection.Open();
OleDbCommand dbCommand = new OleDbCommand {
CommandText = String.Format("SELECT * FROM {0} WHERE (DATEPART('yyyy', FechaFestivo) = @Year " +
"AND DATEPART ('m', FechaFestivo) = @Month)", TablaCalendario)
}
dbCommandQuery.Parameters.AddWithValue("@Year", DateTime.Now.Year);
dbCommandQuery.Parameters.AddWithValue("@Month", DateTime.Now.Month);
OleDbDataReader dbReader = dbCommandQuery.ExecuteReader();
if (!dbReader.HasRows)
return -1;
while (dbReader.Read())
{
dates.Add(new FechaFestivo(dbReader.GetDateTime(0).Date));
}
dbConnection.Close();
DateTime startDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1),
endDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month));
for (DateTime date = startDate; date <= endDate; date = date.AddDays(1))
{
if (!dates.Any(ff => ff.Date == date.Date))
{
days++;
}
}
}
catch (OleDbException ex)
{
dbConnection.Close();
return -1;
}
return days;
}
使用评论中@Holger 和@June7 所述的 DatePart 函数。谢谢!
Like '2019-10-%'
表示2019年10月的一天,所以相当于date between 2019-10-01 AND 2019-10-31
。试一试:
SELECT * FROM DatesTable WHERE Date between '2019-10-01' AND' 2019-10-31'