C# Access 无法识别查询中的参数
C# Access not recognize parameters in a query
我正在尝试用 C# 编写 sql 查询以访问。
该查询在 Access 软件中运行良好,但是当我尝试通过 C# 使用参数 运行 它时,它抛出参数丢失的异常。就像它忽略了我提供的参数。
这是我的方法:
public DataTable GetRoomStatusByDate(Room RoomItem, TimeRange TimeItem, WeekDay DayItem, DateTime DateItem)
{
string cmdStr = "SELECT Subject, AdditionOrCancellation, Description " +
"FROM (SELECT * " +
"FROM TimeTables TT1 LEFT OUTER JOIN SpecialEvents SE1 " +
"ON TT1.RoomNumber = SE1.RoomNumber AND TT1.StructureNumber = SE1.StructureNumber AND " +
"TT1.DayNumber = SE1.DayNumber AND TT1.HourNumber = SE1.HourNumber " +
"UNION " +
"SELECT * " +
"FROM TimeTables TT2 RIGHT OUTER JOIN SpecialEvents SE2 " +
"ON TT2.RoomNumber = SE2.RoomNumber AND TT2.StructureNumber = SE2.StructureNumber " +
"AND TT2.DayNumber = SE2.DayNumber AND TT2.HourNumber = SE2.HourNumber) " +
"WHERE (TT1.RoomNumber = @TTRoomNumber OR SE1.RoomNumber = @SERoomNumber) AND (TT1.StructureNumber = @TTStructureNumber OR SE1.StructureNumber = @SEStructureNumber) " +
"AND(TT1.HourNumber = @TTHourNumber OR SE1.HourNumber = @SEHourNumber) AND (TT1.DayNumber = @TTDayNumber OR SE1.DayNumber = @@SEDayNumber) " +
"AND (SE1.EventDate = @SEEventDate OR SE1.EventDate IS NULL)";
DataSet ds = new DataSet();
using (OleDbCommand command = new OleDbCommand(cmdStr))
{
command.Parameters.AddWithValue("@TTRoomNumber", RoomItem.Number);
command.Parameters.AddWithValue("@SERoomNumber", RoomItem.Number);
command.Parameters.AddWithValue("@TTStructureNumber", RoomItem.Structure);
command.Parameters.AddWithValue("@SEStructureNumber", RoomItem.Structure);
command.Parameters.AddWithValue("@TTDayNumber", TimeItem.Number);
command.Parameters.AddWithValue("@SEDayNumber", TimeItem.Number);
command.Parameters.AddWithValue("@TTDayNumber", DayItem.Number);
command.Parameters.AddWithValue("@SEDayNumber", DayItem.Number);
command.Parameters.AddWithValue("@SEEventDate", DateItem);
ds = GetMultipleQuery(command);
}
DataTable dt = new DataTable();
try
{
dt = ds.Tables[0];
}
catch
{ }
return dt;
}
我还想提一下我使用 OLEDB 并且我的连接很好,因为我有很多带有查询和参数的方法,它们都可以正常工作,没有问题。
这是我唯一的查询无效的方法。
OleDb 使用位置参数,而不是命名参数。将 SQL 中的参数名称替换为 ?
。您可以在 AddWithValue
中保留参数名称不变,因为它会被忽略。
...
"WHERE (TT1.RoomNumber = ? OR SE1.RoomNumber = ?) AND (TT1.StructureNumber = ? OR SE1.StructureNumber = ?) " +
"AND(TT1.HourNumber = ? OR SE1.HourNumber = ?) AND (TT1.DayNumber = ? OR SE1.DayNumber = ?) " +
"AND (SE1.EventDate = ? OR SE1.EventDate IS NULL)";
确保添加参数的顺序与它们在 SQL 文本中出现的顺序相同。
此外,传递给 AddWithValue
的值必须具有正确的类型。数字或日期字符串不会自动转换为适当的数字或日期时间类型。
我正在尝试用 C# 编写 sql 查询以访问。 该查询在 Access 软件中运行良好,但是当我尝试通过 C# 使用参数 运行 它时,它抛出参数丢失的异常。就像它忽略了我提供的参数。 这是我的方法:
public DataTable GetRoomStatusByDate(Room RoomItem, TimeRange TimeItem, WeekDay DayItem, DateTime DateItem)
{
string cmdStr = "SELECT Subject, AdditionOrCancellation, Description " +
"FROM (SELECT * " +
"FROM TimeTables TT1 LEFT OUTER JOIN SpecialEvents SE1 " +
"ON TT1.RoomNumber = SE1.RoomNumber AND TT1.StructureNumber = SE1.StructureNumber AND " +
"TT1.DayNumber = SE1.DayNumber AND TT1.HourNumber = SE1.HourNumber " +
"UNION " +
"SELECT * " +
"FROM TimeTables TT2 RIGHT OUTER JOIN SpecialEvents SE2 " +
"ON TT2.RoomNumber = SE2.RoomNumber AND TT2.StructureNumber = SE2.StructureNumber " +
"AND TT2.DayNumber = SE2.DayNumber AND TT2.HourNumber = SE2.HourNumber) " +
"WHERE (TT1.RoomNumber = @TTRoomNumber OR SE1.RoomNumber = @SERoomNumber) AND (TT1.StructureNumber = @TTStructureNumber OR SE1.StructureNumber = @SEStructureNumber) " +
"AND(TT1.HourNumber = @TTHourNumber OR SE1.HourNumber = @SEHourNumber) AND (TT1.DayNumber = @TTDayNumber OR SE1.DayNumber = @@SEDayNumber) " +
"AND (SE1.EventDate = @SEEventDate OR SE1.EventDate IS NULL)";
DataSet ds = new DataSet();
using (OleDbCommand command = new OleDbCommand(cmdStr))
{
command.Parameters.AddWithValue("@TTRoomNumber", RoomItem.Number);
command.Parameters.AddWithValue("@SERoomNumber", RoomItem.Number);
command.Parameters.AddWithValue("@TTStructureNumber", RoomItem.Structure);
command.Parameters.AddWithValue("@SEStructureNumber", RoomItem.Structure);
command.Parameters.AddWithValue("@TTDayNumber", TimeItem.Number);
command.Parameters.AddWithValue("@SEDayNumber", TimeItem.Number);
command.Parameters.AddWithValue("@TTDayNumber", DayItem.Number);
command.Parameters.AddWithValue("@SEDayNumber", DayItem.Number);
command.Parameters.AddWithValue("@SEEventDate", DateItem);
ds = GetMultipleQuery(command);
}
DataTable dt = new DataTable();
try
{
dt = ds.Tables[0];
}
catch
{ }
return dt;
}
我还想提一下我使用 OLEDB 并且我的连接很好,因为我有很多带有查询和参数的方法,它们都可以正常工作,没有问题。 这是我唯一的查询无效的方法。
OleDb 使用位置参数,而不是命名参数。将 SQL 中的参数名称替换为 ?
。您可以在 AddWithValue
中保留参数名称不变,因为它会被忽略。
...
"WHERE (TT1.RoomNumber = ? OR SE1.RoomNumber = ?) AND (TT1.StructureNumber = ? OR SE1.StructureNumber = ?) " +
"AND(TT1.HourNumber = ? OR SE1.HourNumber = ?) AND (TT1.DayNumber = ? OR SE1.DayNumber = ?) " +
"AND (SE1.EventDate = ? OR SE1.EventDate IS NULL)";
确保添加参数的顺序与它们在 SQL 文本中出现的顺序相同。
此外,传递给 AddWithValue
的值必须具有正确的类型。数字或日期字符串不会自动转换为适当的数字或日期时间类型。