Domanda

Sfondo:

La nostra applicazione C # genera ed esegue le query a diversi tipi di database (Oracle, SQL Server, MySQL), ma un requisito si avvicinò a loro si applicano anche in un formato di file proprietario.

  1. Lo spazio dei nomi utilizzati fino ad ora è System.Data.Common.
  2. Le query di cui abbiamo bisogno di applicare sono non banale (SELECT nidificate, alias in DA, sottostringa metodi e concatenazioni di stringhe)

Inizialmente abbiamo convertito il contenuto del file proprietario in formato CSV, per i quali esiste il driver {driver del testo di Microsoft (* .txt; * .csv)} . Tuttavia, il cliente ha richiesto che nessun file temporanei vengono generati, e tutto dovrebbe accadere in-memory.

La creazione di un driver ODBC per interrogare direttamente il file sembra troppo tempo esigente. Quindi, stiamo valutando la creazione di un driver (possibilmente ODBC), in cui saremo "incorporare" il driver ODBC SQLITE. Dentro quel driver, siamo in grado di caricare i contenuti dei file CSV nel database "in-memory", e quindi inoltrare la query al driver ODBC interno.

Le mie domande:

  1. Questo soluzione sembra possibile?
  2. Dove dovremmo cominciare al fine di creare un driver ODBC da zero?

Grazie

È stato utile?

Soluzione

Se si utilizza SQLite come back-end è una possibilità, non posso davvero capire perché non si poteva utilizzare un provider ADO .NET per il database SQLite come System.Data.SQLite .


Dal tuo commento, penso che sono a tutti gli effetti utilizzando il provider ODBC ADO .NET per tutte le connessioni di database (System.Data.Odbc). Se è necessario mantenere lo stesso schema, poi un provider ODBC personalizzato è la strada da percorrere (ma poi è chiaro lo sviluppo nativo C, e piuttosto doloroso credo).

Un altro modo per andare potrebbe essere quella di aggiungere un terzo parametro al vostro DB (i primi due sono il codice SQL e la stringa di connessione): il provider ADO .NET da utilizzare (come è dovrebbe essere fatto nei file di configurazione , vedere l'attributo providerName). In questo modo è possibile utilizzare qualsiasi provider ADO .NET disponibile.

Poi si potrebbe avvolgere il fornitore SQLite nel proprio, personalizzato, erogatori di ADO .NET, che potrebbe includere la generazione e la popolazione della SQLite DB. Vantaggio di questa soluzione:. Pura gestito .NET

Altri suggerimenti

La richiesta del client è dispari. Ci saranno sempre i file coinvolti, si sta leggendo da un file.

Se vogliono la loro roba in memoria (ancora una volta un cliente strano) mettere i CSV su un disco RAM: http://members.fortunecity.com/ramdisk/RAMDisk/ramdriv001.htm

Costruzione e unità ODBC è un'impresa non banale se vi preoccupate per le prestazioni e la stabilità.

Credo che la soluzione è in termini di tempo. È possibile trovare soluzioni esistenti per ciò che si sta cercando di fare. Qui ci sono alcuni sostituti.

Perché non provi Linq file di testo / csv?

Entrambe le soluzioni sono in memoria.

Un'altra idea è che, è possibile esportare il file in formato XML al posto di CSV o di testo (ho sempre preferito l'esportazione in XML quando devo lavorare nel mio codice). Che si utilizza System.Xml o LINQ to XML per eseguire le operazioni.

Se solo si sono limitati a non creare i file temporanei, si può tentare di utilizzare la modalità in memoria di SQLite. Ecco un esempio di stringa di connessione per esso ( fonte ):

Data Source=:memory:;Version=3;New=True;

A mio avviso, questo è più semplice che costruire fornitore in piena regola. $

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top