c# - SQLite 插入带参数的字符串数据导致无效强制转换异常

标签 c# .net sqlite

早上好

我正在为我们的 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";

InvalidCastExceptionreader.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);

没有任何变化。

有人知道如何使用参数并将数据插入数据为数字字符串的字符串列吗?

最佳答案

@steve16351 给出了答案。

问题实际上出在 CREATE TABLE 中,其中 B 列的类型为 STRING。 SQLite 使用 TEXT 类型。

将其更改为:CREATE TABLE Temp(A INTEGER NOT NULL PRIMARY KEY, B TEXT); 解决了问题。

谢谢!

关于c# - SQLite 插入带参数的字符串数据导致无效强制转换异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54296324/

相关文章:

sql - 你能在 WHERE 子句中按字母顺序比较文本吗?

c++ - 非托管类的成员不能有 ref 类类型或接口(interface)类类型

c# - 如何在 Visual Studio 2017 解决方案中创建 "content only"项目?

C# TcpClient 不会注册断开连接

c# - 让计时器执行 bidder00_TextChanged 事件

c# - System.Runtime.Caching.MemoryCache 是否在同一服务器中跨进程共享

c# - 在文本匹配 MVVM 上更改 TextBox BorderBrush 的颜色

.net - 如何使用 Moq 模拟输出参数?

c# - 如何添加工具栏项 .net maui?

java - sqlite 将 Jdn 转换为 unixepoch