首页 > 解决方案 > C# Access DB 更新查询没有执行,尽管它的行为就像它一样

问题描述

我一辈子都无法让这个更新查询正常工作。

消息框弹出并说它已更新,但当我查看时,它没有!这是这三个字段中数据的示例:

Syslink = {EF45612D-6321-4D19-97A5-C9497D60D628}
CMCID = 44061
SEC_ID = {00EADB9A-6158-4D2B-85E4-E381CCB02611}

这些列的顺序如下:SEC_ID、SYSLINK、CMCID。在访问的设计视图中,所有这三个字段都是“数字”数据类型,尽管从我在 StackOverflow 中看到的情况来看,除非我误解了,否则在使用 AddWithValue 时这并不重要。

private void buttonMove_Click(object sender, EventArgs e)
{
    try
    {
        bredConn.Open();
        OleDbCommand cmd = new OleDbCommand();
        cmd.Connection = bredConn;
        cmd.CommandText = "UPDATE Component_Section SET [SEC_SYS_COMP_ID]='@Syslink',[SEC_CMC_LINK]='@Cmcid' WHERE [SEC_ID]='@Secid'";
        cmd.Parameters.AddWithValue("@Syslink", labelDebugDestinationSYSLink.Text);
        cmd.Parameters.AddWithValue("@Cmcid", labelDebugDestinationCMC.Text);
        cmd.Parameters.AddWithValue("@Secid", labelDebugSourceSECID.Text);
        cmd.ExecuteNonQuery();
        bredConn.Close();
        MessageBox.Show("Moved", "It moved", MessageBoxButtons.OK);
    }
    catch (Exception ex)
    {

        MessageBox.Show(ex.Message, "Error: On Move", MessageBoxButtons.OK, MessageBoxIcon.Error);
        bredConn.Close();
    }
}

标签: c#ms-accessoledbconnection

解决方案


AddWithValue首先,出于许多我不会深入研究的原因,我总是避免使用。

到目前为止,我发现代码存在两个明显的问题。

  1. 推断每个参数的OleDbParameter类型是因为AddWithValue. 改为使用Add并确保指定与数据库类型匹配的正确类型。

  2. 在查询字符串中的参数周围使用单引号,例如'@Syslink'. 这充其量是不必要的(OleDbParameter自动处理)并且在最坏的情况下会中断,因为它主要用于字符串比较。

进行这些更改会带来额外的好处,即您的Text字段可以转换为正确的类型。

关于您当前的行为,查询正在运行(否则会引发异常),但WHERE过滤器无法匹配您期望的行。

进行上述更改,然后重试。


推荐阅读