使用OleDb更新Access表中的行

时间:2018-06-17 08:35:32

标签: c# sql ms-access

我尝试在我的Access中更新一行,我的代码运行正常,我必须Exception,但是没有什么改变我的数据库

这是我从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;
                }
            }

这就是我的校准表的样子 enter image description here

我的代码通过了这一行

int recordsAffected = querySaveStaff.ExecuteNonQuery();

但在受影响的记录中,我的值为0

我不知道该怎么做

我尝试使用Access this query

执行
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;
            }
        }

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

感谢您的帮助...

1 个答案:

答案 0 :(得分:2)

在OleDb中,参数不能通过名称识别,而是通过它们在参数集合中的位置来识别。您只需更改参数的行顺序

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

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

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