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

ADO.Net reporting empty data type in 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
        }
    }
}

它适用于我的所有表格和视图,但一个视图除外。由于某种原因,名为 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'))

我正在使用 standard System.Data.SQLite 库。任何人都知道为什么这会出现空白?就像我说的,它只发生在这一视图的这一领域。

更新

我想出了如何重现这个问题。显然,如果视图包含聚合函数,例如 SumGetSchema returns 是空数据类型。有人知道解决方法吗?

System.Data.SQLite 支持基于 SQL 的 "workaround" 正是这种情况。

在此处查看说明:

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

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

TYPES [DECIMAL], [INTEGER], [STRING], [DATETIME];
SELECT [Order Subtotals].Subtotal AS SaleAmount, 
        Orders.OrderID, 
        Customers.CompanyName, 
        Orders.ShippedDate
etc...

更新 我得到了一台真正的 PC。以上将确保 GetSchema 具有所有列的数据类型。

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