LocalDB non si avvia, SSMS/Visual Studio non riescono a collegarsi a (localdb)\MSSQLLocalDB
e gli aggiornamenti SQL danno errore? In questa guida trovi cause vere, comandi pronti e una sequenza di ripristino che funziona. Focus su LocalDB 16.x, driver ODBC 18 e patch che falliscono con 0x80070643
.
Panoramica del problema
Su workstation con più edizioni/istanze di SQL Server (LocalDB 2019/2022, più Express e magari un MSSQLSERVER
), può capitare che:
- SQL Server Management Studio (SSMS) e/o Visual Studio non si connettano più a
(localdb)\MSSQLLocalDB
con l’errore Unable to connect to target server ‘(localdb)\MSSQLLocalDB’. - Il patching tramite Windows Update o CU manuali fallisca con codice
0x80070643
e con exit code come-2061893565
o-2061893606
, spesso su istanzeSQLEXPRESS
,SQLEXPRESS01
oMSSQLSERVER
.
Sintomi: come si presentano
- In SSMS la connessione a
(localdb)\MSSQLLocalDB
fallisce immediatamente; talvolta sembra “cercare” la pipe e poi si ferma. - In Visual Studio (Server Explorer o durante il debug) appare un errore generico di provider o un timeout.
sqllocaldb info
elenca l’istanza ma lo stato è Stopped o Unknown.- Durante l’installazione di KB (es.
KB5035432
/KB5021522
) o di una Cumulative Update, i log parlano di “failed to update shared features”.
Perché succede (cause probabili)
Area | Dettaglio |
---|---|
Registrazione LocalDB | Chiavi di registro o file di configurazione corrotti dopo tentativi ripetuti di installazione/repair. |
Servizio/istanza non avviata | LocalDB parte on‑demand; se l’avvio fallisce o rimane in stato stopped, la named pipe non viene creata. |
Permessi/Utente | Il profilo Windows corrente non ha più diritti su %LOCALAPPDATA%\Microsoft\Microsoft SQL Server Local DB\Instances . |
Versione client | Driver OLE DB/ODBC 17 fuori allineamento rispetto al motore 16.x; con ODBC 18 le impostazioni di cifratura cambiano e la connessione fallisce se la stringa non è aggiornata. |
Componenti condivisi | Un mix di build (es. LocalDB 16.0.1115.1 e motore 16.0.1000.6) genera dipendenze incongruenti e patch non applicabili. |
Soluzione rapida: ripristina LocalDB in 5 minuti
- Arresta ed elimina l’istanza (non rimuove i tuoi database .mdf; sono file separati):
sqllocaldb stop MSSQLLocalDB sqllocaldb delete MSSQLLocalDB sqllocaldb create MSSQLLocalDB 16.0 sqllocaldb start MSSQLLocalDB
Se la creazione fallisce: chiudi SSMS/Visual Studio, elimina tutte le sottocartelle in%LOCALAPPDATA%\Microsoft\Microsoft SQL Server Local DB\Instances\
e riprova i comandi. - Controlla la named pipe (deve comparire nel dettaglio):
sqllocaldb i MSSQLLocalDB verifica che l'output includa qualcosa come: \\.\pipe\LOCALDB#..._tsql\query
- Testa fuori da SSMS/VS con
sqlcmd
:sqlcmd -S "(localdb)\MSSQLLocalDB" -E -Q "SELECT @@VERSION"
Se qui funziona ma in Visual Studio no, aggiorna la connection string nel progetto.
Procedura completa e ragionata
Verifica preliminare dello stato LocalDB
sqllocaldb info
sqllocaldb i MSSQLLocalDB
- State = Running e c’è la
Instance pipe name
→ prova consqlcmd
. - State = Stopped/Unknown → esegui la sequenza
stop/delete/create/start
vista sopra. - Controlla il log LocalDB in
%LOCALAPPDATA%\Microsoft\Microsoft SQL Server Local DB\Instances\MSSQLLocalDB\
(fileERRORLOG
eERRORLOG.n
) per messaggi di avvio bloccato, porte/pipe, o ACL negati.
Riparare permessi della cartella Instances
Se il profilo ha perso i diritti sulla cartella LocalDB, reimposta le ACL (sostituisci DOMAIN\Utente
con il tuo account):
cd "%LOCALAPPDATA%\Microsoft\Microsoft SQL Server Local DB"
icacls "Instances" /grant "%USERNAME%":(OI)(CI)F /T
Riprova ad avviare l’istanza:
sqllocaldb start MSSQLLocalDB
Aggiorna i driver client (ODBC 18/OLE DB e SMO)
Con ODBC 18 la cifratura è attiva di default. Se la tua stringa è rimasta “vecchia”, potresti ricevere errori di handshake TLS o di certificato. Adotta una delle seguenti stringhe:
- Connessione veloce in dev (certificato non convalidato, adatta a LocalDB):
Server=(localdb)\MSSQLLocalDB;Integrated Security=true;Encrypt=yes;TrustServerCertificate=yes;
- Connessione più rigorosa (se usi un certificato valido):
Server=(localdb)\MSSQLLocalDB;Integrated Security=true;Encrypt=yes;TrustServerCertificate=no;
Per ADO.NET (SqlClient) il principio è lo stesso. In applicazioni legacy con ODBC 17, valuta di rimuoverlo dopo aver installato il 18 per evitare side-by-side non necessari.
Correggere la cache delle connessioni in SSMS/Visual Studio
- In SSMS, elimina la connessione salvata a
(localdb)\MSSQLLocalDB
e ricreala. - In Visual Studio, aggiorna la connection string in
appsettings.json
/app.config
e rimuovi eventuali DSN ODBC locali non più usati. - Chiudi tutti i processi che tengono aperta la pipe:
devenv.exe
,SSMS.exe
, test runner, worker di migrazione.
Quando ci sono più istanze (Express + LocalDB)
LocalDB usa named pipe per utente; SQL Express usa servizi Windows (MSSQL$SQLEXPRESS
, MSSQLSERVER
), TCP dinamico o 1433 e Browser. Non c’è “conflitto di porte” con LocalDB, ma possono esistere conflitti su componenti condivisi (client, VSS Writer, DQS, ODBC/OLE DB, SMO). Se patch/repair falliscono, passa alla sezione “Errori di patching”.
Errori di patching / Windows Update 0x80070643
Questo codice segnala un fallimento MSI durante l’aggiornamento. Spesso i log riportano “failed to update shared features”. Le cause tipiche includono:
Area | Dettaglio |
---|---|
Installer cache corrotta | Cartella C:\Program Files\Microsoft SQL Server\160\Setup Bootstrap\ con pacchetti incompleti o mismatch. |
Componenti condivisi bloccati | Servizi come SQL Writer, VSS o Windows Update in stato incoerente durante la patch. |
Mix di build RTM + CU | LocalDB e motore con numeri di build diversi (RTM vs CU recenti) → dipendenze non soddisfatte. |
Leggere i log giusti
- Summary:
C:\Program Files\Microsoft SQL Server\160\Setup Bootstrap\Log\Summary.txt
- Dettaglio ultimo tentativo: file
Detail.txt
nella stessa cartella del Summary corrispondente alla data del tentativo. - Cerca stringhe come Return code 0x80070643, Exit code -2061893565, Shared components, msierr, Rollback.
Ripristino componenti condivisi via Setup (repair mirato)
Esegui la riparazione per ciascuna istanza problematica; cambia INSTANCENAME
a seconda dei casi (MSSQLSERVER
, SQLEXPRESS
, SQLEXPRESS01
):
setup.exe /Action=Repair /InstanceName=MSSQLSERVER /IACCEPTSQLSERVERLICENSETERMS=YES
setup.exe /Action=Repair /InstanceName=SQLEXPRESS /IACCEPTSQLSERVERLICENSETERMS=YES
Se il setup propone la riparazione delle Shared Features, accettala: è lì che si inceppa nella maggior parte dei casi.
Reset completo dei servizi di update prima di riprovare
Apri un prompt elevato (Administrator) e arresta i servizi interessati, poi rinomina cache e riparti:
net stop wuauserv
net stop bits
net stop msiserver
net stop vss
net stop sqlwriter
ren "C:\Windows\SoftwareDistribution" SoftwareDistribution.old
ren "C:\Windows\System32\catroot2" catroot2.old
rem Cache dei pacchetti MSI/SQL
for /d %%G in ("%ProgramData%\Package Cache{*") do @echo. & rem Verifica manualmente le cartelle SQL e rinominale
net start vss
net start msiserver
net start bits
net start wuauserv </code></pre>
<p>Dopo il reset, evita Windows Update: <strong>lancia la CU manuale</strong> (eseguibile della cumulative update per SQL Server 2022) e verifica l’esito nei log.</p>
<h3>Disinstallazione pulita (ultima ratio, ma spesso risolutiva)</h3>
<ol>
<li>Dal Pannello di controllo rimuovi tutte le istanze e i componenti “Microsoft SQL Server 2022” e “SQL Server 2019 LocalDB”.</li>
<li>Esegui lo <strong>strumento di rimozione</strong> (SQL Server Removal Tool) per eliminare residui in registry, servizi e WMI.</li>
<li>Riavvia.</li>
<li>Installa ex‑novo <strong>SQL Server 2022 Express</strong> (CU corrente) con opzione <em>Download Media → Express with Advanced Services</em>.</li>
<li>Installa separatamente <strong>LocalDB 16.x</strong> solo se necessaria.</li>
</ol>
<p><em>Nota</em>: la disinstallazione non elimina automaticamente i tuoi database utente; fai comunque un backup dei file <code>.mdf</code>/<code>.ldf</code> prima di procedere.</p>
<h3>Prerequisiti di sistema da verificare</h3>
<ul>
<li>.NET Framework 4.8.1 presente e integro.</li>
<li>Microsoft Visual C++ 2015‑2022 Redistributable x64/x86 aggiornato.</li>
<li>Nessun antivirus di terze parti che blocchi <code>kernelbase.dll</code> o interferisca con il setup (prova un <em>avvio pulito</em> di Windows se sospetti interferenze).</li>
</ul>
<hr>
<h2>Passi immediati consigliati (priorità)</h2>
<table>
<thead>
<tr>
<th>Priorità</th>
<th>Azione</th>
<th>Obiettivo</th>
</tr>
</thead>
<tbody>
<tr>
<td>★★★</td>
<td>Usa <code>sqllocaldb delete/create</code> per ristabilire LocalDB</td>
<td>Riprendere subito i progetti universitari</td>
</tr>
<tr>
<td>★★☆</td>
<td>Installa ODBC Driver 18 e testa con <code>sqlcmd</code></td>
<td>Escludere problemi lato client</td>
</tr>
<tr>
<td>★★☆</td>
<td>Tenta la CU manuale su una sola istanza (<code>MSSQLSERVER</code>) con <code>setup.exe /action=repair</code></td>
<td>Capire se il patching fallisce per librerie comuni</td>
</tr>
<tr>
<td>★☆☆</td>
<td>Se persiste, pianifica disinstallazione completa e reinstallazione “pulita”</td>
<td>Eliminare conflitti strutturali</td>
</tr>
</tbody>
</table>
<h2>Diagnostica aggiuntiva e comandi utili</h2>
<h3>Elenco versioni LocalDB installate</h3>
<pre><code>sqllocaldb versions
</code></pre>
<h3>Chi sta usando la pipe LocalDB?</h3>
<p>Se sospetti un handle bloccato, chiudi Visual Studio/SSMS, quindi:</p>
<pre><code>taskkill /F /IM sqlservr.exe
</code></pre>
<p>(Solo per l’istanza LocalDB in sessione utente; non uccidere servizi di produzione.)</p>
<h3>Verificare servizi di SQL Express</h3>
<pre><code>sc query type= service state= all | findstr /I "MSSQL SQLAgent"
</code></pre>
<h3>Controllare spazio disco e cartelle temp</h3>
<p>Patching e avvii LocalDB possono fallire con temp pieni. Verifica e pulisci:</p>
<pre><code>cleanmgr /sageset:1 & cleanmgr /sagerun:1
</code></pre>
<h3>Script “tutto‑in‑uno” per resettare LocalDB utente</h3>
<p>Esegui da PowerShell <em>non amministrativo</em> (LocalDB è per‑utente), chiudendo prima SSMS/VS:</p>
<pre><code>$name = "MSSQLLocalDB"
try { sqllocaldb stop $name -s *>$null } catch {}
try { sqllocaldb delete $name -s *>$null } catch {}
$inst = Join-Path $env:LOCALAPPDATA "Microsoft\Microsoft SQL Server Local DB\Instances"
if (Test-Path $inst) { Get-ChildItem $inst | Remove-Item -Recurse -Force }
sqllocaldb create $name 16.0
sqllocaldb start $name
sqllocaldb i $name
</code></pre>
<hr>
<h2>Stringhe di connessione pronte per ODBC 18/SqlClient</h2>
<table>
<thead>
<tr>
<th>Scenario</th>
<th>Connection string</th>
<th>Note</th>
</tr>
</thead>
<tbody>
<tr>
<td>Dev veloce (LocalDB)</td>
<td><code>Server=(localdb)\MSSQLLocalDB;Integrated Security=true;Encrypt=yes;TrustServerCertificate=yes;</code></td>
<td>Evita errori di certificato con ODBC 18 (cifratura on per default).</td>
</tr>
<tr>
<td>EF Core</td>
<td><code>Server=(localdb)\MSSQLLocalDB;Database=MyDb;Trusted_Connection=True;Encrypt=True;TrustServerCertificate=True;</code></td>
<td>Aggiungi <code>MultipleActiveResultSets=True</code> se necessario.</td>
</tr>
<tr>
<td>SSMS</td>
<td>Server name: <code>(localdb)\MSSQLLocalDB</code>, Auth: <em>Windows Authentication</em></td>
<td>Non servono credenziali; LocalDB gira con il tuo utente.</td>
</tr>
</tbody>
</table>
<h2>FAQ pratiche</h2>
<h3>LocalDB è “un servizio”?</h3>
<p>No. È un processo <code>sqlservr.exe</code> per‑utente che si avvia on‑demand e comunica via named pipe. Non usa TCP 1433 né SQL Browser.</p>
<h3>Rimuovere e ricreare LocalDB cancella i miei database?</h3>
<p>No. I tuoi file <code>.mdf</code>/<code>.ldf</code> stanno dove li hai creati (per default nella cartella dati del progetto). Conservane sempre una copia prima di interventi di manutenzione.</p>
<h3>Posso avere LocalDB 16.x e SQL Express 2019 sulla stessa macchina?</h3>
<p>Sì, ma attenzione ai <em>shared components</em>. Mantieni un solo ramo di versione dove possibile e applica CU coerenti.</p>
<h3>Perché con ODBC 17 funzionava e ora con ODBC 18 no?</h3>
<p>Perché ODBC 18 abilita <em>Encrypt</em> per default. Adegua la stringa con <code>Encrypt=yes;TrustServerCertificate=yes</code> (in dev) o configura certificati validi.</p>
<h3>Che differenza c’è tra <code>MSSQLSERVER</code> e <code>SQLEXPRESS</code>?</h3>
<p><code>MSSQLSERVER</code> è l’istanza <em>predefinita</em> (senza nome), <code>SQLEXPRESS</code> è un’istanza <em>nominala</em> tipica di Express. LocalDB è ancora un’altra cosa, isolata per utente.</p>
<hr>
<h2>Guida decisionale rapida</h2>
<ol>
<li><strong>Errore solo su LocalDB?</strong> → Esegui <code>stop/delete/create/start</code>, verifica pipe e prova <code>sqlcmd</code>.</li>
<li><strong>Funziona da <code>sqlcmd</code> ma non da VS?</strong> → Aggiorna connection string (Encrypt/TrustServerCertificate), cancella profili di connessione.</li>
<li><strong>Patch falliscono?</strong> → Repair via <code>setup.exe</code> sulle istanze coinvolte → se non basta, reset dei servizi di update → se ancora KO, disinstallazione pulita e reinstallazione con CU corrente.</li>
<li><strong>Ancora problemi?</strong> → Passa alla sezione “Supporto specialistico”: prepara log e diagnostica.</li>
</ol>
<h2>Conflitti comuni e come evitarli</h2>
<table>
<thead>
<tr>
<th>Conflitto</th>
<th>Riconoscimento</th>
<th>Rimedio</th>
</tr>
</thead>
<tbody>
<tr>
<td>LocalDB non crea la pipe</td>
<td><code>sqllocaldb i</code> non mostra <code>\\.\pipe\LOCALDB#...</code></td>
<td>Ricrea l’istanza; controlla ACL su <code>Instances</code>; chiudi processi che tengono un handle sporco.</td>
</tr>
<tr>
<td>ODBC 18 handshake TLS</td>
<td>Errore di cifratura/certificato</td>
<td>Aggiungi <code>Encrypt=yes;TrustServerCertificate=yes</code> in dev.</td>
</tr>
<tr>
<td>Patching shared features</td>
<td>Setup si ferma su componenti condivisi</td>
<td><code>setup.exe /Action=Repair</code> per istanza, reset servizi, CU manuale.</td>
</tr>
<tr>
<td>Mix RTM + CU</td>
<td>Versioni motore diverse</td>
<td>Disinstalla e reinstalla con CU corrente; mantieni un solo ramo.</td>
</tr>
</tbody>
</table>
<h2>Check list prima di aprire SSMS/VS</h2>
<ul>
<li><code>sqllocaldb i MSSQLLocalDB</code> → <em>State=Running</em> e pipe presente?</li>
<li><code>sqlcmd -S "(localdb)\MSSQLLocalDB" -E -Q "SELECT @@VERSION"</code> restituisce la versione?</li>
<li>Driver ODBC 18 installato e connection string aggiornata?</li>
<li>Spazio su disco > 2 GB su <code>%TEMP%</code> e su <code>C:\</code>?</li>
</ul>
<h2>Preparare la richiesta per supporto specialistico</h2>
<p>Se decidi di aprire un thread su Microsoft Q&A (tag <em>sql-server-database-engine</em>), allega sempre:</p>
<ol>
<li><strong>Summary log</strong>: <code>C:\Program Files\Microsoft SQL Server\160\Setup Bootstrap\Log\Summary.txt</code></li>
<li><strong>Detail.txt</strong> dell’ultimo tentativo (stessa directory del Summary)</li>
<li><strong>Output</strong> di:
<pre><code>sqllocaldb info
sqllocaldb i MSSQLLocalDB
File CAB generato dallo strumento SQL Server Diagnostics (componente sqlpackage
/ modalità diagnostics).
Queste informazioni permettono agli ingegneri di individuare subito punti di rottura in MSI, dipendenze mancanti e mismatch di build.
Best practice per non ricaderci
- Un solo ramo: mantieni tutto su 16.x (SQL 2022) o tutto su 15.x (SQL 2019). Evita mix RTM + CU distanti.
- Driver aggiornati: ODBC 18, OLE DB e SMO coerenti con il motore; rimuovi versioni obsolete non necessarie.
- Backup dei file .mdf/.ldf prima di repair o disinstallazioni.
- Ambiente pulito: chiudi SSMS/VS durante patch/repair; esegui come amministratore quando richiesto.
- CU periodiche: applica gli aggiornamenti cumulativi mensili per restare allineato.
Ricapitolando
- LocalDB: nella stragrande maggioranza dei casi è un’istanza corrotta o un client fuori sync. La ricostruzione con
sqllocaldb delete/create
risolve rapidamente. - Aggiornamenti: gli errori
0x80070643
indicano fallimenti MSI: controlla cache MSI, componenti condivisi e coerenza di versione; se i build sono mismatch, la reinstallazione pulita è spesso la via più rapida. - Prevenzione: non mescolare rami (tutto 16.x o tutto 15.x) e resta aggiornato con le CU. Aggiorna le connection string per ODBC 18.
Seguendo la sequenza proposta tornerai a usare LocalDB e a compilare i tuoi progetti C# senza dover cambiare macchina. Buon lavoro!
Appendice: esempi di errori e lettura rapida dei log
- LocalDB: shared memory provider: No process is on the other end of the pipe → La pipe non esiste o è stata chiusa: ricrea l’istanza e chiudi strumenti che la tengono in uso.
- Patch: Failed to enable shared features → Repair delle Shared Features dal
setup.exe
, poi CU manuale. - ODBC 18: Client unable to establish connection con riferimento a TLS → Aggiungi
Encrypt=yes;TrustServerCertificate=yes
o configura certificati.
Fields utili nei log (cerca nel Detail.txt
):
- Component name che fallisce (es.
SQL Writer
,Client Connectivity
,Setup Support Files
). - Package path mancante (riferimento a
Package Cache
). - Return value 3 in MSI (punto esatto del fallimento).
Appendice: checklist post‑ripristino
- Avvia SSMS → connessione a
(localdb)\MSSQLLocalDB
con Windows Authentication. - In Visual Studio, esegui una migrazione EF Core o apri Server Explorer → verifica database visibile.
- Esegui un
SELECT @@VERSION
e unCREATE DATABASE
di prova:sqlcmd -S "(localdb)\MSSQLLocalDB" -E -Q "CREATE DATABASE Ping; SELECT name FROM sys.databases;"
- Se usi test runner/worker, prova a eseguire un test che apre la connessione con la stringa aggiornata.