PG Zugriff NPGSQL C# (VS2005) Fehler!

Habe ein Problem.

Modernisierung/Umstellung eines ERP- Systems auf Postgre.
Nutze Visual Studio 2005, Sprache c#.

Folgende Abfrage:
.
.
string cmd = “Select * FROM e_kundbet WHERE (kdbkey=”+this.betnumm.Text+") AND (kdnkey="+this.kdhkey.Text+")";
string message = “”;
string test="";
DialogResult result;
try
{
npgsqlConnection1.Open();
this.befehl = new Npgsql.NpgsqlCommand(cmd,npgsqlConnection1);
this.myReader = befehl.ExecuteReader();
if(myReader.Read())
{
meldbox.Text=myReader.FieldCount.ToString();
this.isok=true;
this.kdsperr.Checked=lbool(myReader[3].ToString().Trim());
this.kdfibnr.Text=myReader[4].ToString();

usw usw. bis zum Feld 24:

inr = 24;
dbint8 = myReader.GetInt64(24);
meldbox.Text = meldbox.Text + " " + Convert.ToString(dbint8);
this.kdktpreis.Text=Convert.ToString(dbint8);

Column (myReader[24]) ist eine BIGINT (VS-NET int64). Hat sie einen Wert von 0, so werden die Daten (alle 72 Felder der Tabelle) fehlerfrei ausgelesen. Wird ein Wert >0 eingegeben, dann erfolgt folgende Fehlermeldung
" COLUMN INDEX OUT OF RANGE" beim Lesen des nächsten Feldes.

Der verwendete INDEX ist jedoch OK (25).

Ich vermute einen BUG in NPGSQL.

Hat jemand eine Ahnung?

Abfrage und Datenbank sind in Ordnung und laufen im PGAdmin wie geschmiert.

Erst mal ein Dankeschön

RudiDE

Hallo RudiDE,

existiert das Feld 24 überhaupt? Wurde der richtige Indexwert in bein Aufruf von GetInt64 verwendet?

Die Fehlermeldung wird in NPGSQL durch folgenden Code erzeugt:


if (Index < 0 || Index >= _currentResultset.RowDescription.NumFields)
{
    throw new IndexOutOfRangeException("Column index out of range");
}



mfg

fristo

Hallo Fristo!

Die Tabelle hat insgesamt 72 Felder, also ist Index 0 bis 71 zulässig.
Der Npsql.DataReader hat dies auch richtig erkannt. Als erstes habe ich die Variable DataReader.FieldCount abgefragt und sogar auf dem Bildschirm angezeigt:

meldbox.Text=myReader.FieldCount.ToString();

Der DataReader zeigt mir also eindeutig, daß er 72 Felder erkannt hat.

Der Errorcode erscheint NACH Index 24, und VOR Index 25.

Der inzwischen in alle Richtungen verbogene Source im Zusammenhang:


dbint8 = myReader.GetInt64(24);
meldbox.Text = meldbox.Text + " " + Convert.ToString(dbint8);
this.kdktpreis.Text=Convert.ToString(dbint8);
inr=25;
dbint4 = myReader.GetInt32(25);
meldbox.Text = meldbox.Text + " " + Convert.ToString(dbint4);
inr = 26;
test = myReader[26].ToString().Trim();
meldbox.Text = meldbox.Text + " " + test;
inr = 27;
this.kdsam.Text=Convert.ToString(myReader.GetInt16(27));
inr = 28;
this.kdinvoic.Text=myReader[28].ToString().Trim();

NACH Auslesen des Inhaltes der BigInt myReader(24) und VOR myReader(25) tritt der Fehler auf. Da ich einen Konvertierungsfehler von PG - BigInt (Int8) in MS Int64 vermutet habe, habe ich schon die Hilfsvariablen dbint8 zwischengeschaltet, ohne jeden Erfolg. Auch NPGSQL wurde auf die neueste Version upgedatet - ohne Erfolg.

Die Datenbank ist OK, PGAdmin liest alle 72 Felder ohne jede Schwierigkeit.

Was mich darüber hinaus sehr verwundert, ist folgendes.

Hat das Feld 24 den Wert 0, dann liest der Reader anstandslos weiter bis zum letzten Index. Erhält Feld 24 einen Wert >0, tritt der Fehler auf, wobei Feld 24 selbst fehlerfrei gelesen wird. Nur Feld 25 hat er dann den Fehler “Column index out of Range”.

Das heißt, der INHALT des Feldes 24 hat mit dem Auftreten des Fehlers zu tuen.

Es kann sich aber auch nicht um einen Anwendungsfehler in der UPDATE Routine handeln, denn auch Änderungen des Wertes über PGAdmin haben die gleiche Auswirkung in der SELECT Routine.

Feld 24 Wert 0 = alles OK, Reader liest bis Feld 71.
Feld 24 Wert >0 = Feld 24 wird korrekt ausgelesen, bei Feld 25 ERROR Index out of Range.

mfG
Rudide

Halllo rudide

ich kann Dir da nicht weiterhelfen, weil ich selbst nicht mit NPGSQL arbeite. Ich hatte nur die Ursache für die Fehlermeldung gefunden. Schau Dir mal die NPGSQL-Internetseite http://pgfoundry.org/projects/npgsql an. Dort gibt es weitere Information zu NPGSQL. Auch kannst Du dort den Sourcecode herunterladen. Wenn Du diesen zumindest vorübergehend in deinem Code einbaust, hast Du die Möglichkeit mit dem Debugger auf Fehlersuche zu gehen. Ich hoffe dass Dir dieser Lösungsansatz weiterhilft.




mfg

fristo

Hallo fristo!

Danke für Deine Mithilfe. Habe den saublözensiert Fehler gefunden. Lag natürlich ganz woanders, nämlich im Team.

Da hat jemand einen Textbox-Event hinzugefügt, der eine Sicherheitsabfrage (natürlich über den gleichen Reader und die gleiche Connection) auslöste, der genau an dieser Stelle den Inhalt des Readers veränderte.

schäm

Trotzdem herzlichen Dank

Rudide