2015-05-30 33 views
5

Sto cercando di ottenere in modo dinamico lo schema di una delle mie viste in SQLite utilizzando C#. Sto usando questo codice:ADO.Net che segnala il tipo di dati vuoto in 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 
     } 
    } 
} 

Funziona perfettamente per tutte le mie tabelle e visualizzazioni tranne per una vista. Per qualche motivo, il tipo di dati per il campo chiamato SaleAmount è vuoto. Non c'è nulla nell'elemento row["DATA_TYPE"].

Qui è la mia opinione:

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

Sto usando le standard System.Data.SQLite librerie. Qualcuno ha idea del perché questo sarebbe venuto fuori vuoto? Come ho detto, sta accadendo solo su questo campo in questa vista.

UPDATE

ho capito come duplicare il problema. Apparentemente, se una vista contiene una funzione di aggregazione, come Sum, GetSchema restituisce un tipo di dati vuoto. Qualcuno sa di una soluzione alternativa?

risposta

4

System.Data.SQLite supporta una "soluzione alternativa" basata su SQL esattamente per questo scenario.

Date un'occhiata qui per le istruzioni:

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

Sei SQL dovrebbe guardare qualcosa come questo (scusate io non sono in un vero e proprio PC per controllare i nomi di tipo cosa dati da utilizzare, ma il principio è lì):

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

UPDATE ho avuto modo di un vero e proprio PC. Quanto sopra garantirà che GetSchema abbia tipi di dati per tutte le colonne.

NOTA: Sembra, dalle mie prove, che non possibile avere i tipi di parole chiave all'interno di una definizione di vista. Può essere presente solo nel codice .NET quando si esegue l'istruzione SELECT per acquisire i dati. Ovviamente, puoi usare la soluzione TYPES + SELECT per acquisire i dati da una definizione VIEW, nessun problema ;-)

+0

Questo spiega il problema, ma se sto capendo correttamente, '[TYPES]' mi aspetta già conosci il tipo di dati, giusto? Il problema è che sto chiamando 'GetSchema()' perché non conosco il tipo di dati. Vedi il mio dilemma? – Icemanind

+0

Ah, ho capito. Grazie @ mish256. Questo funzionerà per me! – Icemanind