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调用.这恰好发生在SQL Server中.
你绝对不应该只是"吞下"这个例外.您应该尝试找到这些重复项,而不是在需要时插入它们.
方法可以检查密钥上不存在的位置.
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我会在我有时间的时候发布一个例子.