【问题标题】:Update row in Access table using OleDb使用 OleDb 更新 Access 表中的行
【发布时间】:2018-06-17 08:35:32
【问题描述】:

我尝试更新我的 Access 中的一行,我的代码运行良好,我必须异常,但我的数据库没有任何变化

这是我从 Winform 项目中的表单调用的方法

   public static void UpdateNextReportNumber(int machineNumber, string reportNumber)
            {
                try
                {
                    using (OleDbConnection openCon = new OleDbConnection(localConnectionString))
                    {
                        string saveStaff = "UPDATE [Calibration] " +
                            "SET [NextReportNumber]=@report " +
                            "where [MachineNumber]=@machine";

                        using (OleDbCommand querySaveStaff = new OleDbCommand(saveStaff))
                        {
                            querySaveStaff.Connection = openCon;
                            querySaveStaff.Parameters.AddWithValue("@machine", 16);
                            querySaveStaff.Parameters.AddWithValue("@report",2);//Convert.ToInt32(reportNumber.Remove(0, 3)) + 1
                            openCon.Open();
                            int recordsAffected = querySaveStaff.ExecuteNonQuery();
                        }
                    }
                }
                catch (Exception ex)
                {
                    //WriteLog(ex.StackTrace, ex.Message);
                    throw ex;
                }
            }

这就是我的校准表的样子

我的代码通过了这一行

int recordsAffected = querySaveStaff.ExecuteNonQuery();

但在 recordsAffected 中我的值为 0

我不知道该怎么办

我尝试使用 Access 这个查询来执行

UPDATE [Calibration]
SET [NextReportNumber]=2
where [MachineNumber]=36

而且它的工作正常

我也用过

 public static void AddCalibration(Calibration calibration)
        {
            try
            {
                using (OleDbConnection openCon = new OleDbConnection(localConnectionString))
                {
                    string saveStaff = "INSERT into [Calibration] ([MachineNumber] ,[LastCalibrationDate] ,[NextCalibrationDate])" +
                        "VALUES (@MachineNumber, @LastCalibrationDate, @NextCalibrationDate)";

                    using (OleDbCommand querySaveStaff = new OleDbCommand(saveStaff))
                    {
                        querySaveStaff.Connection = openCon;
                        querySaveStaff.Parameters.AddWithValue("@MachineNumber", calibration.MachineNumber);
                        querySaveStaff.Parameters.AddWithValue("@LastCalibrationDate", calibration.LastCalibrationDate);
                        querySaveStaff.Parameters.AddWithValue("@NextCalibrationDate", calibration.NextCalibrationDate);
                        openCon.Open();
                        int recordsAffected = querySaveStaff.ExecuteNonQuery();
                    }
                }
            }
            catch (Exception ex)
            {
                //WriteLog(ex.StackTrace, ex.Message);
                throw ex;
            }
        }

它也可以正常工作......

感谢您的帮助...

【问题讨论】:

  • 这是一个重复的问题,OLEDB for Access 不支持命名参数。请参阅SO post 即答案
  • @Sion.D.P 那么我的插入如何工作?

标签: c# sql ms-access


【解决方案1】:

在 OleDb 中,参数不是通过它们的名称来识别的,而是通过它们在参数集合中的位置来识别的。您应该简单地更改参数的行顺序

querySaveStaff.Parameters.AddWithValue("@report",2);
querySaveStaff.Parameters.AddWithValue("@machine", 16);

在您当前的查询中,报表的参数用于 Where 语句而不是在更新部分,当然没有任何更新,因为没有 WHERE MachineNumber = 2

的记录

确实,在 OleDb 中,您通常使用单个 ? 指定参数占位符,而不是使用 @something 语法,而是使用 Access,可能是为了便于使用 Sql Server 进行移植也接受@ 语法,参数集合中的位置仍然应该是查询文本中预期的正确位置。

【讨论】:

    猜你喜欢
    • 2013-04-20
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多