2015-05-04 62 views
1

我有一個SQL Server存儲過程,它執行INSERT INTOc#存儲過程scope_identity

我想在C#中插入行的ID。

我無法調試,所以我不知道哪裏是錯誤...

行是完全加在數據庫中,但它總是捕捉異常和ID沒有返回

存儲過程

USE [DatabaseAzerty] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[addLog] 
    -- Add the parameters for the stored procedure here 
    @table varchar(max), 
    @date date, 
    @version varchar(max), 
    @process varchar(max), 
    @level varchar(max), 
    @message varchar(max), 
    @stacktrace varchar(max), 
    @user varchar(max), 
    @environmentID varchar(max), 
    @UUID varchar(max), 
    @UDID varchar(max), 
    @transactionID int, 
    @new_identity int OUTPUT 

AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
-- DECLARE @sql NVARCHAR(MAX); 

-- SET @sql = 'INSERT INTO dbo.' + @table + '([Timestamp], [Version],Process,[Level],[Message],StackTrace,[User],EnvironmentID,UUID,UDID,TransactionID) VALUES (' + CAST(@date AS VARCHAR(MAX)) + ',' + @version + ',' + @process + ','+ @level + ','+ @message + ','+ @stacktrace + ','+ @user + ','+ @environmentID + ','+ @UUID + ','+ @UDID + ',' + @transactionID + ')' 
    --EXEC @sql 
    DECLARE @SQL NVARCHAR(MAX); 

SET @SQL = ' INSERT INTO dbo.' + @Table; 
SET @SQL += ' ([Timestamp], [Version],Process,[Level],[Message],StackTrace,[User],EnvironmentID,UUID,UDID,TransactionID)'; 
SET @SQL += ' VALUES'; 
SET @SQL += ' (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10);'; 

EXECUTE sp_executesql 
     @SQL 
    , N'@p0 DATE, @p1 VARCHAR(MAX), @p2 VARCHAR(MAX), @p3 VARCHAR(MAX), @p4 VARCHAR(MAX), @p5 VARCHAR(MAX), @p6 VARCHAR(MAX), @p7 VARCHAR(MAX), @p8 VARCHAR(MAX), @p9 VARCHAR(MAX), @p10 int' 
    , @p0 = @date 
    , @p1 = @version 
    , @p2 = @process 
    , @p3 = @level 
    , @p4 = @message 
    , @p5 = @stacktrace 
    , @p6 = @user 
    , @p7 = @environmentID 
    , @p8 = @UUID 
    , @p9 = @UDID 
    , @p10 = @transactionID; 

    SELECT @new_identity = CAST(SCOPE_IDENTITY() AS INT); 
END 

C#

SqlConnection conn = new SqlConnection(connectionString); 


      var cmd = new SqlCommand("addLog", conn) 
      { 
       CommandType = System.Data.CommandType.StoredProcedure 
      }; 

      cmd.Parameters.Add(new SqlParameter("@message", message)); 

      SqlParameter id = new SqlParameter("@new_identity", SqlDbType.Int); 
      id.Direction = ParameterDirection.Output; 
      cmd.Parameters.Add(id); 

      conn.Open(); 
      cmd.ExecuteNonQuery(); 
      int returnedID = Convert.ToInt32(cmd.Parameters["@new_identity"].Value); 
      conn.Close(); 

      return returnedID; 
+3

什麼例外? –

+0

你能顯示完整的addLog sp嗎? – 2015-05-04 12:30:06

+0

添加了所有步驟 – Weedoze

回答

3

您需要將輸出參​​數傳遞給您的動態sql。

ALTER PROCEDURE [dbo].[addLog] 
    -- Add the parameters for the stored procedure here 
    @table   SYSNAME, --<-- use SYSNAME data type for Sql Server objects 
    @date   date, 
    @version  varchar(max), 
    @process  varchar(max), 
    @level   varchar(max), 
    @message  varchar(max), 
    @stacktrace  varchar(max), 
    @user   varchar(max), 
    @environmentID varchar(max), 
    @UUID   varchar(max), 
    @UDID   varchar(max), 
    @transactionID int, 
    @new_identity int OUTPUT 

AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @SQL NVARCHAR(MAX); 

SET @SQL = N' INSERT INTO dbo.' + QUOTENAME(@Table)  --<-- use QUOTENAME function here (Sql Injection protection) 
     + N' ([Timestamp], [Version],Process,[Level],[Message] 
         ,StackTrace,[User],EnvironmentID,UUID,UDID,TransactionID)' 
     + N' VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10) ' 
     + N' SELECT @new_identity = SCOPE_IDENTITY(); ' --<-- Capture Identity value here 

EXECUTE sp_executesql 
     @SQL 
    , N'@p0 DATE, @p1 VARCHAR(MAX), @p2 VARCHAR(MAX), @p3 VARCHAR(MAX) 
     , @p4 VARCHAR(MAX), @p5 VARCHAR(MAX), @p6 VARCHAR(MAX), @p7 VARCHAR(MAX) 
     , @p8 VARCHAR(MAX), @p9 VARCHAR(MAX), @p10 int, @new_identity INT OUTPUT' 
    , @p0 = @date 
    , @p1 = @version 
    , @p2 = @process 
    , @p3 = @level 
    , @p4 = @message 
    , @p5 = @stacktrace 
    , @p6 = @user 
    , @p7 = @environmentID 
    , @p8 = @UUID 
    , @p9 = @UDID 
    , @p10 = @transactionID 
    , @new_identity = @new_identity OUTPUT 

END 
+0

出現錯誤「語法不正確」,「。」 – Weedoze

+0

現在試試我已經清理了你的代碼,那裏有太多不必要的東西:) –

+0

必須通過參數號14和後續參數作爲'@name = value' – Weedoze

-1

使用try-finally

int returnedID = 0; 
//..... 
try 
{ 
      cmd.ExecuteNonQuery(); 
} 
finally 
{ 
      int returnedID = Convert.ToInt32(cmd.Parameters["@new_identity"].Value); 
} 
+1

失敗的查詢將不返回任何數據 –

-1

確保參數@new_identity在SQL聲明輸出。 設置返回前關閉連接返回ID 考慮使用@@ IDENTITY