ADO.Net在SQLite中报告空数据类型

Ice*_*ind 5 c# sqlite ado.net system.data.sqlite

我试图使用C#在SQLite中动态获取我的一个视图的模式.我正在使用此代码:

using (var connection = new SQLiteConnection(ConnectionString))
{
    connection.Open();
    using (DataTable columns = connection.GetSchema("Columns"))
    {
        foreach (DataRow row in columns.Rows)
        {
            string dataType = ((string) row["DATA_TYPE"]).Trim();
            // doing irrelevant other stuff here
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

除了一个视图外,它适用于我的所有表格和视图.由于某种原因,所调用字段的数据类型将显示为SaleAmount空白.row["DATA_TYPE"]元素中没有任何内容.

这是我的观点:

SELECT [Order Subtotals].Subtotal AS SaleAmount, 
              Orders.OrderID, 
           Customers.CompanyName, 
              Orders.ShippedDate
FROM Customers 
JOIN Orders ON Customers.CustomerID = Orders.CustomerID
JOIN [Order Subtotals] ON Orders.OrderID = [Order Subtotals].OrderID 
WHERE ([Order Subtotals].Subtotal >2500) 
AND (Orders.ShippedDate BETWEEN DATETIME('1997-01-01') And DATETIME('1997-12-31'))
Run Code Online (Sandbox Code Playgroud)

我使用标准的System.Data.SQLite库.任何人都知道为什么会出现空白?就像我说的那样,在这一个视图中只发生在这一个领域.

UPDATE

我想出了如何复制这个问题.显然,如果视图包含聚合函数,例如Sum,则GetSchema返回空数据类型.有人知道解决方法吗?

mis*_*256 4

System.Data.SQLite 支持针对这种情况的基于 SQL 的“解决方法”。

请查看此处的说明:

http://system.data.sqlite.org/index.html/artifact/c87341d109c60a64

你的 SQL 应该看起来这样(抱歉,我不是在真正的 PC 上检查要使用的数据类型名称,但原理就在那里):

TYPES [DECIMAL], [INTEGER], [STRING], [DATETIME];
SELECT [Order Subtotals].Subtotal AS SaleAmount, 
        Orders.OrderID, 
        Customers.CompanyName, 
        Orders.ShippedDate
etc...
Run Code Online (Sandbox Code Playgroud)

更新我有了一台真正的电脑。上述内容将确保 GetSchema 具有所有列的数据类型。

注意:从我自己的测试来看,您不能在 VIEW 定义中使用 TYPES 关键字。当您执行 SELECT 语句来获取数据时,它只能出现在 .NET 代码中。当然,您可以使用 TYPES + SELECT 解决方法从 VIEW 定义中获取数据,没有问题;-)