gpt4 book ai didi

c# - SQLiteDataReader 类型亲和性错误?

转载 作者:行者123 更新时间:2023-12-02 07:14:28 27 4
gpt4 key购买 nike

SQLite 可以在任何其他类型的列中存储任何类型的值。当我尝试使用 SQLiteDataReader 从 .net 应用程序读取此类不同类型的值时,即使我尝试将其作为对象读取,它也会执行到列定义类型的转换。这是一个例子:

using System;
using System.Data.SQLite;

namespace SqliteTypeAffinityTest
{
class Program
{
static void Main(string[] args)
{
using (var connection = new SQLiteConnection("Data Source=:memory:"))
{
// advise from @Shawn to use NoVerifyTypeAffinity does not help, neither separate nor combined with default

// connection.Flags = SQLiteConnectionFlags.NoVerifyTypeAffinity;
// connection.Flags = connection.Flags | SQLiteConnectionFlags.NoVerifyTypeAffinity;

connection.Open();

using (var cmd = new SQLiteCommand(connection))
{
cmd.CommandText = "CREATE TABLE t(b BLOB)";
cmd.ExecuteNonQuery();

cmd.CommandText = "INSERT INTO t(b) VALUES (x'FF')";
cmd.ExecuteNonQuery();

cmd.CommandText = "INSERT INTO t(b) VALUES ('FF')";
cmd.ExecuteNonQuery();

cmd.CommandText = "SELECT b, typeof(b) AS type FROM t";
using (var reader = (SQLiteDataReader)cmd.ExecuteReader())
{
reader.Read();

object t1 = reader.GetValue(0);
string sqliteType1 = reader.GetString(1);

reader.Read();

object t2 = reader.GetValue(0);
string sqliteType2 = reader.GetString(1);

Type netType1 = t1.GetType();
Type netType2 = t2.GetType();

Console.WriteLine("sqlite type #1: {0}, .net type #1: {1}", sqliteType1, netType1);
Console.WriteLine("sqlite type #2: {0}, .net type #2: {1}", sqliteType2, netType2);
}
}
}

Console.WriteLine("done");
Console.Read();
}
}
}

控制台输出将是:

sqlite type #1: blob, .net type #1: System.Byte[]
sqlite type #2: text, .net type #2: System.Byte[]

请注意,.net 类型 #2 是 System.Byte[](SQLite 类型是文本!),但我希望它是 System.String。

有什么方法可以将该值读取为字符串吗?我知道我也可以像我的示例中那样请求值类型并在阅读后执行一些转换,但我想避免它。

在 @MikeT 回复后,编辑 #1 以使我的问题更加正确。我不是在寻找将列读取为字符串的方法。我需要用它自己的类型读取每个值。因此,在我的示例中,t1 必须保留为 byte[],但 t2 必须是字符串。我更新了我的示例以使其更加明确(之前有 1 行有两个 BLOB 列)。

编辑#2,包括带有“使用”的完整测试文本,以使使用的库更加明显并且更容易重现

最佳答案

第三方 SQLite 工具通常不能很好地表示 Blob。但是,我相信使用hex(the_value)将使它们合理地(原文如此)可读。

例如考虑表格(文本和 Blob 在同一列中,特别是对于 Jon :) ):-

enter image description here

使用(由于日期错误):-

SELECT hex(data) FROM convdt;

产量:-

enter image description here

附注使用 x'FF00FE01FD02' 插入(插入类型亲和性为 TEXT 的列中)- 您可以使用quote函数返回X'FF00FE01FD02'

或者处理您可以使用的不同列类型:-

SELECT typeof(data), CASE WHEN typeof(data) = 'blob' THEN hex(data) ELSE data END AS data FROM convdt;

并得到:-

enter image description here

关于c# - SQLiteDataReader 类型亲和性错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53552265/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com