2017-05-24 6 views
0

の境界外だった私は、私のAmount列を総括したいが、私はこのエラーメッセージインデックスが配列SqlDataReader.GetDecimal

追加情報を受け取る:インデックスが配列の範囲外でした。ここ

SQLデータベースから残高テーブルの定義である:

CREATE TABLE [dbo].[Balance] 
(
    [BalanceID] [int] IDENTITY(1,1) NOT NULL, 
    [Sn] [nvarchar](50) NULL, 
    [Description] [nvarchar](1000) NULL, 
    [Date] [date] NULL, 
    [Amount] [decimal](8, 0) NULL 
) 

ここでテーブルにアクセスコードC#はSQLインライン介しある

cn.Open(); 

SqlCommand cmd = cn.CreateCommand(); 
cmd.CommandType = CommandType.Text; 
cmd.CommandText = "Select sum(Amount) from Balance where [email protected] and Date Between @SD and @ED"; 

cmd.Parameters.Add(new SqlParameter("@sn", txtSn.Text)); 
cmd.Parameters.Add(new SqlParameter("@SD", DTPStart.Text)); 
cmd.Parameters.Add(new SqlParameter("@ED", DTPEnd.Text)); 
SqlDataReader reader = cmd.ExecuteReader(); 

while (reader.Read()) 
{ 
    Debt = reader.GetDecimal(4); 
} 

reader.Close(); 
cn.Close(); 

すべてのヘルプははるかに理解されるであろう!

+0

どこでエラーが発生しますか? – Backs

+0

単一の値だけが必要な場合は、ExecuteScalarを使用しないでください。 –

答えて

2

メソッドGetDecimalは、メソッド呼び出しの引数として0から始まるインデックスを持つカラムの値を取得します。

はあなたのクエリSelect sum(Amount) from Balanceに1列のみを返すが、そう

Debt = reader.GetDecimal(0); 

更新にコードを変更reader.GetDecimal(4)

で5番目の列を達成しようとしている:それはコメントで指摘したとおり - あなたの特別なケースでは、ExecuteReaderはまったく必要ありません。サーバーから単一の値を返すので、代わりにExecuteScalarを使用してクエリを実行し、クエリによって返された結果セットの最初の行の最初の列を返します。

関連する問題