SQLite вставка строковых данных с параметрами приводит к недопустимому исключению приведения - PullRequest
0 голосов
/ 21 января 2019

Доброе утро,

Я работал над некоторыми модульными тестами для нашего кода базы данных 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);

Ничего не изменилось.

У кого-нибудь есть идеи, как использовать параметры и вставлять данные в строковый столбец, где данные представляют собой числовую строку?

1 Ответ

0 голосов
/ 21 января 2019

@ steve16351 получил ответ.

Проблема была на самом деле в CREATE TABLE, где столбец B был типа STRING. SQLite использует тип TEXT.

Изменение в: CREATE TABLE Temp(A INTEGER NOT NULL PRIMARY KEY, B TEXT); исправило проблему.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...