SQLiteDataReader.read () leegt resultaten?

Ik heb een methode in mijn C# -klasse die een enkel resultaat van een SQLite-database aanroept. Mijn databaseverbinding wordt met succes geopend, maar na het uitvoeren van onderbrekingspunten op verschillende plaatsen, merkte ik iets vreemds op. Dit is mijn code:

Dictionary getResult(string id)
{
    dataConn.Open();
    SQLiteCommand comm = dataConn.CreateCommand();
    comm.CommandText = "SELECT * FROM [tableName] WHERE id='" + id + "'";
    SQLiteDataReader result = comm.ExecuteReader();
    Dictionary resultDict = new Dictionary();

    /*
    This doesn't work.
    while(result.Read())
    {
        resultDict.Add(result.GetName(0), result.GetString(0));
    }
    */

    result.Read();
    for (int i = 0; i < result.FieldCount; i++)
    {
        resultDict.Add(result.GetName(i), result.GetString(i));
    }
    result.Dispose();
    comm.Dispose();
    dataConn.Close();
    return resultDict;
}

Ik weet dat ik SQLiteParameters kan gebruiken in plaats van inline aaneenschakeling, maar om de een of andere reden braken ze mijn vraag.

In mijn eerste loop, als ik een breekpunt plaats net voordat het begint, kan ik zien dat mijn vraag een enkel resultaat heeft opgeleverd, precies wat ik nodig heb. Maar, wanneer ik in mijn loop loop, voordat ik een andere code dan reader uitvoer.Read() , VS2010 zegt: "Opsomming leverde geen resultaten op." maar ze waren er momenten daarvoor?

Dus ik probeerde de tweede lus. Uitvoeren van reader.Read() , en vervolgens door herhaalde velden lussen. Wanneer ik dat doe, geeft VS2010 de fout "Geen huidige rij geselecteerd.".

Ik ben hiermee volledig verdwaald, ik heb geen idee wat er mis is, omdat de rest van mijn SQLite-verbindingen voor andere databasebestanden prima werken. Ik heb mijn query in SQLite Administrator getest en mijn query wordt prima uitgevoerd. Het enige dat ik nastreef is om een ​​woordenboek te krijgen waarin de sleutel de naam van het veld is en de waarde het resultaat is van dat veld. Om het even welke ideeën over wat verkeerd is? Of is er een manier om deze code eenvoudiger te maken, tijdens het oplossen ervan?

1

3 antwoord

Opgelost. Om de een of andere reden brak het gebruik van .GetString (0) of .GetString (i) . Toen ik het echter veranderde in .GetValue (0) .ToString() werkte het prima. Ik heb geen idee waarom dit het geval is, het gaat mij te boven, maar het werkt.

4
toegevoegd
werkt voor Unity Mono.
toegevoegd de auteur Maadiah, de bron

Het is omdat GetValue (0) geen reeks heeft geretourneerd.

Casting it to a string allowed you to add it to the Dictionary.

0
toegevoegd
kerel, dat is gewoon raar gedrag. Misschien heb je eerst de DoWhile-lus gedaan (ik weet dat de codes een opmerking bevatten) en daarna wanneer je het resultaat probeerde. Lees wat er al gelezen zou zijn? Gewoon een gok, maar nu weet ik niet zeker waarom de methode ToString() werkt.
toegevoegd de auteur Jeremy Thompson, de bron
Maar waarom zou dit ertoe leiden dat er geen waarden zijn opgeslagen in reader ?
toegevoegd de auteur Connor Deckers, de bron
Nee, ik weet dat dit een probleem kon veroorzaken, dus ik controleerde of het alleen in de while lus werd geroepen, of op zichzelf en vervolgens werd herhaald door de lus voor . Maar ja, het is raar.
toegevoegd de auteur Connor Deckers, de bron

Ik had een gelijkaardig probleem, in mijn geval was de lijst leeg, en ik vroeg om MAX() van wat collumn. Ik heb dit opgelost door eerst te controleren of COUNT (*) niet 0 is.

0
toegevoegd