2016-11-30 53 views
-1

我想從多個表中計數記錄並將結果返回給輸出參數,以便我可以在Visual Studio C#中使用它們。計數SQL Server記錄並通過輸出參數返回結果

下面是T-SQL和C#代碼:

T-SQL代碼:

ALTER PROCEDURE CountRecordsForUpdates 
    @AreaOfLaw AS numeric OUTPUT, 
    @SubjectMatter AS numeric OUTPUT, 
    @Principles AS numeric OUTPUT, 
    @Judges AS numeric OUTPUT, 
    @Courts AS numeric OUTPUT 
AS 
    DECLARE @AreaOfLawOut AS numeric 
    DECLARE @SubjectMatterOut AS numeric 
    DECLARE @PrinciplesOut AS numeric 
    DECLARE @JudgesOut AS numeric 
    DECLARE @CourtsOut AS numeric 
    DECLARE @CasesOut AS numeric 
    DECLARE @ReportsOut AS numeric 
    DECLARE @IssuesDiscussedOut AS numeric 
    --DECLARE @Judgement AS numeric 
BEGIN 
    SET NOCOUNT ON; 

    SELECT @AreaOfLawOut = COUNT(AoLId) FROM [dbo].[CLR.AreaOfLaw] OUTPUT 
    SELECT @SubjectMatterOut = COUNT(SMId) FROM [dbo].[CLR.SubjectMatter] OUTPUT 
    SELECT @PrinciplesOut = COUNT(PId) FROM [dbo].[CLR.Principle] OUTPUT 
    SELECT @JudgesOut = COUNT(JId) FROM LocalJudgesView OUTPUT 
    SELECT @CourtsOut = COUNT(CourtId) FROM LocalCourtView OUTPUT 
    SELECT @CasesOut = COUNT(CaseId) FROM LocalReportedCaseView OUTPUT 
    SELECT @ReportsOut = COUNT(ReportId) FROM LocalReportView OUTPUT 
    SELECT @IssuesDiscussedOut = COUNT(IDId) FROM CLR_IssuesDiscussedView OUTPUT 
END 
GO 

C#代碼:

try 
{ 
    decimal aol = 0, sm = 0, p = 0, judge = 0, court = 0; 

    using (SqlConnection sqlConnection = new SqlConnection(DataSources.RemoteConnectionString())) 
    { 
     sqlConnection.Open(); 

     using (SqlCommand sqlCommand = new SqlCommand("[DB7934_businessmind].[CountRecordsForUpdates]", sqlConnection)) 
     { 
      sqlCommand.CommandType = System.Data.CommandType.StoredProcedure; 

      SqlParameter aolParam = new SqlParameter("@AreaOfLaw", aol) { Direction = System.Data.ParameterDirection.Output }; 
      sqlCommand.Parameters.Add(aolParam); 

      SqlParameter smParam = new SqlParameter("@SubjectMatter", sm) { Direction = System.Data.ParameterDirection.Output }; 
      sqlCommand.Parameters.Add(smParam); 

      SqlParameter pParam = new SqlParameter("@Principles", p) { Direction = System.Data.ParameterDirection.Output }; 
      sqlCommand.Parameters.Add(pParam); 

      SqlParameter judgeParam = new SqlParameter("@Judges", judge) { Direction = System.Data.ParameterDirection.Output }; 
      sqlCommand.Parameters.Add(judgeParam); 

      SqlParameter courtParam = new SqlParameter("@Courts", court) { Direction = System.Data.ParameterDirection.Output }; 
      sqlCommand.Parameters.Add(courtParam); 

      sqlCommand.ExecuteNonQuery(); 
      sqlCommand.Dispose(); 

      AoLRemoteCount = Convert.ToDecimal(aolParam.Value); 
      SMRemoteCount = Convert.ToDecimal(smParam.Value); 
      PRemoteCount = Convert.ToDecimal(pParam.Value); 
      CourtRemoteCount = Convert.ToDecimal(courtParam.Value); 
      JRemoteCount = Convert.ToDecimal(judgeParam.Value); 
     } 

     sqlConnection.Close(); 
    } 
} 
catch(Exception ex) 
{ 
    MessageBox.Show("An error has occurred while counting cloud records, the original error is: " 
     + ex.Message, "Cloud Records", MessageBoxButtons.OK, MessageBoxIcon.Error); 
} 

當我運行代碼,我得到以下錯誤消息:

對象不能從DBNULL轉換到其他類型。

我嘗試了所有我能想到的,但無濟於事。我需要幫助。我能夠一一統計他們,但這意味着我必須每次打電話給互聯網上的數據庫,我認爲這不利於流量。

我想要的就是一次性我能夠統計大約6個表中的所有記錄並返回值,以便我可以將它們分配給c#中的屬性以備將來使用。

+0

所以調試一下,看看在哪一行發生。在檢查爲什麼這是DbNull之後,你是否期望它是,如果這是預期的行爲檢查'if(yourValue!= DbNull)'做的東西。如果不檢查爲什麼發生這種情況 – mybirthname

+5

在您的存儲過程中,您永遠不會分配'@ AreaOfLaw',而是分配'@ AreaOfLawOut',這就是值返回爲null的原因。 – stuartd

+0

錯誤發生在ExecuteNonQuery上。好吧,我會繼續嘗試。你是說我應該使用AreaOfLawOut代替C#代碼中的AreaOfLaw? – Ubeidatu

回答

0

當DB中的值爲NULL時,它將返回爲DBNull。您必須相應地檢查:

SMRemoteCount = !DBNull.Value.Equals(smParam.Value) ? Convert.ToDecimal(smParam.Value) : 0m; 

UPDATE:

您還必須確保您在存儲過程中分配返回值:

ALTER PROCEDURE CountRecordsForUpdates 
-- Add the parameters for the stored procedure here 
@AreaOfLaw AS numeric OUTPUT, 
@SubjectMatter AS numeric OUTPUT, 
@Principles AS numeric OUTPUT, 
@Judges AS numeric OUTPUT, 
@Courts AS numeric OUTPUT 

AS 
DECLARE @CasesOut AS numeric 
DECLARE @ReportsOut AS numeric 
DECLARE @IssuesDiscussedOut AS numeric 
--DECLARE @Judgement AS numeric 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for procedure here 
SELECT @AreaOfLaw = COUNT(AoLId) FROM [dbo].[CLR.AreaOfLaw] OUTPUT 
SELECT @SubjectMatter = COUNT(SMId) FROM [dbo].[CLR.SubjectMatter] OUTPUT 
SELECT @Principles = COUNT(PId) FROM [dbo].[CLR.Principle] OUTPUT 
SELECT @Judges = COUNT(JId) FROM LocalJudgesView OUTPUT 
SELECT @Courts = COUNT(CourtId) FROM LocalCourtView OUTPUT 
SELECT @CasesOut = COUNT(CaseId) FROM LocalReportedCaseView OUTPUT 
SELECT @ReportsOut = COUNT(ReportId) FROM LocalReportView OUTPUT 
SELECT @IssuesDiscussedOut = COUNT(IDId) FROM CLR_IssuesDiscussedView OUTPUT 
END 
GO 
+0

你是對的Sefe,問題來自存儲過程。按照您的更正,現在按預期工作,我很高興。感謝所有爲我的快樂做出貢獻的人。非常感謝你。 – Ubeidatu

+0

如果答案解決了您的問題,那麼您應該接受該答案,其他具有類似問題的人員也會知道。 – Sefe