2010-03-04 14 views
19

Necesito encontrar si el servidor SQL está instalado en una máquina. Podría ser cualquier versión de SQL server (7, 2005,8, sql express, etc.). Necesitamos saber esta información ya que estamos escribiendo un instalador y necesitamos mostrarle al usuario que si no se ha encontrado el servidor SQL, la instalación no puede continuar.Compruebe si el servidor SQL (cualquier versión) está instalado?

He visto versiones que usan el registro, wmi, SMO o simplemente se conectan a la instancia del servidor SQL (aunque no ayudaría aquí ya que no conocemos el nombre del servidor).

Estamos utilizando el instalador Wix.

¿Cuál es la forma correcta de hacerlo?

JD

+0

¿Su rutina de instalación debe ejecutarse en el mismo servidor que el servidor SQL? – BIDeveloper

Respuesta

16

Una forma sencilla de enumerar todos los servidores SQL Server de la red es la siguiente:

using System.Data; 
using System.Data.Sql; 
using System; 

... 

SqlDataSourceEnumerator sqldatasourceenumerator1 = SqlDataSourceEnumerator.Instance; 
DataTable datatable1 = sqldatasourceenumerator1.GetDataSources(); 
foreach (DataRow row in datatable1.Rows) 
{ 
    Console.WriteLine("****************************************"); 
    Console.WriteLine("Server Name:"+row["ServerName"]); 
    Console.WriteLine("Instance Name:"+row["InstanceName"]); 
    Console.WriteLine("Is Clustered:"+row["IsClustered"]); 
    Console.WriteLine("Version:"+row["Version"]); 
    Console.WriteLine("****************************************"); 
} 

Tomado de this blog post.

+0

@Martin: Gracias, eso es exactamente lo que necesito. Ahora solo necesito obtener el nombre de la máquina local y simplemente verificar que esté en la lista. De esta forma sabré si la máquina local tiene instalada o no una instancia sql. –

+5

@Martin ¿No sería necesario que el servicio del navegador SQL se esté ejecutando? – Thomas

+0

Tengo una máquina en la que * solo * servidor de servicios de SQL Server Analysis está instalado como un servicio independiente. Hay * no * motor/instancia de SQL Sever en esa caja. ¿Este código también considerará el servidor de servicio SQL Serve Analysis como fuente de datos de SQL Server? – RBT

2

Tener un vistazo a esta pregunta: How can I determine installed SQL Server instances and their versions?

Una de las respuestas se enumeran las claves de registro se puede comprobar para determinar la versión de SQL Server instalado (s).

O compruebe este artículo CodeProject si necesita encontrar ningún servidor SQL en la red local: http://www.codeproject.com/KB/database/locate_sql_servers.aspx

+0

Hemos visto desinstalaciones del servidor sql que han dejado entradas de registro. Además, de una publicación anterior, no hay garantía de que las entradas de registro sean las mismas para las diferentes versiones. –

2

Necesitaba algo similar, para descubrir una instancia de SQLServer local para realizar pruebas automatizadas.

El SmoApplication era perfecto para este requisito - mi código es el siguiente:

public static string GetNameOfFirstAvailableSQLServerInstance() 
{ 
    // Only search local instances - pass true to EnumAvailableSqlServers 
    DataTable dataTable = SmoApplication.EnumAvailableSqlServers(true); 
    DataRow firstRow = dataTable.Rows[0]; 
    string instanceName = (string)firstRow["Name"]; 
    return instanceName; 
} 
2

Otra alternativa sencilla sería utilizar la línea de comandos siguiente dentro de su instalador:

sc queryex type= service | find "MSSQL" 

El comando anterior simplemente enumera todos los servicios que contienen la parte MSSQL, enumerando las instancias SQL Server nombradas y predeterminadas. Este comando no devuelve nada si no se encuentra nada. Devuelve algo como esto:

SERVICE_NAME: MSSQL$SQLEXPRESS 

Espero que esto ayude.

Cuestiones relacionadas