我有一个应用程序监视进程并“学习”异常,方法是将它们添加到数据库中。收集错误/异常的过程非常可靠,但不是在DB端存储。 我想要完成的是像
public int GetErrorId(string StringToClassify)
{
sql = "SELECT [id] FROM [DBNAME].[dbo].[ERRORS] WHERE [ErrorString] = (@StringToClassify)";
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
SqlCommand cmd = new SqlCommand(sql, connection);
cmd.Parameters.Add("@StringToClassify", SqlDbType.VarChar);
cmd.Parameters["@StringToClassify"].Value = StringToClassify;
connection.Open();
Object result = cmd.ExecuteScalar();
if (result == null)
sysId = AddError(StringToClassify);
else
sysId = Int32.Parse(result.ToString());
}
}
如何实现 AddError(string s)功能? 插入记录并返回插入记录的ID的东西?
答案 0 :(得分:0)
如果没有其他逻辑依赖于字符串是否存在,为什么不将它变成存储过程,如果它存在则执行INSERT,如果不存在则更新为UPDATE?然后返回ID。
如果您使用的是SQL Server 2008,这是使用MERGE statement的绝佳机会。
以下是使用MERGE语句的存储过程示例,它将“upsert”,从this example修改。
CREATE PROC dbo.usp_VendorUpsert
(
@stringID INT OUTPUT,
@stringValue VARCHAR(80)
)
AS
BEGIN
SET NOCOUNT ON;
MERGE dbo.Errors as target
USING (SELECT @stringValue) AS source(ErrorString)
ON target.ErrorString = source.ErrorString
WHEN NOT MATCHED THEN
INSERT (ErrorString) VALUES (@stringValue)
WHEN MATCHED THEN
UPDATE SET @stringID = id;
// Get the id from the insert or the update.
SET @stringID = COALESCE(SCOPE_IDENTITY(), @stringID);
END
RETURN