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 库。任何人都知道为什么这会出现空白?就像我说的,它只发生在这一视图的这一领域。
更新
我想出了如何重现这个问题。显然,如果视图包含聚合函数,例如 Sum
、GetSchema
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 定义中获取数据,没问题 ;-)
我正在尝试使用 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 库。任何人都知道为什么这会出现空白?就像我说的,它只发生在这一视图的这一领域。
更新
我想出了如何重现这个问题。显然,如果视图包含聚合函数,例如 Sum
、GetSchema
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 定义中获取数据,没问题 ;-)