将收集的错误添加到数据库

时间:2009-12-16 20:46:13

标签: .net sql-server-2008

我有一个应用程序监视进程并“学习”异常,方法是将它们添加到数据库中。收集错误/异常的过程非常可靠,但不是在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的东西?

1 个答案:

答案 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