【发布时间】:2019-10-08 07:21:15
【问题描述】:
我正在开发一个 WPF 应用程序,它将用户注册和日期保存到 Access 数据库中。 我插入日期没有问题,但现在我想用 DataReader 检索给定条件的一些日期(例如,当月的所有日期)。 当我尝试通过我的应用程序读取它时,DataReader 不返回任何行。但是当我在 DBeaver 上尝试相同的查询时,它确实返回了数据。
只有当我尝试在特定条件下读取日期时才会出现此读取问题,因为如果我尝试读取所有日期,则没有问题。
我尝试过使用参数化命令并直接使用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)
提前谢谢你。
【问题讨论】:
-
如果在此处检查:stackoverflow.com/questions/1629050/… DateTime 不支持 LIKE(为什么应该这样做是没有意义的),但如果您想使用它,可以转换为 VARCHAR。
-
@Holger 谢谢!我尝试使用这个:
dbCommandQuery.CommandText = String.Format("SELECT * FROM {0} WHERE (DATEPART(yyyy, FechaFestivo) = {1:yyyy} AND DATEPART (mm, FechaFestivo) = {1:MM})", TablaCalendario, DateTime.Now);但它给了我一个 OleDbException (没有为一些需要的参数指定值)。是不是应该换成别的写法?再次感谢您! -
您最好在 string.Format 执行后提供生成的 CommandText。这似乎是一个纯 SQL 问题,与 C# 完全无关。我不确定 TablaCalendario 是什么,也许是 ToString() 方法产生了一些奇怪的东西。
-
@Holger 生成的CommandText是
"SELECT * FROM CalendarioLaboral WHERE (DATEPART(yy, FechaFestivo) = 2019 AND DATEPART (mm, FechaFestivo) = 10)",而TablaCalendario只是一个包含表名的字符串。很抱歉给您带来不便,我的问题恰恰是在我的 C# 代码中,这个查询不起作用,但在 DBeaver 这样的 SQL 客户端中它确实有效......虽然如果这个问题不在正确的地方,我会编辑标签。 -
mm和yyyy参数需要在生成的 SQL 字符串中包含在撇号分隔符中。必须是'yyyy'和'mm'。
标签: c# wpf ms-access c#-4.0 oledb