2009-12-16 87 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