2016-11-30 19 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から他にキャストできません タイプ。

私は考えることができますが、無駄にしようとしました。私はここで助けが必要です。私はそれらを1つずつ数えることができましたが、それはインターネット上にあるデータベースに毎回電話をかけなければならないことを意味し、これはトラフィックには適していないと思います。

私が欲しいのは、6つのテーブルですべてのレコードを数え、値を返すことができるので、将来の使用のためにC#のプロパティに割り当てることができます。

+0

ので、それをデバッグしてご覧くださいこれはどの行に起こるか。これがDbNullであるかどうかを確認した後、 'if(yourValue!= DbNull)'で期待される振る舞いチェックが行われているとします。それがなぜ起こるのかを確認しない場合。 – mybirthname

+5

ストアドプロシージャでは '@ AreaOfLaw'を決して割り当てないので、代わりに' @ AreaOfLawOut'を代入します。そのため、値はnullとして返されます。 – stuartd

+0

ExecuteNonQueryでエラーが発生します。さて、私は先に行って試してみる。あなたはAreaOfLawの代わりにAreaOfLawOutをC#コードで使うべきだと言っていますか? – Ubeidatu

答えて

0

値が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

関連する問題