2015-05-30 3 views
5

Я пытаюсь динамически получить схему одного из моих представлений в SQLite с помощью C#. Я использую этот код:ADO.Net, сообщающий пустой тип данных в 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 библиотеки. Кто-нибудь может подумать, почему это было бы пустым? Как я уже сказал, это происходит только в этом поле в этом представлении.

UPDATE

Я понял, как дублировать вопрос. По-видимому, если представление содержит агрегированную функцию, например Sum, GetSchema возвращает пустой тип данных. Кто-нибудь знает об обходном пути?

ответ

4

System.Data.SQLite поддерживает «обходной путь» на основе SQL для этого сценария.

Посмотрите здесь для получения инструкций:

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

Вы SQL должны выглядеть что-то вроде этого (жаль, что я не на реальном компьютере, чтобы проверить имена типов, какие данные использовать, но принцип есть):

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

UPDATE я получил реальный компьютер. Вышеприведенное гарантирует, что GetSchema имеет типы данных для всех столбцов.

ПРИМЕЧАНИЕ: Оказывается, из моих собственных тестов, которые вы не можете иметь ТИПЫ ключевое слово в определении VIEW. Он может присутствовать только в вашем .NET-коде, когда вы выполняете инструкцию SELECT для захвата данных. Конечно, вы можете использовать обходное решение TYPES + SELECT для захвата данных из определения VIEW, без проблем ;-)

+0

Это объясняет проблему, но если я правильно понимаю, '[TYPES]' ожидает меня уже знаете тип данных, правильно? Проблема в том, что я вызываю 'GetSchema()', потому что я не знаю тип данных. См. Мою дилемму? – Icemanind

+0

А я понимаю. Спасибо @ mish256. Это будет работать для меня! – Icemanind