是否可以吞下DB INSERT的异常

Joh*_*ohn 0 sql sql-server exception-handling

是否可以吞下INSERTS的重复密钥违例异常,还是应该检查记录是否存在?

所以,假设我有一个表格照片,其中包含一个字段:PhotoName.我正在浏览文件目录以向Photo添加项目.在这个过程中,当我找到光子名称时,它可能已经存在于数据库中.所以有两种方法可以解决这个问题:

1) //Look to see if it exists before adding it. Only add it if it does not exist.

bool photoExists = SQLSELECTStatementToCheckIfThePhotoExists(photoName);
if(!photoExists)
  SQLCommandToInsertPhoto(photoName)

or 2) //Assume that it doesn't exist. If it does, catch and ignore.
try
{
  SQLCommandToInsertPhoto(photoName);
}
catch(DuplicateKeyException ex)
{
  //swallow it and continue on as if nothing happened.
}
Run Code Online (Sandbox Code Playgroud)

一方面,我不一定喜欢"吞咽"异常的概念,但另一方面,try ... catch只使用一次DB调用.这恰好发生在S​​QL Server中.

Zan*_*ane 5

你绝对不应该只是"吞下"这个例外.您应该尝试找到这些重复项,而不是在需要时插入它们.

方法可以检查密钥上不存在的位置.

INSERT INTO TargetTable

SELECT 
    KeyID,
    blah,
    blerg,
FROM SourceTable AS S
WHERE NOT EXISTS (
    SELECT 1
    FROM TargetTable AS T
    WHERE S.KeyID = T.KeyID
    )
Run Code Online (Sandbox Code Playgroud)

此方法将允许您只将INSERT新行放入表中.这种方法当然不会考虑您可能需要为a做的任何匹配UPDATE,但这不在本问题的范围之内,但仍应考虑.大多数用户也可以使用MERGE我会在我有时间的时候发布一个例子.