2015-05-30 34 views
5

Próbuję dynamicznie uzyskać schemat jednego z moich widoków w SQLite przy użyciu C#. Używam tego kodu:ADO.Net raportowanie pusty typ danych w 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 
     } 
    } 
} 

Działa doskonale dla wszystkich moich tabel i widoków z wyjątkiem jednego widoku. Z jakiegoś powodu typ danych dla pola o nazwie SaleAmount jest pusty. W elemencie row["DATA_TYPE"] nie ma nic.

Oto mój widok:

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')) 

używam biblioteki standard System.Data.SQLite. Ktoś ma jakiś pomysł, dlaczego to będzie puste? Tak jak powiedziałem, dzieje się to tylko na tym polu w tym jednym widoku.

UPDATE

I zorientowali się, jak odtworzyć ten problem. Wygląda na to, że widok zawierający funkcję agregującą, taki jak Sum, GetSchema, zwraca pusty typ danych. Ktoś wie o obejściu?

Odpowiedz

4

System.Data.SQLite obsługuje "obejście" oparte na języku SQL dla dokładnie tego scenariusza.

Sprawdźcie tutaj po instrukcje:

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

Jesteś SQL powinien wyglądać coś tak (przepraszam nie jestem na prawdziwym komputerze, aby sprawdzić nazwy typu danych, co w użyciu, ale zasada jest tam):

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

UPDATE mam do prawdziwego komputera. Powyższe zapewni, że GetSchema ma typy danych dla wszystkich kolumn.

UWAGA: Wydaje się, z moich własnych badań, które nie może mieć typów słów kluczowych w definicji widoku. Może być obecny tylko w twoim kodzie .NET, gdy wykonasz instrukcję SELECT, aby pobrać dane. Oczywiście, możesz użyć rozwiązania TYPES + SELECT do przechwytywania danych z definicji VIEW, nie ma problemu ;-)

+0

To wyjaśnia problem, ale jeśli dobrze rozumiem, '[TYPY]' oczekuje, że już znasz typ danych, prawda? Problem w tym, nazywam 'GetSchema()', ponieważ nie znam typu danych. Widzisz mój dylemat? – Icemanind

+0

Ah Rozumiem. Dziękuję @ mish256. To zadziała dla mnie! – Icemanind