【问题标题】:Database not updating after running this query运行此查询后数据库未更新
【发布时间】:2020-07-07 03:40:25
【问题描述】:
        String updateQuery = "UPDATE " + tableEmployeeContact + "  SET LastUpdate='@CurrentTimeStamp', EmployeeLastName='@EmployeeLastName', EmployeeFirstName='@EmployeeFirstName',EmployeeAddress1='@EmployeeAddress1',EmployeeAddress2='@EmployeeAddress2',EmployeeCity='@EmployeeCity',EmployeeState='@EmployeeState',EmployeeZip='@EmployeeZip',EmployeeHomePhone='@EmployeeHomePhone',EmployeeCellPhone='@EmployeeCellPhone',EmployeeHomeEmail='@EmployeeHomeEmail',EmergencyContactName='@EmergencyContactName',EmergencyContactRelationship='@EmergencyContactRelationship',EmergencyContactHomePhone='@EmergencyContactHomePhone',EmergencyContactCellPhone='@EmergencyContactCellPhone',EmergencyContactWorkPhone='@EmergencyContactWorkPhone' WHERE EmployeeLastName='@EmployeeLastName' AND EmployeeFirstName='@EmployeeFirstName'";
        using (OleDbConnection connection = new OleDbConnection(connectionString))
        {
            OleDbCommand command = new OleDbCommand(updateQuery, connection);
            connection.Open();
            if(connection.State == ConnectionState.Open)
            {
                command.Parameters.Add("@CurrentTimeStamp", OleDbType.VarChar).Value = labelTimeStamp.Text.Trim();
                command.Parameters.Add("@EmployeeLastName", OleDbType.VarChar).Value = cm.LastName;
                command.Parameters.Add("@EmployeeFirstName", OleDbType.VarChar).Value = cm.FirstName;
                command.Parameters.Add("@EmployeeAddress1", OleDbType.VarChar).Value = cm.EmployeeAddress1;
                command.Parameters.Add("@EmployeeAddress2", OleDbType.VarChar).Value = cm.EmployeeAddress2;
                command.Parameters.Add("@EmployeeCity", OleDbType.VarChar).Value = cm.EmployeeCity;
                command.Parameters.Add("@EmployeeState", OleDbType.VarChar).Value = cm.EmployeeState;
                command.Parameters.Add("@EmployeeZip", OleDbType.VarChar).Value = cm.EmployeeZip;
                command.Parameters.Add("@EmployeeHomePhone", OleDbType.VarChar).Value = cm.EmployeeHomePhone;
                command.Parameters.Add("@EmployeeCellPhone", OleDbType.VarChar).Value = cm.EmployeeCellPhone;
                command.Parameters.Add("@EmployeeHomeEmail", OleDbType.VarChar).Value = cm.EmployeeHomeEmail;

                command.Parameters.Add("@EmergencyContactName", OleDbType.VarChar).Value = cm.EmployeeECName;
                command.Parameters.Add("@EmergencyContactRelationship", OleDbType.VarChar).Value = cm.EmployeeECRelationship;
                command.Parameters.Add("@EmergencyContactHomePhone", OleDbType.VarChar).Value = cm.EmployeeECHomePhone;
                command.Parameters.Add("@EmergencyContactCellPhone", OleDbType.VarChar).Value = cm.EmployeeECCellPhone;
                command.Parameters.Add("@EmergencyContactWorkPhone", OleDbType.VarChar).Value = cm.EmployeeECWorkPhone;
                try
                {
                    command.ExecuteNonQuery();                        
                    MessageBox.Show("Record Updated");
                    connection.Close();
                } catch (OleDbException ex)
                {
                    Console.WriteLine(ex.Source);
                    MessageBox.Show(ex.Source);
                }
            }
        } 

我收到消息框说“记录已更新”,但是在应用程序运行后,我检查了数据库并且记录没有更新。

不知道为什么它不起作用。我确保每个附加值都是正确的。


当我使用此更新查询并注释 if 语句下的所有参数时

String updateQuery = "UPDATE " + tableEmployeeContact + "  SET LastUpdate = '" + labelTimeStamp.Text.Trim() + "', EmployeeLastName = '" + cm.LastName + "', EmployeeFirstName = '" + cm.FirstName + "', EmployeeAddress1 = '" + cm.EmployeeAddress1 + "', EmployeeAddress2 = '" + cm.EmployeeAddress2 + "', EmployeeCity = '" + cm.EmployeeCity + "', EmployeeState = '" + cm.EmployeeState + "', EmployeeZip = '" + cm.EmployeeZip + "', EmployeeHomePhone = '" + cm.EmployeeHomePhone + "', EmployeeCellPhone = '" + cm.EmployeeCellPhone + "', EmployeeHomeEmail = '" + cm.EmployeeHomeEmail + "', EmergencyContactName = '" + cm.EmployeeECName + "', EmergencyContactRelationship = '" + cm.EmployeeECRelationship + "', EmergencyContactHomePhone = '" + cm.EmployeeECHomePhone + "', EmergencyContactCellPhone = '" + cm.EmployeeECCellPhone + "', EmergencyContactWorkPhone = '" + cm.EmployeeECWorkPhone + "' WHERE EmployeeLastName='" + cm.LastName + "' AND EmployeeFirstName='" + cm.FirstName + "'";

查询有效,一切都得到更新。但是有人告诉我,应该使用参数而不是直接在 SQL 字符串中使用值。

【问题讨论】:

  • 你确定你有正确的连接字符串吗?您是否无意中更新了不同的数据库?
  • 如果该命令更新了0条记录,这也被认为是成功的。您需要检查 oledb 命令更新的行数 - 如 PaulF 的回答所示。
  • @itsme86 - 错误的连接字符串会导致异常
  • WHERE EmployeeLastName='@EmployeeLastName' AND EmployeeFirstName='@EmployeeFirstName' 表示不能更改它们 => 更新它们没有意义。 '不应该在那里。
  • @PaulF 我没有说“坏”连接字符串。也许他有 2 个数据库副本(test 和 prod)并且指向错误的副本。

标签: c# ms-access oledbcommand


【解决方案1】:

请参阅OleDbCommand.Parameters Property,查询中的参数是位置参数且未命名,因此顺序很重要,必须在参数集合和查询之间匹配。使用 ? 作为占位符。尽管在对 Ms Access 执行时名称没有意义,但您仍然可以命名集合中的参数。

string updateQuery = "UPDATE " + tableEmployeeContact + @" SET 
     LastUpdate=?
    ,EmployeeAddress1=?
    ,EmployeeAddress2=?
    ,EmployeeCity=?
    ,EmployeeState=?
    ,EmployeeZip=?
    ,EmployeeHomePhone=?
    ,EmployeeCellPhone=?
    ,EmployeeHomeEmail=?
    ,EmergencyContactName=?
    ,EmergencyContactRelationship=?
    ,EmergencyContactHomePhone=?
    ,EmergencyContactCellPhone=?
    ,EmergencyContactWorkPhone=?
 WHERE EmployeeLastName=? AND EmployeeFirstName=?";

using (OleDbConnection connection = new OleDbConnection(connectionString))
{
    OleDbCommand command = new OleDbCommand(updateQuery, connection);
    connection.Open();
    if(connection.State == ConnectionState.Open)
    {
        // In MS Access the order of parameters is critical!!

        // I recommend replacing this with the below commented out parameter and changing your data type in MS Access accordingly. The type system is in place for a reason, not everything is a string.
        command.Parameters.Add("@CurrentTimeStamp", OleDbType.VarChar).Value = labelTimeStamp.Text.Trim();
        // command.Parameters.Add("@CurrentTimeStamp", OleDbType.DBTimeStamp).Value = DateTime.Now;

        command.Parameters.Add("@EmployeeAddress1", OleDbType.VarChar).Value = cm.EmployeeAddress1;
        command.Parameters.Add("@EmployeeAddress2", OleDbType.VarChar).Value = cm.EmployeeAddress2;
        command.Parameters.Add("@EmployeeCity", OleDbType.VarChar).Value = cm.EmployeeCity;
        command.Parameters.Add("@EmployeeState", OleDbType.VarChar).Value = cm.EmployeeState;
        command.Parameters.Add("@EmployeeZip", OleDbType.VarChar).Value = cm.EmployeeZip;
        command.Parameters.Add("@EmployeeHomePhone", OleDbType.VarChar).Value = cm.EmployeeHomePhone;
        command.Parameters.Add("@EmployeeCellPhone", OleDbType.VarChar).Value = cm.EmployeeCellPhone;
        command.Parameters.Add("@EmployeeHomeEmail", OleDbType.VarChar).Value = cm.EmployeeHomeEmail;

        command.Parameters.Add("@EmergencyContactName", OleDbType.VarChar).Value = cm.EmployeeECName;
        command.Parameters.Add("@EmergencyContactRelationship", OleDbType.VarChar).Value = cm.EmployeeECRelationship;
        command.Parameters.Add("@EmergencyContactHomePhone", OleDbType.VarChar).Value = cm.EmployeeECHomePhone;
        command.Parameters.Add("@EmergencyContactCellPhone", OleDbType.VarChar).Value = cm.EmployeeECCellPhone;
        command.Parameters.Add("@EmergencyContactWorkPhone", OleDbType.VarChar).Value = cm.EmployeeECWorkPhone;

        // Moved to the end and removed from the SET clause
        command.Parameters.Add("@EmployeeLastName", OleDbType.VarChar).Value = cm.LastName;
        command.Parameters.Add("@EmployeeFirstName", OleDbType.VarChar).Value = cm.FirstName;

        try
        {
            var numberUpdated = command.ExecuteNonQuery();                        
            MessageBox.Show("Record Updated = " + numberUpdated.ToString());
            // connection.Close(); // not needed as the connection is closed and disposed by the using block its wrapped in
        } catch (OleDbException ex)
        {
            Console.WriteLine(ex.Source);
            MessageBox.Show(ex.Source);
        }
    }
} 

  • 请注意,当您的参数周围有此刻度标记时,例如 '@EmployeeAddress1',我将其更改为此 @EmployeeAddress1(参数周围没有 ' 符号)
  • 我从 SET 子句中删除了 2 个参数。您在查询中将它们加倍,但在参数中没有加倍,这会导致 Ms Access 出现问题。
  • 为什么要将 CurrentTimeStamp 指定为 varchar 而不是某种类型的日期时间类型?

【讨论】:

    【解决方案2】:

    首先进行更改以获取更新的实际行数。

    这将确认更新是否发生。

    var rowCount = command.ExecuteNonQuery();
    

    由于它没有更新,您是否使用了关闭自动提交的数据库? SQL Server 通常开启自动提交,Oracle 关闭,在这种情况下您需要使用事务并提交。

    https://msdn.microsoft.com/en-us/library/system.data.oracleclient.oracletransaction.commit(v=vs.110).aspx

    【讨论】:

    • 它是一个访问数据库。我从未听说过 MSACCESS 中的自动提交。我在哪里可以找到它?
    • 这不适用于访问。您确认实际行数 > 0 了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 2020-03-17
    • 1970-01-01
    • 2020-11-20
    相关资源
    最近更新 更多