none
Utilizzo database locali RRS feed

  • Domanda

  • Ciao a tutti,

    ho il seguente problema. Ho creato un applicativo che utilizza al suo interno un database locale basato su servizi e al quale si connette attraverso la seguente stringa di connessione:

    SqlConnection conn = new SqlConnection(@"Data Source = (LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security = True");

    Ho quindi creato un installativo con Visual Studio Installer project al quale ho incluso come file di progetto il database .mdf e il relativo file di log.

    Eseguendo il pogramma in debug o installandolo sul computer di origine l'applicativo funziona correttamente. Installandolo sul pc client ottengo invece un messaggio di errore.

    Ho anche provato a installare SQL server 2012 Express LocalDB sul pc client ma niente...

    Qualcuno sa come risolvere? Grazie mille.

    Antonio


    sabato 25 maggio 2019 16:58

Risposte

Tutte le risposte

  • Posto il messaggio dell'errore:

    ************** Testo dell'eccezione **************
    System.Data.SqlClient.SqlException (0x80131904): Si è verificato un errore di rete o specifico dell'istanza mentre si cercava di stabilire una connessione con SQL Server. Il server non è stato trovato o non è accessibile. Verificare che il nome dell'istanza sia corretto e che SQL Server sia configurato in modo da consentire connessioni remote. (provider: SQL Network Interfaces, error: 50 - Errore di Local Database Runtime. Istanza del database locale specificata inesistente.
    )
       in System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling, SqlAuthenticationProviderManager sqlAuthProviderManager)
       in System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
       in System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
       in System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
       in System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
       in System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
       in System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
       in System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
       in System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
       in System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
       in System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
       in System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
       in System.Data.SqlClient.SqlConnection.Open()
       in Resp_beta.UserControlM1.UserControlM1_Load(Object sender, EventArgs e)
       in System.Windows.Forms.UserControl.OnLoad(EventArgs e)
       in System.Windows.Forms.UserControl.OnCreateControl()
       in System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
       in System.Windows.Forms.Control.CreateControl()
       in System.Windows.Forms.Control.ControlCollection.Add(Control value)
       in Resp_beta.Form1.Form1_Load(Object sender, EventArgs e)
       in System.Windows.Forms.Form.OnLoad(EventArgs e)
       in System.Windows.Forms.Form.OnCreateControl()
       in System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
       in System.Windows.Forms.Control.CreateControl()
       in System.Windows.Forms.Control.WmShowWindow(Message& m)
       in System.Windows.Forms.Control.WndProc(Message& m)
       in System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       in System.Windows.Forms.Form.WmShowWindow(Message& m)
       in System.Windows.Forms.Form.WndProc(Message& m)
       in System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       in System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       in System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    ClientConnectionId:00000000-0000-0000-0000-000000000000
    Error Number:-1983577849,State:0,Class:20

    sabato 25 maggio 2019 16:59
  • Ciao, se vuoi accedere al database che hai messo sul pc client, devi installare SQL Server Express Edition sul client; poi devi installare anche SQL Server Management Studio, e utilizzarlo per collegare il database a SQL Server Express Edition.

    Infine, per accedere al database dal tuo programma installato sullo stesso pc client, devi cambiare la stringa di connessione, per specificare che si deve connettere a SQL Express, non a LocalDb:

    Data Source = .\\SQLEXPRESS; AttachDbFilename = percorsoDatabase.mdf; Integrated Security = True

    Se, invece, vuoi accedere in remoto al database da un altro pc, la procedura è un po' più lunga...


    sabato 25 maggio 2019 18:56
  • Ciao Antonio,

    Se hai installato LocalDB sul PC client, verifica che esista effettivamente l'istanza "MSSQLLocalDB" e che l'istanza sia correttamente avviata. Per farlo, puoi usare il comando "sqllocaldb" da un prompt dei comandi. Con: 

    sqllocaldb info

    verifichi che l'istanza esista. Poi con:

    sqllocaldb start MSSQLLocalDB

    la avvii. Così dovresti riuscire a fare l'attach del file mdf.

    Qui trovi la documentazione del comando "sqllocaldb":

    https://docs.microsoft.com/en-us/sql/tools/sqllocaldb-utility?view=sql-server-2017

    HTH


    Alberto Dallagiacoma [MCP, MCTS]

    My Italian Blog | Twitter | LinkedIn
    DotDotNet - User Group .NET Emilia Romagna


    domenica 26 maggio 2019 07:45
  • Ciao ringrazio entrambi per la risposta, proverò a vedere se riesco a risolvere.

    In realtà l'applicazione che sto sviluppando non è destinata ad un singolo utente ma vorrei distribuirla in download da un sito. Quello che vorrei tentare di fare è quindi creare un installativo che da solo permetta l'utilizzo dell'applicazione installando automaticamente gli eventuali prerequisiti necessari.

    A tal proposito chiedo se quello implementato da me è il metodo più adatto per l'utilizzo di dati archiviati in tabelle per un'applicazione desktop o se esistono metodi migliori.

    domenica 26 maggio 2019 13:34
  • Specifico che il database è in sola lettura, funge cioè da archivio di dati che vengono utilizzati all'interno del programma.

    • Modificato Antonio_F domenica 26 maggio 2019 13:37
    domenica 26 maggio 2019 13:36
  • Ciao Alberto, ho provato a fare come mi hai suggerito nella tua risposta, posto la foto qui sotto:
    domenica 26 maggio 2019 16:23
  • Ciao Antonio,

    Dall'output di sqllocaldb info puoi vedere che tra le tue istanze LocalDB hai solo un'istanza chiamata "v11.0".

    Se pensi di usare un'istanza chiamata MSSqlLocalDB, puoi crearla appositamente:

    sqllocaldb create MSSQLLocalDB 11.0

    e poi avviarla:

    sqllocaldb start MSSQLLocalDB

    A questo punto, l'output di sqllocaldb info ti mostrerà anche questa istanza.

    HTH,


    Alberto Dallagiacoma [MCP, MCTS]

    My Italian Blog | Twitter | LinkedIn
    DotDotNet - User Group .NET Emilia Romagna

    domenica 26 maggio 2019 18:22
  • Sono riuscito a creare e ad avviare l'istanza:

    Ottengo tuttavia il seguente errore:

    System.Data.SqlClient.SqlException (0x80131904): The database 'C:\PROGRAM FILES (X86)\AG SOFTWARE\RESP\DATABASE1.MDF' cannot be opened because it is version 852. This server supports version 706 and earlier. A downgrade path is not supported.
    Could not open new database 'C:\PROGRAM FILES (X86)\AG SOFTWARE\RESP\DATABASE1.MDF'. CREATE DATABASE is aborted.
    An attempt to attach an auto-named database for file C:\Program Files (x86)\AG Software\RESP\Database1.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.

    • Modificato Antonio_F lunedì 27 maggio 2019 10:24
    lunedì 27 maggio 2019 09:18
  • In attesa di risolvere il problema ne approfitto per chiedere una cosa:

    Considerato lo scopo dell'applicativo, l'utilizzo di un database sql è adatto? Non esiste un modo per memorizzare i dati in una tabella che venga poi inclusa nel progetto dell'applicativo e che venga gestita poi in maniera "più semplice"? Per intenderci, il metodo più semplice che mi viene in mente potrebbe essere quello di includere una tabella excel o un txt dal quale leggere i dati quando serve, ma pensavo che l'utilizzo di un database fosse una soluzione un pò più solida (non mi sembra però troppo user friendly pretendere che chi "scarica" l'applicativo debba poi fare troppi passaggi o utilizzare il prompt dei comandi per farlo funzionare).

    Chiedo scusa se la domanda può sembrare banale ma non sono uno sviluppatore di professione, sono un Ingegnere Civile e sto sviluppando questo applicativo per il piacere di farlo (e imparare a farlo!).

    Grazie mille, ciao.

    lunedì 27 maggio 2019 09:29
  • Ciao Antonio,

    Il messaggio di errore indica che la versione di SQL Server usata per creare il file .mdf di cui stai facendo l'attach è troppo recente rispetto alla versione di LocalDB che stai usando sul client. Puoi aggiornare l'installazione di LocalDB sul client scaricando la versione più recente da questa pagina:

    https://www.microsoft.com/en-us/sql-server/sql-server-editions-express

    Per quanto riguarda la tua domanda (se il database è la soluzione giusta per fare quello che chiedi), direi che dipende: se i dati della tua tabella sono esclusivamente locali al client, potresti anche usare SQLite (http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki) oppure SQL Server Compact Edition (https://www.microsoft.com/en-us/download/details.aspx?id=17876); entrambi non richiedono la configurazione di un servizio, ma basta installare/distribuire via setup le librerie di supporto e il tuo database sarà costituito da un semplice file.

    HTH,


    Alberto Dallagiacoma [MCP, MCTS]

    My Italian Blog | Twitter | LinkedIn
    DotDotNet - User Group .NET Emilia Romagna


    lunedì 27 maggio 2019 21:39
  • Ciao,

    io per le applicazioni stand alone uso SqLite come base dati, senza dover installare niente e senza avere nessun tipo di problema da oltre 15 anni.

    martedì 28 maggio 2019 07:29
  • Ciao grazie mille per le risposte. Penso che SQLite possa andare bene per il mio caso. Appena riesco provo a darci un'occhiata! Grazie mille ancora per le risposte
    mercoledì 29 maggio 2019 09:18
  • Non so se ti sia stato indicato nei post precedenti, ma LocalDb è utilizzabile solo per sviluppare applicazioni su un PC su cui hai installato Visual Studio.

    Non è una versione di SQL Server redistribuibile.

    Se vuoi fare un applicazione con un db "autoinstallante" usa SqLite.


    Sabrina C. - http://www.dotnetwork.it

    sabato 1 giugno 2019 21:12
  • Ciao,

    come suggerito ho provato a utilizzare SQLite per quanto riguarda il database del mio applicativo e sembra funzionare benissimo. Ho convertito il mio "vecchio" database locale utilizzando la versione di prova di Full Convert e adattato il codice (la sintassi è praticamente identica). Anche la distribuzione dell'applicativo risulta più agevole in quanto, come detto in una risposta sopra precedente, adesso mi basta distribuire la libreria per far funzionare il database correttamente. Ho inoltre scaricato DBbrowser tramite il quale risulta molto facile creare o modificare un database. Grazie ancora.

    Antonio

    lunedì 3 giugno 2019 20:26