【问题标题】:Reading output sql server stored procedure parameter in C#在 C# 中读取输出 sql server 存储过程参数
【发布时间】:2015-10-06 09:46:41
【问题描述】:

我期望 SQL Server 2008 中的插入语句有两个输出 ID。我相信我在初始化 AddParam 时做错了,因为它没有插入数据。存储过程本身,没有参数的代码也经过测试并且可以正常工作。

存储过程

USE [mydb]
GO

SET ANSI_NULLS ON 
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[p_assessment_dfn_statementAnswer_insert]
@StatementID AS bigint,
@StaffID AS int,
@AssessmentID As bigint,
@StatementText AS nvarchar(MAX), 
@StatementDate AS Date,
@StatementAnswerID AS bigint OUTPUT,
               --
@SignatureCheck AS bit,
@SignatureDate AS Date,
@ElectronicSignatureID AS bigint OUTPUT

 AS
 SET NOCOUNT ON 
 SET XACT_ABORT ON 

-- local variables
DECLARE @l_object    AS SYSNAME = OBJECT_NAME(@@PROCID)
   ,@l_error_msg AS NVARCHAR(2000)   


 BEGIN TRY

   BEGIN TRAN

 INSERT INTO [adb_TestDb].[dbo].[Assessment_Statement_Answer]
       ([StatementID],[StaffID],[AssessmentID],[StatementText],[Date])
 VALUES (@StatementID, @StaffID, @AssessmentID, @StatementText, @StatementDate)


        SET @StatementAnswerID = @@IDENTITY;

 IF(@StatementAnswerID>0)
 BEGIN
    INSERT INTO [adb_TestDb].[dbo].[Assessment_ElectronicSignature]([AssessmentID],[ElectronicSignatureCheck],[SignatureDateAndTime])
    VALUES (@AssessmentID, @SignatureCheck,@SignatureDate)

        SET @ElectronicSignatureID = @@IDENTITY;
 END


  IF(@ElectronicSignatureID>0)
  BEGIN
    INSERT INTO [adb_TestDb].[dbo].[AssessorSignature]([AssessmentElectronicSignatureID],[StatementAnswerID],[AssessorID])
    VALUES(@ElectronicSignatureID, @StatementAnswerID, @AssessmentID)

   END
 COMMIT TRAN 


END TRY

BEGIN CATCH

 -- rollback any open/uncomitted transactions
IF XACT_STATE() IN ( -1, 1) ROLLBACK TRANSACTION            

 -- return an error containing the object, error number and error description
SELECT @l_error_msg = 'Error number : ' + CAST(ERROR_NUMBER()AS VARCHAR) + '. ' + ERROR_MESSAGE()          
RAISERROR (@l_error_msg,16,1)

END CATCH

视图模型

    public class AssessmentStatementAnswerViewModel
{
    public AssessmentStatementAnswerViewModel() { }


        public long StatementAnswerID { get; set; }

        public long StatementID { get; set; }

        public int StaffID { get; set; }

        public long AssessmentID { get; set; }

        public string StatementText { get; set; }

        public DateTime Date { get; set; }

        public string SubmitStatus { get; set; }
        //

        public long AssessmentElectronicSignatureID { get; set; }

        public bool ElectronicSignatureCheck { get; set; }

        public DateTime SignatureDateAndTime { get; set; }

}

我需要帮助的 C# 类

 private static long InsertStatementAnswer_DF_P(ADB.Model.AssessmentStatementAnswerViewModel assessmentAnswerObj, MSSQL sql)
   {
       bool killConnection = Utils.getConnection(ref sql);

       long returnValue = 0;

       try
       {
           sql.SetSProc("[dbo].[p_assessment_dfn_statementAnswer_insert]");
           sql.AddParam("@StatementID", assessmentAnswerObj.StatementID);
           sql.AddParam("@StaffID", assessmentAnswerObj.StaffID);
           sql.AddParam("@AssessmentID", assessmentAnswerObj.AssessmentID);
           sql.AddParam("@StatementText", assessmentAnswerObj.StatementText);
           sql.AddParam("@StatementDate", assessmentAnswerObj.Date);              
           sql.AddParam("@SignatureCheck", assessmentAnswerObj.ElectronicSignatureCheck);
           sql.AddParam("@SignatureDate", assessmentAnswerObj.SignatureDateAndTime);

           sql.AddOutputParam("@StatementAnswerID", SqlDbType.BigInt, 0);
           sql.AddOutputParam("@ElectronicSignatureID", SqlDbType.BigInt, 0);


           sql.ExecuteNonQuery();


       }
       finally
       {
           if (killConnection)
               sql.Dispose();
       }

       return returnValue;
   }

【问题讨论】:

  • 您是否收到错误消息?

标签: c# sql-server-2008 stored-procedures webforms


【解决方案1】:

@StatementAnswerID@ElectronicSignatureID 设置为输出参数:

cmd.Parameters("@StatementAnswerID").Direction = ParameterDirection.Output;
cmd.Parameters("@ElectronicSignatureID").Direction = ParameterDirection.Output;

执行存储过程。 阅读如下:

cmd.Parameters("@StatementAnswerID").Value;
cmd.Parameters("@ElectronicSignatureID").Value;

【讨论】:

    【解决方案2】:
    private static long InsertStatementAnswer_DF_P(ADB.Model.AssessmentStatementAnswerViewModel assessmentAnswerObj, MSSQL sql)
       {
           bool killConnection = Utils.getConnection(ref sql);
    
           long returnValue = 0;
    
           try
           {
               sql.SetSProc("[dbo].[p_assessment_dfn_statementAnswer_insert]");
               sql.AddParam("@StatementID", assessmentAnswerObj.StatementID);
               sql.AddParam("@StaffID", assessmentAnswerObj.StaffID);
               sql.AddParam("@AssessmentID", assessmentAnswerObj.AssessmentID);
               sql.AddParam("@StatementText", assessmentAnswerObj.StatementText);
               sql.AddParam("@StatementDate", assessmentAnswerObj.Date);              
               sql.AddParam("@SignatureCheck", assessmentAnswerObj.ElectronicSignatureCheck);
               sql.AddParam("@SignatureDate", assessmentAnswerObj.SignatureDateAndTime);
    
             //  sql.AddOutputParam("@StatementAnswerID", SqlDbType.BigInt, 0);
              //  sql.AddOutputParam("@ElectronicSignatureID", SqlDbType.BigInt, 0);
    SqlParameter outPutParameter1 = new SqlParameter();
    outPutParameter1 .ParameterName = “@StatementAnswerID”;
    outPutParameter1 .SqlDbType = System.Data.SqlDbType.Int;
    outPutParameter1 .Direction = System.Data.ParameterDirection.Output;
    SqlParameter outPutParameter2 = new SqlParameter();
    outPutParameter2 .ParameterName = “@ElectronicSignatureID”;
    outPutParameter2 .SqlDbType = System.Data.SqlDbType.Int;
    outPutParameter2 .Direction = System.Data.ParameterDirection.Output;
    sql.Parameters.Add(outPutParameter2 );
    sql.Parameters.Add(outPutParameter1 );
               sql.ExecuteNonQuery();
    //Here Your Values
    string ElectronicSignatureID= outPutParameter2 .Value.ToString();
    string StatementAnswerID= outPutParameter1 .Value.ToString();
    
    
           }
           finally
           {
               if (killConnection)
                   sql.Dispose();
           }
    
           return returnValue;
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 2017-04-05
      相关资源
      最近更新 更多