繁体   English   中英

Sqlite 元数据查询因 Microsoft.Data.Sqlite 而失败,与 System.Data.SQLite 一起使用

[英]Sqlite metadata query fails with Microsoft.Data.Sqlite, works with System.Data.SQLite

我有一个直接取自 Microsoft 文档的简单查询(请参阅https://docs.microsoft.com/en-us/dotnet/standard/data/sqlite/metadata )失败。 根据文档,对sqlite_master的查询应该按预期工作,但即使在我创建数据库并创建表之后,它们也会抛出异常。

SELECT t.name AS tbl_name, c.name, c.type, c.[notnull], c.dflt_value, c.pk FROM sqlite_master AS t, pragma_table_info(t.name) AS c WHERE t.type = 'table';

这是突出显示该问题的孤立代码:

using System;
using System.Data;
using Microsoft.Data.Sqlite;

namespace Test.Library
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string connStr = "Data Source=test.db";

                string tableQuery = "CREATE TABLE IF NOT EXISTS 'company' (id Integer PRIMARY KEY AUTOINCREMENT NOT NULL , name Text COLLATE NOCASE , postal Integer);";
                string metadataQuery = "SELECT t.name AS tbl_name, c.name, c.type, c.[notnull], c.dflt_value, c.pk FROM sqlite_master AS t, pragma_table_info(t.name) AS c WHERE t.type = 'table';";

                using (SqliteConnection conn = new SqliteConnection(connStr))
                {
                    conn.Open();
                    DataTable result = Query(tableQuery, conn);
                    Console.WriteLine(result.Rows.Count);

                    result = Query(metadataQuery, conn);
                    Console.WriteLine(result.Rows.Count);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }

            Console.ReadLine();
        }

        private static DataTable Query(string query, SqliteConnection conn)
        {
            using (SqliteCommand cmd = new SqliteCommand(query, conn))
            {
                using (SqliteDataReader rdr = cmd.ExecuteReader())
                {
                    DataTable result = new DataTable();
                    result.Load(rdr);
                    return result;
                }
            }
        }
    }
}

而控制台 output 包括异常(注意第一行是执行第一个查询返回的行数的 Console.WriteLine ,即0 )...

0
Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 1: 'no such table column: pragma_table_info.name'.
   at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(Int32 rc, sqlite3 db)
   at Microsoft.Data.Sqlite.SqliteDataReader.GetSchemaTable()
   at System.Data.ProviderBase.SchemaMapping..ctor(DataAdapter adapter, DataSet dataset, DataTable datatable, DataReaderContainer dataReader, Boolean keyInfo, SchemaType schemaType, String sourceTableName, Boolean gettingData, DataColumn parentChapterColumn, Object parentChapterValue)
   at System.Data.Common.DataAdapter.FillMappingInternal(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 schemaCount, DataColumn parentChapterColumn, Object parentChapterValue)
   at System.Data.Common.DataAdapter.FillMapping(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 schemaCount, DataColumn parentChapterColumn, Object parentChapterValue)
   at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
   at System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
   at System.Data.DataTable.Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler errorHandler)
   at System.Data.DataTable.Load(IDataReader reader)
   at Test.Library.Program.Query(String query, SqliteConnection conn) in C:\Code\Misc\Program.cs:line 43
   at Test.Library.Program.Main(String[] args) in C:\Code\Misc\Program.cs:line 24

请注意, metadataQuery直接来自 Microsoft 的站点(上面的链接)。

当我使用 DB Browser 对 Sqlite (或类似的)执行相同的查询时,它工作正常,并且当使用与System.Data.SQLite相同的代码时,它工作正常(显然 ZA2F2ED4F8EBC2CBB4C21A29DC406D 名称略有不同)。

谢谢!

这看起来像是 Microsoft.Data.Sqlite 如何处理directly从 pragma_table_info 等表值函数查询数据的问题。

另一方面,为了准确获取所有表的所有元数据信息,以下查询有效(使用nuget version 3.1.4测试)

string metadataQuery = "DROP TABLE IF EXISTS info;" +
                       "CREATE TEMPORARY TABLE info AS SELECT t.name AS tbl_name, c.name, c.type, c.[notnull], c.dflt_value, c.pk FROM sqlite_master AS t, pragma_table_info(t.name) AS c WHERE t.type = 'table';" +
                       "SELECT * FROM  info";

对于类似的问题,请参见此处

此外,Microsoft.Data.Sqlite 在获取架构信息方面存在limitations

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM