2017-05-24 2 views
0

Ich möchte meine Amount Spalte zusammenzufassen, aber ich erhalte diese FehlermeldungIndex war außerhalb der Grenzen des Arrays SqlDataReader.GetDecimal

Zusätzliche Informationen: Index außerhalb der Grenzen des Arrays war. Hier

ist die Definition des Wägetisch aus SQL-Datenbank:

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 
) 

Hier ist der Code C#, die die Tabelle über SQL Inline greift

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(); 

Jede Hilfe wird sehr geschätzt !

+0

Woher erhalten Sie den Fehler? – Backs

+0

Wenn Sie nur einen einzelnen Wert wünschen, warum nicht ExecuteScalar verwenden? –

Antwort

2

Die Methode GetDecimal ruft den Wert der Spalte mit einem nullbasierten Index ab, der als Argument des Methodenaufrufs bereitgestellt wird.

Sie Rückkehr nur eine Spalte in Ihrer Abfrage Select sum(Amount) from Balance, sondern versuchen, in fünfte Spalte reader.GetDecimal(4)

So erreichen Sie den Code

Debt = reader.GetDecimal(0); 

aktualisieren ändern: Wie es in den Kommentaren darauf hingewiesen wurde - In Ihrem speziellen Fall brauchen Sie überhaupt nicht ExecuteReader. Da Sie einen einzelnen Wert vom Server zurückgeben, können Sie stattdessen ExecuteScalar verwenden, der die Abfrage ausführt und die erste Spalte der ersten Zeile in der von der Abfrage zurückgegebenen Ergebnismenge zurückgibt.

Verwandte Themen