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类型是text!),但是我希望它是System.String。
有什么方法可以将该值读取为字符串?我知道我也可以像示例中那样请求值类型,并在读取后执行一些转换,但是我想避免这种情况。
在回复@MikeT后,请在我的问题中更正确地编辑#1。我不是在寻找将列读取为字符串的方法。我需要使用自己的类型读取每个值。因此,在我的示例中,t1必须保留为byte [],但t2必须为字符串。我已经更新了示例以使其更加明确(以前有1行带有两个BLOB列)。
EDIT#2包括带有“ using”的完整测试文本,以使使用的库更加明显并且更易于重现
答案 0 :(得分:1)
第三方SQLite工具通常无法很好地代表Blob。但是,我相信使用hex(the_value)
可以使它们具有合理的可读性。
例如考虑表(Text和Blob在同一列中,尤其是Jon :)):-
使用(由于日期错误):-
SELECT hex(data) FROM convdt;
收益率:-
P.S。使用x'FF00FE01FD02'插入(插入到关联类型为TEXT的列中) -您可以使用 quote 函数返回X'FF00FE01FD02'
或者要处理可以使用的不同列类型:-
SELECT typeof(data), CASE WHEN typeof(data) = 'blob' THEN hex(data) ELSE data END AS data FROM convdt;
并获得:-