none
C# e SQL, problema nella portabilità RRS feed

  • Domanda

  • Salve, sono alle prime armi e sto sviluppando dei piccoli progetti in c#, LINQ basati sul database di esempio Northwind che ho istanziato nella cartella Database nel managment studio di Sql server express 2008.

    Ora ho la necessità di fare funzionare questo progetto su pc differenti, il problema è che nel codice uso una classe "Linq to Sql" per importare le tabelle del db e in automatico crea la stringa di connessione basata sulle mie credenziali.

    Ho cercato in rete ma non ho trovato consigli utili su come poter eseguire un programmino di questo tipo su un pc diverso da dove l'ho sviluppato, per cui confido nella vostra esperienza.

    Grazie in anticipo, buone feste.

    sabato 18 dicembre 2010 07:31

Risposte

  • Per poter fare quello che dici ti occorre la Compact Edition di SQL Server.

    Solitamente un database va "attaccato" ad un istanza di SQL Server installata e configurata su un pc o un server, utilizzando il Management Studio per effettuare le operazioni di detach/attach oppure backup/restore per aggiungere il nostro database preso dal pc di sviluppo e quindi posizionato sul server.

    Nel tuo caso, se non ho capito male, vuoi fare un deployment dell'applicazione per copia/incolla, utilizzando il database presente nella cartella di sviluppo e copiato insieme all'applicazione.

    La Compact edition di SQL Server, utilizzabile gratuitamente, è stata sviluppata appositamente per essere eseguita in modalità standalone (con la possibilità di sincronizzarsi con un server) e quindi su computer fissi o mobili o su dispositivi embedded. E' integrata in Visual Studio, da cui puoi creare progetti che la utilizzano, e nella versione 4 consente anche la distribuzione via XCOPY, che è esattamente quello che ti serve.

    Ti allego i links ai download della versione 3.5 SP2 e della versione 4, che è ancora in CTP1.

    http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e497988a-c93a-404c-b161-3a0b323dce24&displaylang=en

    http://www.microsoft.com/downloads/en/details.aspx?FamilyID=0d2357ea-324f-46fd-88fc-7364c80e4fdb&displaylang=en

    Qui invece trovi la documentazione sul prodotto: http://www.microsoft.com/sqlserver/en/us/editions/compact.aspx

     

    L'alternativa è quella di utilizzare la Express Edition, gratuitamente scaricabile dal sito Microsoft, che richiede però un maggior sforzo dal punto di vista amministrativo: va infatti installata e configurata. Ha alcune limitazioni (ad esempio il singolo database non può superare i 10GB), ma potrebbe andare bene per la tua soluzione.


    Danilo Dominici MCP MCDBA MCITP MCSE MCAD
    mercoledì 22 dicembre 2010 15:12

Tutte le risposte

  • Ciao mto89,

    solitamente la stringa di connessione viene scritta nel app.config o nel web.config a seconda che si tratti di applicazione desktop o web. Ti è sufficiente cambiarla, adattando il data source (nome del server, username e password) e l'applicazione dovrebbe funzionare.

    Ti consiglio comunque di leggere un buon testo sullo sviluppo con LINQ. Ti segnalo un paio di testi di Apress e Wrox, le due maggiori case editrici di libri di informatica:

    LINQ for Visual C#
    http://www.apress.com/book/view/1430215801

    Professional LINQ
    http://www.wrox.com/WileyCDA/WroxTitle/Professional-LINQ.productCd-0470041811.html

    Di entrambi puoi scaricare il codice sorgente degli esempi, così puoi imparare ad usare meglio LINQ, magari riutilizzando pezzi di codice già fatti da altri: il modo migliore per imparare.

    Ciao!


    Danilo Dominici MCP MCDBA MCITP MCSE MCAD
    domenica 19 dicembre 2010 16:37
  • Ho provato tramite SQL managment studio a esportare su un altro pc il database (passando dal formato access), dopo di che ho provato  a cambiare la stringa di connessione e ho cercato/sostituito eventuali stringhe in cui compariva il server precedenti ma continua a trovare errori, forse sbaglio qualcosa io...

    Il fatto è che usando una classe "linq to sql" quindi una procedura automatica, visual studio inserisce dipendenze in molti file, in base al server e al path, per cui poi cambiare la stringa di connessione non risolve il problema.

    Ma in generale se qualcuno vuole distribuire un software basato su un database sql a più utenti, come viene fatta in automatico la modifica della connection string? o non è possibile?

    domenica 19 dicembre 2010 18:47
  • Se hai fatto tutto da Visual Studio (io ho usato per esempio la versione 2008) dovresti aver seguito questa sequenza:

    1) Creato un nuovo progetto

    2) Aggiunto al Server Explorer la connessione al database

    3) Aggiunto al progetto un nuovo "LINQ to SQL classes", che ti ha creato un oggetto con estensione .dbml (io l'ho chiamata Northwind.dbml) e sul quale hai draggato una tabella (nel mio esempio Customers). Se guardi che cosa ha fatto Visual Studio, vedrai che ha creato due classi all'interno del file .dbml: una classe NorthwindDataContext ed una classe Customer. La prima contiene i metodi per accedere al database, la seconda il mapping dei campi del database su una classe gestibile da LINQ

    4) Utilizzato LINQ per leggere i dati sfruttando le classi create dal wizard al passo 3. Ad esempio:

                NorthwindDataContext ctx = new NorthwindDataContext();

                var query = from c in ctx.Customers
                            select c;

                foreach (var record in query)
                {
                    Console.WriteLine("Company Name: {0}", record.CompanyName);
                }

    L'unico riferimento alla connessione al database è nel file app.config, creato automaticamente da VS quando hai aggiunto il file .dbml contenente nella sezione ConnectionStrings:

            <add name="LINQDemo.Properties.Settings.NorthwindConnectionString"
                connectionString="Data Source=DBSERVER;Initial Catalog=Northwind;Integrated Security=True"
                providerName="System.Data.SqlClient" />

    Quindi se copi il database su un altro server ti è sufficiente cambiare l'app.config (o il web.config se è un applicazione web), non serve altro !

    In ogni caso puoi modificare da codice la stringa di connessione utilizzando uno degli overload del costruttore della classe xxxxDataContext ad esempio in questo modo:

    NorthwindDataContext ctx = new NorthwindDataContext("Data Source=ALTRODBSERVER;Initial Catalog=Northwind;Integrated Security=True");

    Ovviamente questo se usi un account di Windows che è abilitato ad accedere al server e al database. Puoi anche utilizzare l'autenticazione mista ed utilizzare un account di SQL Server. Ad esempio così:

    NorthwindDataContext ctx = new NorthwindDataContext("Data Source=ALTRODBSERVER;Initial Catalog=Northwind;User ID=pippo;Password=miapassword");

    Di nuovo, ti consiglio di leggere, leggere, leggere e di curiosare tra gli esempi dei libri, molto molto istruttivi !

    Ciao!


    Danilo Dominici MCP MCDBA MCITP MCSE MCAD
    lunedì 20 dicembre 2010 07:57
  • Grazie della completa risposta (e la pazienza)...

    La mia idea era di avere la cartella con l'eseguibile e dentro il database *.mdf da poter distribuire su vari pc, in pratica ho un programma praticamente uguale a quello da te strutturato e all'avvio in una form richiede l'inserimento dei dati della connessione(quindi il proprio nome server, eventuali credenziali, initial catalog ecc) e genera un database nel server dell'utente tramite il comando "attachDBfilename nomeDatabase.mdf", passando la connection string al costruttore dell'oggetto *DataContext generato alla creazione della classe "LINQ to SQL".

    Ho fatto varie prove e funziona, la cosa che non capisco è l seguente: se creo un database da SQL managment studio, devo ovviamente specificare un path per il mdf e per il log, ad esempio C:\prova. Poi però se eseguo su un altro pc l'applicazione, lei attacca al server sql il database, però poi devo creare la directory "prova" in C:\ e copiare (da codice)  i due files del database (che ho messo nella cartella del progetto) al path dove l'avevo creato sul mio pc, ovvero devo inserire i 2 file .mdf e .log nella cartella C:\prova dell'"utente", altrimenti non funziona. Perchè?

    Io invece vorrei copiare la cartella del mio progetto su un altro pc e vorrei che il database rimanesse soltanto nella cartelle del progetto, senza la necessità di doverlo copiare nella directory dove l'avevo creato sul mio pc. Il fatto è che non capisco se questo vincolo che ho è normale, nel caso come posso fare in modo che il database non debba stare in C:\prova ma nella mia directory, tramite un percorso relativo?

    Spero di essermi spiegato, e ancora grazie dell'aiuto.

    mercoledì 22 dicembre 2010 14:06
  • Per poter fare quello che dici ti occorre la Compact Edition di SQL Server.

    Solitamente un database va "attaccato" ad un istanza di SQL Server installata e configurata su un pc o un server, utilizzando il Management Studio per effettuare le operazioni di detach/attach oppure backup/restore per aggiungere il nostro database preso dal pc di sviluppo e quindi posizionato sul server.

    Nel tuo caso, se non ho capito male, vuoi fare un deployment dell'applicazione per copia/incolla, utilizzando il database presente nella cartella di sviluppo e copiato insieme all'applicazione.

    La Compact edition di SQL Server, utilizzabile gratuitamente, è stata sviluppata appositamente per essere eseguita in modalità standalone (con la possibilità di sincronizzarsi con un server) e quindi su computer fissi o mobili o su dispositivi embedded. E' integrata in Visual Studio, da cui puoi creare progetti che la utilizzano, e nella versione 4 consente anche la distribuzione via XCOPY, che è esattamente quello che ti serve.

    Ti allego i links ai download della versione 3.5 SP2 e della versione 4, che è ancora in CTP1.

    http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e497988a-c93a-404c-b161-3a0b323dce24&displaylang=en

    http://www.microsoft.com/downloads/en/details.aspx?FamilyID=0d2357ea-324f-46fd-88fc-7364c80e4fdb&displaylang=en

    Qui invece trovi la documentazione sul prodotto: http://www.microsoft.com/sqlserver/en/us/editions/compact.aspx

     

    L'alternativa è quella di utilizzare la Express Edition, gratuitamente scaricabile dal sito Microsoft, che richiede però un maggior sforzo dal punto di vista amministrativo: va infatti installata e configurata. Ha alcune limitazioni (ad esempio il singolo database non può superare i 10GB), ma potrebbe andare bene per la tua soluzione.


    Danilo Dominici MCP MCDBA MCITP MCSE MCAD
    mercoledì 22 dicembre 2010 15:12
  • Ciao, grazie ai consigli dati e a un pò di prove ho più ho meno raggiunto il mio obiettivo, ma con alcune perplessità, ve le espongo brevemente:

    Ho creato un progetto, aggiunto un service-based database, che poi ho modificato da un altro software, creato un linq to sql class e connesso con le tabelle del database. Così facendo in app.config ho la seguente stringa di connessione:

    connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\base.mdf;Integrated Security=True;User Instance=True"

    Grazie a |DataDirectory| posso portare su vari pc il database tramite un rebuild, ora arriviamo ai dubbi:

    1) La DataSource l'ha creata in automatico, ho provato l'applicativo su un portatile dove non c'è nè sql server express nè altre versioni (tranne la compact edition di visual studio) e funziona. La cosa mi ha reso felice e perplesso....quel dataSource a cosa si riferisce? Cioè se lo eseguo su un pc con credenziali user e password andrà uguale? non mi è chiarissimo cosa è successo sotto, non ci sono differenze tra questo database e uno che creo in managment studio vero?

    2) Ogni volta attacca al server il database nella cartella dell'eseguibile e se rebuildo copia quello nella directory del progetto rischiando inconsistenze nei dati, è possibile specificare un percorso relativo del tipo |DataDirectory| relativo alla cartella dove c'è il file di progetto *.sln in modo da non dover rischiare a ogni rebuild di perdere i dati? (Mettendo "Copy if newer" ho risolto a metà i problemi, nel senso che facendo "build" non fa danni ma col "rebuild" sovrascrive lo stesso ed è scomodo ogni volta salvare/ricopiare file del database).

     

    Ringrazio in anticipo chi mi avrà voglia di darmi delucidazioni,

    Buon Natale.

    sabato 25 dicembre 2010 18:01
  • Il datasource che ti ha creato punta ad una istanza di SQL Server Express. Il portatile dove dici che funziona, probabilmente avendo Visual Studio installato ha la Express installata (è una delle opzioni in fase di setup ed è attiva di default...).

    L'opzione AttachDbFilename della connectionstring serve per non avere tra i piedi il DBA :-) quando sviluppi applicazioni localmente (dai un'occhiata qui alla sezione AttachDBFilename.

    Per sviluppare un'applicazione che devi distribuire da clienti puoi sicuramente fare affidamento a SQL Express locale sul tuo pc di sviluppo ed utilizzare la AttachDBFilename per evitarti la parte sistemistica, però una volta che l'applicazione è pronta, per distribuirla non hai molta scelta: devi installare sia l'applicazione che la Express edition sulla macchina che utilizzerà il prodotto finito, oppure se hai un server con SQL Server installato fai puntare l'applicazione al database che installerai proprio su questo server, sempre modificando l'app.config.

    Buon Natale anche a te.


    Danilo Dominici MCP MCDBA MCITP MCSE MCAD
    sabato 25 dicembre 2010 22:05