SQLiteDataReader类型相似性错误?

时间:2018-11-30 06:17:38

标签: c# .net sqlite system.data.sqlite

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”的完整测试文本,以使使用的库更加明显并且更易于重现

1 个答案:

答案 0 :(得分:1)

第三方SQLite工具通常无法很好地代表Blob。但是,我相信使用hex(the_value)可以使它们具有合理的可读性。

例如考虑表(Text和Blob在同一列中,尤其是Jon :)):-

enter image description here

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

SELECT hex(data) FROM convdt;

收益率:-

enter image description here

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;

并获得:-

enter image description here