複数のテーブルからレコードを数え、結果を出力パラメータに返して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#のプロパティに割り当てることができます。
ので、それをデバッグしてご覧くださいこれはどの行に起こるか。これがDbNullであるかどうかを確認した後、 'if(yourValue!= DbNull)'で期待される振る舞いチェックが行われているとします。それがなぜ起こるのかを確認しない場合。 – mybirthname
ストアドプロシージャでは '@ AreaOfLaw'を決して割り当てないので、代わりに' @ AreaOfLawOut'を代入します。そのため、値はnullとして返されます。 – stuartd
ExecuteNonQueryでエラーが発生します。さて、私は先に行って試してみる。あなたはAreaOfLawの代わりにAreaOfLawOutをC#コードで使うべきだと言っていますか? – Ubeidatu