【问题标题】:Catching specific exception while inserting data in acces database在访问数据库中插入数据时捕获特定异常
【发布时间】:2012-02-17 12:14:29
【问题描述】:

我正在将数据插入到访问数据库中,如果数据已经存在,即发现重复的实体,则只需更新该实体。

 public bool InsertInToTooltip()
        {
            InitializeSettingsDatabase();
            OleDbCommand command;
            command = new OleDbCommand(//Query, settingsDbConn);
            try
            {
                command.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                UpdateTable();
            }
            CloseDatabase();
            return true;
        }

在访问数据库中插入重复条目是否会引发任何特定异常?

【问题讨论】:

  • 为什么不以不尝试插入重复记录的方式编写查询?
  • 任何你想举的例子
  • 没有数据有点困难,但大致:INSERT INTO Table1 ( ID, AText ) SELECT Distinct 98 AS ID, "AText" AS AText FROM Table1 WHERE 98 Not In (SELECT ID FROM Table1)

标签: c# ms-access c#-4.0 ms-access-2003


【解决方案1】:

您应该检查记录是否存在并且发出插入或更新,而不是为此使用异常。您可以将该逻辑包装在一个存储过程中,或者选择一个附加查询。

一体机

IF EXIST (select true from table where id = @id)
    Update table set x = y
 Else
    Insert into table (x, y) values ('x', 'y')

【讨论】:

  • 这会导致访问数据库的额外开销。
  • 将其作为单个语句执行将比执行 2 更有效,甚至比您当前也处理异常的方法更有效!
  • 问题是针对 MS Access,该查询针对 TSQL、AFAICT。
  • 使用 Access,您必须执行多个查询以进行更新和插入。
  • @Remou,举个例子
【解决方案2】:

如果您使用 DataGridViews、ComboBoxes 等控件,请尝试使用 DataAdapter...只要您将其链接到数据库源和控件,它将自动为您完成所有处理。否则我宁愿做一个额外的 sql 语句来检查数据库中的数据是否可用,例如

SELECT * FROM TABLE WHERE COLUMN = _VAR

根据它返回的内容,您可以插入或更新。我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多