2009-12-16 86 views
0

我有一个应用程序通过将它们添加到数据库来监视进程并“学习”异常。收集错误/异常的过程非常稳固,但不是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(字符串s)功能?插入记录并返回插入记录的ID的东西?

回答

0

如果没有其他逻辑取决于该字符串是否存在,为什么不将它变成一个存储过程,如果它存在则执行INSERT,或者如果不存在,则执行UPDATE?然后以任何方式返回ID。

如果您使用的是SQL Server 2008,那么这是使用MERGE statement的绝好机会。

下面是一个使用MERGE语句的存储过程示例,它将从“this example”修改为“upsert”。

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 
+0

线 WHEN NOT然后再配 INSERT(Errorstring,则)VALUES(@stringValue) 产额:::无效的列名称Errorstring,则'。 – MexDev 2009-12-16 22:19:16