C# 查询是在0行受影响的情况下执行的,但当尝试直接使用数据库运行时,它可以工作

C# 查询是在0行受影响的情况下执行的,但当尝试直接使用数据库运行时,它可以工作,c#,sql,ms-access,C#,Sql,Ms Access,我有以下Microsoft Access数据库结构: 我试图在book:Return类中创建一个C函数,用于从借书的客户端返回图书。这是通过将借用表上的返回日期设置为调用函数的时间来完成的 以下是函数: 公共布尔返回 { 如果有空 返回false; const string SQL=UPDATE借入集Return\u date=@date,其中Book\u ID=@ID和Return\u date为空; 康涅狄格开放大学; 使用OleDbCommand cmd=conn.CreateComman

我有以下Microsoft Access数据库结构:

我试图在book:Return类中创建一个C函数,用于从借书的客户端返回图书。这是通过将借用表上的返回日期设置为调用函数的时间来完成的

以下是函数:

公共布尔返回 { 如果有空 返回false; const string SQL=UPDATE借入集Return\u date=@date,其中Book\u ID=@ID和Return\u date为空; 康涅狄格开放大学; 使用OleDbCommand cmd=conn.CreateCommand { cmd.CommandText=SQL; cmd.Parameters.addRange新OLEDB参数[] { 刚出现的OleDbParameter@Id身份证件 刚出现的OleDbParameter@Date,日期时间,现在 }; 康涅狄格州关闭; } 返回true; } 当我运行它时,我没有得到任何错误,但数据库中没有任何更改,并且尝试获取受影响的行数返回0

其他涉及数据库的函数工作正常,因此它不是连接字符串

当我尝试在Microsoft Access中运行查询时,它工作正常


我做错了什么?

请尝试使用以下代码,并确保Id具有某些值:

        public bool Return()
        {
            if (IsFree())
                return false;
            const string SQL = "UPDATE Borrow SET Return_date = @Date WHERE Book_ID = @Id AND Return_date IS NULL";

            using (OleDbConnection connection = new OleDbConnection(
               connectionString))
            {
                using(OleDbCommand command = new OleDbCommand(SQL)) {
                   command.Connection = connection;
                   command.Parameters.AddRange(new OleDbParameter[]
                    {
                        new OleDbParameter("@Id", Id),
                        new OleDbParameter("@Date", DateTime.Now)
                    });
                   command.Connection.Open();
                   command.ExecuteNonQuery();
                }
            }
            return true;
        }

您不应该自己关闭连接,最好每次都使用一个新的连接

尝试以下代码,并确保Id有一些值:

        public bool Return()
        {
            if (IsFree())
                return false;
            const string SQL = "UPDATE Borrow SET Return_date = @Date WHERE Book_ID = @Id AND Return_date IS NULL";

            using (OleDbConnection connection = new OleDbConnection(
               connectionString))
            {
                using(OleDbCommand command = new OleDbCommand(SQL)) {
                   command.Connection = connection;
                   command.Parameters.AddRange(new OleDbParameter[]
                    {
                        new OleDbParameter("@Id", Id),
                        new OleDbParameter("@Date", DateTime.Now)
                    });
                   command.Connection.Open();
                   command.ExecuteNonQuery();
                }
            }
            return true;
        }

您不应该自己关闭连接,最好每次使用新连接更改以下两行的顺序:

new OleDbParameter("@Id", Id),
new OleDbParameter("@Date", DateTime.Now)
致:


OLE DB不识别命名参数,只按参数在SQL语句中的显示顺序填充参数。

更改以下两行的顺序:

new OleDbParameter("@Id", Id),
new OleDbParameter("@Date", DateTime.Now)
致:


OLE DB不识别命名的参数,而只是按照参数在SQL语句中出现的顺序填充参数。

我认为这是一个新特性OleDbParameter@Id,从代码运行时,Id中的Id为null。您没有在代码中执行命令。我认为OleDbParameter@Id,当您从代码运行Id时,Id中的Id为null。您没有执行代码中的命令。完全正确。命名参数在olddbquick中不存在。OldDb中不存在命名参数