2011-12-28 1 views
8

Sto creando una libreria di classi che accetta file .SQL come input (FileInfo) e una stringa di connessione. Quindi tenta di eseguire il file sql contro la connessione.Modo corretto per rilevare se SQLCMD.exe è installato?

ho deciso di sostenere SMO di Microsoft e sqlcmd.exe

In fase di test, ho notato su molte macchine nel mio ambiente, che SQLCMD non viene installato per impostazione predefinita. I miei errori di programma quando sto solo tentando di eseguire il processo SQLCMD.exe.

Qual è il modo corretto per cercarlo senza cercare l'intero disco rigido? C'è un percorso di registro comune che specifica se è installato? Di solito quando è installato, penso che sia stata impostata una posizione PATH.

Molte grazie.

+0

Si potrebbe provare a eseguire 'sqlcmd.exe -?' In un processo nell'app C# - se funziona, allora SQLCMD è presente - se non, ti dirà qualcosa come "file non trovato" o "comando invalid "o qualcosa del genere ... –

+0

@marc_s sì, è quello che stavo pensando ... semplicemente non quello che pensavo fosse il più pulito per una libreria di classi che sarà un componente essenziale di molte applicazioni. –

risposta

8

Possiedo 64 macchine con SQL SERVER a 64 bit (2k8 R2) e il mio SQLCMD.EXE è in c:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE.

È anche nel percorso.

Si può solo cercare il percorso direttamente dalla posizione del Registro di sistema di SQL Server:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\Tools\ClientSetup\path 

O una variante di questo per una versione diversa.

Il grosso problema qui è che SQLCMD è parte degli strumenti client, non di SQL Server, quindi ritengo che non sia possibile chiedere a SQL Server di dirlo. A meno che non stiate correndo sul server stesso.

+1

SQL Server può essere installato in una directory diversa (come nell'unità D: o qualcosa del genere), quindi controllare la directory non è un modo molto affidabile ... è necessario andare prima a prendere la directory 'Tools' dal registro. .. –

+0

Tieni presente che se stai facendo questo in C# e usi il metodo Registry.LocalMachine.OpenSubKey(), la posizione x86 verrà restituita su macchine che eseguono finestre a 64 bit (ad es. C: \ Programmi (x86) \ ...). In questo caso otterrai un "file non trovato" perché SQL Server non installa SQLCMD lì. Nota questo si applica solo se la tua applicazione è x86. –

+4

Inoltre, gli strumenti sql2012 vengono installati in ..Microsoft SQL Server \ 110 \ Tools .. (ovvero non "100") e non vengono inseriti nel percorso se si installa lo strumento incorporato tramite SqlCmdLnUtils.msi. Sembra imprudente usare un tasto reg che include anche un numero specifico per la versione. Che ne dici di HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ SqlCmdLnUtils \ CurrentVersion? – PandaWood