none
conocer en que unidad esta instalado sql server desde vb.net 2010 y obtener ruta Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA RRS feed

  • Pregunta

  • Hola buenos días, actualmente desarrollo un programa que desde una ventana en vb.net pueda crear una base de datos de SQL Server, pero estoy complicado con los siguientes detalles:

    mi programa funciona asi, desde un texbox coloco la IP o Hostname de la PC que tiene el SQL Server instalado, dicho código se los comparto:

     Private Sub txtIp_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtIp.KeyPress
            Dim cadenaConexion As String
            Dim selectSQL As String
            If e.KeyChar = ChrW(Keys.Enter) Then
                Try
                    cadenaConexion = "Data Source=" & txtIp.Text & " ;Integrated Security=True;Initial Catalog=master"
                    Using con As New SqlConnection(cadenaConexion)
                        ' Abrimos la conexión
                        con.Open()
                        ' MsgBox(con.ConnectionString)
                        'Obtenemos los nombres de las bases de datos que
                        ' haya en el servidor
                        selectSQL = "select name from sys.databases;"
                        Dim com As SqlCommand = New SqlCommand(selectSQL, con)
                        Dim dr As SqlDataReader = com.ExecuteReader()
                        ' Recorremos el dataReader

                        While (dr.Read())
                            ' cboServidores.Items.Add(dr(0).ToString())
                            pbIpbien.Visible = True
                        End While
                        'Asignamos la lista de bases de datos como origen
                        'de datos del combobox
                    End Using
                Catch ex As Exception
                    pbIpmal.Visible = True
                    pbIpbien.Visible = False

                End Try
            End If
        End Sub

    Pero el detalle esta acá yo deseo ahora sabiendo en que servidor de SQL Server estoy, crear una base de datos en ese Servidor, tengo el siguiente código referencia de los amigos de MSDN:

    https://support.microsoft.com/es-ve/kb/305079

    pero si lo revisan veo que los archivos *.mdf los crea en una ruta que esta quemada y/o colocada en el codigo "

    D:\MyFolder\MyDatabaseData.mdf

    "Pero yo deseo que la base de datos se cree en la carpeta predeterminada del servidor de SQL Server el cual ya ubique mas arriba

    la ruta seria esta "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA" claro en este caso es así la ruta, pero supongo que  esta ruta podría cambiar si el SQL Server esta instalado en otra unidad de esa PC. les comparto la imagen de la ventana para que tengan una idea.

    Espero me haberme explicado bien y me puedan dar una ayudadita :-)

    jueves, 31 de marzo de 2016 14:35

Respuestas

  • "Vladimir Angarita" escribió:
    >
    > Pero yo deseo que la base de datos se cree en la carpeta predeterminada
    > del servidor de SQL Server el cual ya ubique mas arriba
    >
    > la ruta seria esta "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA"
    > claro en este caso es así la ruta, pero supongo que  esta ruta podría cambiar si el SQL
    > Server esta instalado en otra unidad de esa PC.

    Hola, Vladimir:

    Digamos que esa puede ser la ruta predeterminada donde se localiza las bases de datos del sistema de SQL Server, en tu caso correspondientes a la versión de SQL Server 2012, pero no quiere decir que el usuario de tu aplicación desee crear sus bases de datos en esa misma carpeta, como es mi caso, donde le tengo dicho a Microsoft SQL Server Management Studio que me cree las bases de datos en otra unidad y carpeta DIFERENTES.

    Eso por un lado, y por otro, deberías de saber que se necesitan permisos administrativos para acceder a dicha carpeta, por lo que no estoy yo muy seguro si el Administrador del sistema va a permitir que tu aplicación de Visual Basic acceda a dicha carpeta.

    Para conocer las ubicaciones por defecto de los archivos de SQL Server, te remito a la lectura del siguiente artículo:

    Ubicaciones de archivos para las instancias predeterminadas y con nombre de SQL Server

    Pero en mi caso particular, si yo desearía conocer dónde le he indicado a Microsoft SQL Server Management Studio que me cree por defecto las bases de datos de usuario, tendría que leer los valores DefaultData y DefaultLog, que para la instancia local de SQL Server 2014, estarían localizados en la siguiente clave del registro de Windows:

        HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQLServer

    Y para la instancia con nombre de SQLExpress, estarían localizados en ésta otra:

        HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQLServer

    > la ruta seria esta "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA"

    De todas maneras, si tu intención es crear la base de datos de usuario, sí o sí, en la misma carpeta que contiene la base de datos 'master.mdf', y siempre que el usuario de tu aplicación pueda acceder a dicha carpeta, puedes obtener dicha ruta ejecutando la siguiente función:

        ''' <summary>
        ''' Devuelve la ruta de la carpeta donde se encuentra la
        ''' base de datos 'master.mdf' correspondiente al nombre
        ''' de la instancia de SQL Server especificada.
        ''' </summary>
        ''' <param name="instanceName">Nombre de la instancia de SQL Server cuya
        ''' ruta de la carpeta de la base de datos 'master.mdf' se desea obtener.
        ''' Si no se especifica un valor, se devolverá la correspondiente a la
        ''' instancia local de Microsoft SQL Server.</param>
        ''' <author>Enrique M. Montejo - 2016</author>
        ''' <returns></returns>
        Private Shared Function GetMasterFolderPath(instanceName As String) As String
    
            If (String.IsNullOrWhiteSpace(instanceName)) Then
                instanceName = "(local)"
            End If
    
            ' Construir la cadena de conexión, la cual asume que la cuenta del
            ' usuario actual que ha iniciado sesión en el sistema operativo,
            ' tiene los permisos necesarios para acceder a la instancia de
            ' Microsoft SQL Server especificada.
            '
            Dim cadenaConexion As String = "Initial Catalog=master;Integrated Security=True;Data Source=" & instanceName
            Dim folderPath As String = String.Empty
    
            Using cnn As New SqlConnection(cadenaConexion)
                Dim cmd As SqlCommand = cnn.CreateCommand()
                cmd.CommandText =
                    "SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', physical_name) - 1) AS FolderPath " &
                    "FROM master.sys.master_files " &
                    "WHERE name = N'master'"
                cnn.Open()
                folderPath = cmd.ExecuteScalar().ToString()
            End Using
    
            Return folderPath
    
        End Function

    Cuando desees crear la nueva base de datos, tan solo ejecutarías algo parecido a lo siguiente:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Nombre de la instancia que se va a utilizar para crear la nueva base de datos
                Dim instanceName As String = "(local)"
                Dim folder As String = GetMasterFolderPath(instanceName)
    
                ' Eliminar cuando se observe que la función devuelve correctamente la ruta.
                MessageBox.Show(folder)
    
                ' Datos requeridos que los puedes tomar de los valores especificados
                ' en los correspondientes controles TextBox existentes en el formulario.
                '
                Dim nombreBaseDatos As String = "NuevaBaseDatos"
                Dim nombreArchivoDatos As String = IO.Path.Combine(folder, "NuevaBaseDatos.mdf")
                Dim nombreArchivoLog As String = IO.Path.Combine(folder, "NuevaBaseDatos.ldf")
    
                ' Construimos la cadena de conexión para conectarnos a la instancia
                ' local de SQL Server, especificando la base de datos 'master' y
                ' la seguridad integrada de Windows NT.
                '
                Dim cadenaConexion As String = "Initial Catalog=master;Integrated Security=True;Data Source=" & instanceName
    
                Using cnn As New SqlConnection(cadenaConexion)
    
                    Dim cmd As SqlCommand = cnn.CreateCommand()
    
                    ' Construimos la consulta T-SQL de creación de base de datos.
                    '
                    cmd.CommandText = String.Format("CREATE DATABASE [{0}] ON " &
                                                    "(NAME = {0}_dat, FILENAME = N'{1}', SIZE=5MB)" &
                                                    "LOG ON " &
                                                    "(NAME = {0}_log, FILENAME = N'{2}', SIZE=5MB)",
                                                    nombreBaseDatos, nombreArchivoDatos, nombreArchivoLog)
                    cnn.Open()
                    cmd.ExecuteNonQuery()
                End Using
    
                MessageBox.Show("Se ha creado satisfactoriamente la base de datos.")
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Si todo ha ido bien, se habrá creado la base de datos sin ningún tipo de problema, pero desde luego, si el usuario no tiene los permisos necesarios para acceder a dicha carpeta, está claro que obtendrás la correspondiente excepción.

    Ten en cuenta que el usuario puede crear la base de datos donde le parezca conveniente, y esa base de datos será reconocida por el servidor de SQL Server que haya indicado en la cadena de conexión utilizada para ejecutar el comando CREATE DATABASE, por lo que entiendo que no tiene mucho sentido tener que crear la base de datos en la misma carpeta donde se encuentran las bases de datos del sistema de SQL Server, porque si yo fuera el administrador del sistema donde se va a ejecutar tu aplicación, mucho me tendrías que convencer para que permitiera a tu aplicación acceder a dicha carpeta. ;-)

    Ni que decir tiene que tendrás que adaptar a tus necesidades tanto la cadena de conexión como la sintaxis de la consulta CREATE DATABASE que aparece en el ejemplo indicado más arriba.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    sábado, 2 de abril de 2016 6:51
    Moderador
  • https://msdn.microsoft.com/en-us/library/ms176061.aspx

    Chequea esto que te paso. hay le decis cual es la locacion de los files. 

    CREATE DATABASE database_name 
    [ CONTAINMENT = { NONE | PARTIAL } ]
    [ ON 
          [ PRIMARY ] <filespec> [ ,...n ] 
          [ , <filegroup> [ ,...n ] ] 
          [ LOG ON <filespec> [ ,...n ] ] 
    ] 
    [ COLLATE collation_name ]
    [ WITH  <option> [,...n ] ]
    [;]
    

    donde dice primary


    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft. Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    jueves, 31 de marzo de 2016 14:42
  • Creo que te estás complicando más de lo necesario. Basta con que transmitas al servidor una sentencia como esta:

    "CREATE DATABASE [NombreDeLaBase]"

    y nada más. Con eso se crea sobre la carpeta predefinida, que normalmente será ...\MSSQL\DATA, pero si el administrador del SQL Server la ha cambiado, se usará automáticamente la ubicación configurada.

    sábado, 2 de abril de 2016 7:19

Todas las respuestas

  • https://msdn.microsoft.com/en-us/library/ms176061.aspx

    Chequea esto que te paso. hay le decis cual es la locacion de los files. 

    CREATE DATABASE database_name 
    [ CONTAINMENT = { NONE | PARTIAL } ]
    [ ON 
          [ PRIMARY ] <filespec> [ ,...n ] 
          [ , <filegroup> [ ,...n ] ] 
          [ LOG ON <filespec> [ ,...n ] ] 
    ] 
    [ COLLATE collation_name ]
    [ WITH  <option> [,...n ] ]
    [;]
    

    donde dice primary


    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft. Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    jueves, 31 de marzo de 2016 14:42
  • "Vladimir Angarita" escribió:
    >
    > Pero yo deseo que la base de datos se cree en la carpeta predeterminada
    > del servidor de SQL Server el cual ya ubique mas arriba
    >
    > la ruta seria esta "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA"
    > claro en este caso es así la ruta, pero supongo que  esta ruta podría cambiar si el SQL
    > Server esta instalado en otra unidad de esa PC.

    Hola, Vladimir:

    Digamos que esa puede ser la ruta predeterminada donde se localiza las bases de datos del sistema de SQL Server, en tu caso correspondientes a la versión de SQL Server 2012, pero no quiere decir que el usuario de tu aplicación desee crear sus bases de datos en esa misma carpeta, como es mi caso, donde le tengo dicho a Microsoft SQL Server Management Studio que me cree las bases de datos en otra unidad y carpeta DIFERENTES.

    Eso por un lado, y por otro, deberías de saber que se necesitan permisos administrativos para acceder a dicha carpeta, por lo que no estoy yo muy seguro si el Administrador del sistema va a permitir que tu aplicación de Visual Basic acceda a dicha carpeta.

    Para conocer las ubicaciones por defecto de los archivos de SQL Server, te remito a la lectura del siguiente artículo:

    Ubicaciones de archivos para las instancias predeterminadas y con nombre de SQL Server

    Pero en mi caso particular, si yo desearía conocer dónde le he indicado a Microsoft SQL Server Management Studio que me cree por defecto las bases de datos de usuario, tendría que leer los valores DefaultData y DefaultLog, que para la instancia local de SQL Server 2014, estarían localizados en la siguiente clave del registro de Windows:

        HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQLServer

    Y para la instancia con nombre de SQLExpress, estarían localizados en ésta otra:

        HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQLServer

    > la ruta seria esta "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA"

    De todas maneras, si tu intención es crear la base de datos de usuario, sí o sí, en la misma carpeta que contiene la base de datos 'master.mdf', y siempre que el usuario de tu aplicación pueda acceder a dicha carpeta, puedes obtener dicha ruta ejecutando la siguiente función:

        ''' <summary>
        ''' Devuelve la ruta de la carpeta donde se encuentra la
        ''' base de datos 'master.mdf' correspondiente al nombre
        ''' de la instancia de SQL Server especificada.
        ''' </summary>
        ''' <param name="instanceName">Nombre de la instancia de SQL Server cuya
        ''' ruta de la carpeta de la base de datos 'master.mdf' se desea obtener.
        ''' Si no se especifica un valor, se devolverá la correspondiente a la
        ''' instancia local de Microsoft SQL Server.</param>
        ''' <author>Enrique M. Montejo - 2016</author>
        ''' <returns></returns>
        Private Shared Function GetMasterFolderPath(instanceName As String) As String
    
            If (String.IsNullOrWhiteSpace(instanceName)) Then
                instanceName = "(local)"
            End If
    
            ' Construir la cadena de conexión, la cual asume que la cuenta del
            ' usuario actual que ha iniciado sesión en el sistema operativo,
            ' tiene los permisos necesarios para acceder a la instancia de
            ' Microsoft SQL Server especificada.
            '
            Dim cadenaConexion As String = "Initial Catalog=master;Integrated Security=True;Data Source=" & instanceName
            Dim folderPath As String = String.Empty
    
            Using cnn As New SqlConnection(cadenaConexion)
                Dim cmd As SqlCommand = cnn.CreateCommand()
                cmd.CommandText =
                    "SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', physical_name) - 1) AS FolderPath " &
                    "FROM master.sys.master_files " &
                    "WHERE name = N'master'"
                cnn.Open()
                folderPath = cmd.ExecuteScalar().ToString()
            End Using
    
            Return folderPath
    
        End Function

    Cuando desees crear la nueva base de datos, tan solo ejecutarías algo parecido a lo siguiente:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Nombre de la instancia que se va a utilizar para crear la nueva base de datos
                Dim instanceName As String = "(local)"
                Dim folder As String = GetMasterFolderPath(instanceName)
    
                ' Eliminar cuando se observe que la función devuelve correctamente la ruta.
                MessageBox.Show(folder)
    
                ' Datos requeridos que los puedes tomar de los valores especificados
                ' en los correspondientes controles TextBox existentes en el formulario.
                '
                Dim nombreBaseDatos As String = "NuevaBaseDatos"
                Dim nombreArchivoDatos As String = IO.Path.Combine(folder, "NuevaBaseDatos.mdf")
                Dim nombreArchivoLog As String = IO.Path.Combine(folder, "NuevaBaseDatos.ldf")
    
                ' Construimos la cadena de conexión para conectarnos a la instancia
                ' local de SQL Server, especificando la base de datos 'master' y
                ' la seguridad integrada de Windows NT.
                '
                Dim cadenaConexion As String = "Initial Catalog=master;Integrated Security=True;Data Source=" & instanceName
    
                Using cnn As New SqlConnection(cadenaConexion)
    
                    Dim cmd As SqlCommand = cnn.CreateCommand()
    
                    ' Construimos la consulta T-SQL de creación de base de datos.
                    '
                    cmd.CommandText = String.Format("CREATE DATABASE [{0}] ON " &
                                                    "(NAME = {0}_dat, FILENAME = N'{1}', SIZE=5MB)" &
                                                    "LOG ON " &
                                                    "(NAME = {0}_log, FILENAME = N'{2}', SIZE=5MB)",
                                                    nombreBaseDatos, nombreArchivoDatos, nombreArchivoLog)
                    cnn.Open()
                    cmd.ExecuteNonQuery()
                End Using
    
                MessageBox.Show("Se ha creado satisfactoriamente la base de datos.")
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Si todo ha ido bien, se habrá creado la base de datos sin ningún tipo de problema, pero desde luego, si el usuario no tiene los permisos necesarios para acceder a dicha carpeta, está claro que obtendrás la correspondiente excepción.

    Ten en cuenta que el usuario puede crear la base de datos donde le parezca conveniente, y esa base de datos será reconocida por el servidor de SQL Server que haya indicado en la cadena de conexión utilizada para ejecutar el comando CREATE DATABASE, por lo que entiendo que no tiene mucho sentido tener que crear la base de datos en la misma carpeta donde se encuentran las bases de datos del sistema de SQL Server, porque si yo fuera el administrador del sistema donde se va a ejecutar tu aplicación, mucho me tendrías que convencer para que permitiera a tu aplicación acceder a dicha carpeta. ;-)

    Ni que decir tiene que tendrás que adaptar a tus necesidades tanto la cadena de conexión como la sintaxis de la consulta CREATE DATABASE que aparece en el ejemplo indicado más arriba.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    sábado, 2 de abril de 2016 6:51
    Moderador
  • Creo que te estás complicando más de lo necesario. Basta con que transmitas al servidor una sentencia como esta:

    "CREATE DATABASE [NombreDeLaBase]"

    y nada más. Con eso se crea sobre la carpeta predefinida, que normalmente será ...\MSSQL\DATA, pero si el administrador del SQL Server la ha cambiado, se usará automáticamente la ubicación configurada.

    sábado, 2 de abril de 2016 7:19
  • Hola Buenas tardes Enrique Martínez Montejo, muchas gracias por la respuesta, es exactamente lo que necesitaba, sobre los permisos no te preocupes que este desarrollo es para ser ejecutado por el Jefe de IT que es el administrador del Sistema que será el usuario de mi programa  de VB.NET ya que el mismo es desarrollado a pedido de el, de verdad muchas gracias!


    miércoles, 6 de abril de 2016 20:47