C# Sqlite元数据查询在使用Microsoft.Data.Sqlite时失败,可使用System.Data.Sqlite

C# Sqlite元数据查询在使用Microsoft.Data.Sqlite时失败,可使用System.Data.Sqlite,c#,sqlite,microsoft.data.sqlite,C#,Sqlite,Microsoft.data.sqlite,我有一个简单的查询直接从微软的文档(请参阅)中获取,但失败了。根据文档,对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'; 以下是突出问题的

我有一个简单的查询直接从微软的文档(请参阅)中获取,但失败了。根据文档,对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;
                }
            }
        }
    }
}

控制台输出包括异常(注意,第一行是执行第一个查询返回的行数的console.WriteLine,即
0

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

当我使用DB Browser for Sqlite(或类似工具)执行相同的查询时,它工作正常;当使用与
System.Data.Sqlite
相同的代码时,它工作正常(显然类名的大小写略有不同,等等)


谢谢

这似乎是Microsoft.Data.Sqlite如何处理直接从表值函数(如pragma\u table\u info)查询数据的问题

另一方面,为了准确地获取所有表的所有元数据信息,下面的查询工作(使用测试)

有关类似问题,请参见


此外,Microsoft.Data.Sqlite在获取架构信息方面有很大的优势

您使用的是哪个(确切)版本的SQLite?我假设Microsoft.Data.SQLite使用哪个版本。但是我已经安装了:
sqlite3--version
返回
3.29.0 2019-07-10 17:32:03 fc82b73eaac8b36950e527f12c4b5dc1e147e6f4ad2217ae43ad82882a88bfa6
您没有将连接传递到查询方法,字符串metadataQuery不会以分号结束。不确定这个代码是否生成?它是伪代码。实际代码确实传递了这个。它与System.Data.Sqlite配合使用效果很好。当我回到计算机时,它将用actual更新伪代码。谢谢,您的解决方案正是我所希望的。我很高兴它有所帮助:)
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
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";