Доброе утро,
Я работал над некоторыми модульными тестами для нашего кода базы данных SQLite 3 и столкнулся с этой интересной проблемой. Вот модульный тест, который проходит с летающими цветами:
[Fact]
public void TestDB()
{
FileInfo fi = new FileInfo(Path.GetTempPath() + Guid.NewGuid().ToString() + ".sqlite");
using (SQLiteConnection conn = new SQLiteConnection($"Data Source={fi.FullName};Version=3;"))
{
conn.Open();
conn.ExecuteNonQuery("CREATE Table Temp(A INTEGER NOT NULL PRIMARY KEY, B STRING);");
string sql = "INSERT INTO Temp (A, B) VALUES (@A, @B)";
string s = "Test";
using (SQLiteCommand command = new SQLiteCommand(sql, conn))
{
command.Parameters.Add("@A", System.Data.DbType.Int32).Value = 1;
command.Parameters.Add("@B", System.Data.DbType.String).Value = s;
command.ExecuteNonQuery();
}
sql = $"SELECT B FROM Temp WHERE A = 1";
using (SQLiteCommand command = new SQLiteCommand(sql, conn))
using (SQLiteDataReader reader = command.ExecuteReader())
{
bool read = reader.Read();
Assert.True(read);
if (read)
{
Assert.False(reader.IsDBNull(0));
string b = reader.GetString(0);
Assert.Equal(s, b);
}
}
}
}
но если я изменю одну строку:
string s = "1";
InvalidCastException
выбрасывается на линию reader.GetString(0)
. Думая, может быть, необходима дополнительная подсказка, указав столбец, я также попробовал это:
SQLiteParameter a = new SQLiteParameter("@A", System.Data.DbType.Int32, "A") { Value = 1 };
SQLiteParameter b = new SQLiteParameter("@B", System.Data.DbType.String, "B") { Value = s };
command.Parameters.Add(a);
command.Parameters.Add(b);
Ничего не изменилось.
У кого-нибудь есть идеи, как использовать параметры и вставлять данные в строковый столбец, где данные представляют собой числовую строку?