У меня проблемы с Sqllite SQLiteDataReader. Используя ту же строку подключения и тот же оператор SQL, SQLiteDataReader возвращает пустое устройство чтения, а SQLiteDataAdapter возвращает подозрительную запись.
В этом случае я пытаюсь получить запись с наибольшим значением в поле Id.
База данных содержит несколько записей с уникальными значениями в поле Id, но возвращаемое значение для чтения будет пустым при использовании SQLiteDataReader. Когда я использую ту же строку подключения и оператор SQL с SQLiteDataAdapter, появляются подозрительные результаты Я предоставляю часть статического класса, который я использую для связи с базой данных. Метод SenasteBokning, использующий SQLiteDataReader, не работает. Метод SenasteBokning2, использующий SQLiteDataAdapter, работает идеально.
Что не так с методом SenasteBokning?
Я использую:
Windows 10
Visual Studio 2017
.net framework 4.5.2 (был по умолчанию при создании приложения Windows Forms)
Пакет Nuget System.Data.SQLite.Core 1.0.108
static class Databas
{
private static string appPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
private static string dbPath = @"\BokningarConvention.db";
private static string connectionString = "Data Source= " + appPath + dbPath;
private static SQLiteConnection con;
private static SQLiteCommand cmd;
private static SQLiteDataReader reader;
private static SQLiteDataAdapter adapter;
private static SQLiteCommandBuilder commandBuilder;
private static DataTable table;
private static string senaste = "SELECT Nummer, NrSammaDag, Datum FROM Bekraftelser WHERE Id = (SELECT MAX (Id) FROM Bekraftelser)";
// This don't work
public static Bokning SenasteBokning()
{
Bokning bokning = new Bokning();
using (SQLiteConnection con2 = new SQLiteConnection(connectionString))
{
con2.Open();
SQLiteCommand cmd2 = new SQLiteCommand(senaste, con2);
SQLiteDataReader reader2 = cmd2.ExecuteReader();
// Here the reader is empty
while (reader2.Read())
{
// Error at first read
// should handle results the same way as in SenasteBokning2
// removed during testing
}
}
return bokning;
}
//This works perfekt
public static Bokning SenasteBokning2()
{
Bokning bokning = new Bokning();
using (SQLiteConnection db = new SQLiteConnection(connectionString))
{
adapter = new SQLiteDataAdapter(senaste, connectionString);
commandBuilder = new SQLiteCommandBuilder(adapter);
table = new DataTable();
db.Open();
adapter.Fill(table);
foreach (DataRow row in table.Rows)
{
int nummer;
int samma;
DateTime datum;
nummer = (int)((long)row["Nummer"]);
datum = Verktyg.FromDateInteger((int)((long)row["Datum"]));
if (!row.IsNull("NrSammaDag"))
{
samma = (int)((long)row["NrSammaDag"]);
bokning = new Bokning(nummer, samma, datum);
}
else
{
bokning = new Bokning(nummer, datum);
}
}
}
return bokning;
}
}