【问题标题】:C# Access not recognize parameters in a queryC# Access 无法识别查询中的参数
【发布时间】:2018-11-19 11:31:02
【问题描述】:

我正在尝试用 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,而且我的连接很好,因为我有很多带有查询和参数的方法,而且它们都可以正常工作,没有任何问题。 这是我唯一的查询不起作用的方法。

【问题讨论】:

    标签: c# sql ms-access oledb


    【解决方案1】:

    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 的值必须具有正确的类型。数字或日期字符串不会自动转换为适当的数字或 DateTime 类型。

    【讨论】:

    • 这非常丑陋并且容易出现巨大的错误,有没有办法以更好的方式与 NET 中的 Access db “对话”?
    • 我担心我们必须忍受这个次优的 API。
    • :‑D ...我相信这是因为 MS 鼓励 NET 程序员使用 SQL Server / Express 作为后端数据库,如果你真的不需要 Access
    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多