none
Cerrar la conexión de una base de datos sql en c#

    Question

  • Hola que tal.. actualmente estoy realizando un proyecto para una materia de mi escuela ... debido a la falta de conocimientos acerca de como manejar bases de datos en C#, recurrí a un libro en donde me explicaron como realizar la conexión con la base de datos sin escribir código alguno, solo aplanando botones, como vincular proyecto a la base de datos .. etc etc.. cosa que realiza C# solo. algo magnifico por cierto :D

    ahora la maestra nos pidió hacer un respaldo y recuperación de la base de datos. Esto lo puedo realizar perfectamente  si no abro la base de datos pero una vez que abro algún catalogo de la base de datos desde mi aplicación en c# e intento realizar el respaldo o la recuperación de la base de datos  me marca el siguiente error:

    "El proceso no puede obtener acceso al archivo 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\Telecomunicaciones1.0_log.ldf' porque está siendo utilizado en otro proceso."

    Este error me lo sigue marcando aun cuando cierre  todos mis catálogos y aun cuando vuelva a cerrar y a abrir la aplicacion... para poder realizar el respaldo y la recuperación  de nuevo tengo que recurrir a reiniciar  la computadora ... :S 

    quisiera saber si me prodrian ayudar a como poder realizar de el respaldo y la recuperación de la base de datos sin tener que reiniciar la compu, y cuando el usuario quiera .. no se si se tenga que cerrar la conexión o que tenga que hacer ... espero su pronta respuesta

    Friday, May 18, 2012 1:59 PM

All replies

  • ¿Cómo estás haciendo el respaldo de la base de datos? ¿Mandas un comando BACKUP DATABASE a través del SQLConnection con ExecuteNonQuery? En principio SQL Server debe ser capaz de hacer respaldo de la base de datos estando en línea, no deberías tener problemas.

    logo osoft
    Si he contestado tu pregunta, por favor marca mi post como respuesta.
    ...Y si mi post te ha servido, márcalo como útil smile

    Friday, May 18, 2012 2:08 PM
  • hola

    es normal que suceda esto ya que el servicio de sql server esta tomando el archivo

    la forma mas simple de realizarlo es por medio de las api del management de sql server

    Using SMO for Backup, Restore and Security Purposes

    Getting Started with SMO in SQL 2005 - Backups

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Friday, May 18, 2012 2:18 PM
  • Mira estoy utilizando SQL Server 2008 y observe que las bases de datos que creo se guardan en:

    "C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA"

    y pues como soy nuevo en esto, lo que se me ocurrió  fue hacer lo siguiente: meter en el código al momento de  aplanar el botón de respaldo de la base de datos dentro de mi aplicación , introducirme a hasta las carpeta donde se encuentra la base de datos y copiar los dos archivos de mi base el  ".mdf y ,ldf" a una carpeta en mi escritorio para hacer el "respaldo" .. te dejo el codigo tal vez me puedas entender mejor 

                          

    private void BaseDatosResp_Click(object sender, EventArgs e)
            {
                String origen, destino,d,dia;            
                Char []di;
                d = System.DateTime.Now.ToString();
                d=d.Remove(23);

                origen = "C:\\Program Files\\Microsoft SQL Server\\MSSQL10.SQLEXPRESS\\MSSQL\\DATA\\Telecomunicaciones1.0.mdf";
                destino = "C:\\Users\\Cristian\\Desktop\\Telecomunicaciones y Servicios1.0primero\\RespaldoBase\\Telecomunicaciones1.0" + dia + ".mdf";
                System.IO.File.Copy(origen,destino);
                origen = "C:\\Program Files\\Microsoft SQL Server\\MSSQL10.SQLEXPRESS\\MSSQL\\DATA\\Telecomunicaciones1.0_log.ldf";
                destino = "C:\\Users\\Cristian\\Desktop\\Telecomunicaciones y Servicios1.0primero\\RespaldoBase\\Telecomunicaciones1.0_log" + dia + ".ldf";
                System.IO.File.Copy(origen, destino);
                //System.IO.FileInfo vArchivo = new System.IO.FileInfo("C:\\Program Files\\Microsoft SQL Server\\MSSQL10.SQLEXPRESS\\MSSQL\\DATA\\bd_libros.mdf");
                //vArchivo.CopyTo("C:\\Users\\Cristian\\Desktop\\Telecomunicaciones y Servicios1.0primero\\RespaldoBase\\Copia.mdf");

            }

    Esto lo hace perfectamente siempre y cuando  no haya abierta o consultado algún dato de mi base de datos  por ejemplo: al momento de dar click en el botón clientes en mi aplicación  se abre un form donde se pueden dar de altas bajas y modificar clientes  entonces supongo que ya se abrio la base de datos.. si ahora cierro dicho form y  voy y hago el respaldo.. me marca el error que te comento arriba en la descripción del problema                                                                              "El proceso no puede obtener acceso al archivo 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\Telecomunicaciones1.0_log.ldf' porque está siendo utilizado en otro proceso."

    Saturday, May 19, 2012 1:48 AM
  • al igual hago lo mismo con la restauración: voy a a la capeta donde se encuentra mi base de datos borro la base de datos que se encuentra ahi... y pongo la que el usuario quiera recuperar con exactamente el mismo nombre que tenia la que acabo de borrar ... para que asi  C# no me marque error con la base de datos 

    private void BaseDatosRecuperacion_Click(object sender, EventArgs e)
            {
                String origen, destino;
                String origen2, destino2, aux; ;
                String ArchOriginal, ArchRemplaso, ArchCopia;
                String ArchOriginal2, ArchRemplaso2, ArchCopia2;


                openFileDialog.InitialDirectory="C:\\Users\\Cristian\\Desktop\\Telecomunicaciones y Servicios1.0primero\\RespaldoBase";
                openFileDialog.Filter = "LDF Files(*.ldf)|*.ldf|Todos los Archivos (*. *) | *. *";

                ArchOriginal = "C:\\Program Files\\Microsoft SQL Server\\MSSQL10.SQLEXPRESS\\MSSQL\\DATA\\Telecomunicaciones1.0_log.ldf";
                ArchOriginal2 = "C:\\Program Files\\Microsoft SQL Server\\MSSQL10.SQLEXPRESS\\MSSQL\\DATA\\Telecomunicaciones1.0.mdf";

                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    System.IO.File.Delete(ArchOriginal);
                    System.IO.File.Delete(ArchOriginal2);

                    origen = openFileDialog.FileName;
                    destino = "C:\\Program Files\\Microsoft SQL Server\\MSSQL10.SQLEXPRESS\\MSSQL\\DATA\\Telecomunicaciones1.0_log.ldf";
                    System.IO.File.Copy(origen, destino);
                   
                    origen2 = origen.Remove(101);
                    aux=origen.Substring(105);
                    aux=aux.Remove(23);
                    aux += ".mdf";
                    origen2 += aux;
                    destino2 = "C:\\Program Files\\Microsoft SQL Server\\MSSQL10.SQLEXPRESS\\MSSQL\\DATA\\Telecomunicaciones1.0.mdf";
                    System.IO.File.Copy(origen2, destino2);

                }
            }

     te digo al igual que el respaldo .. esto lo hace perfectamente siempre y cuando no haya abierto algun catalogo de mi base de datos 

    Saturday, May 19, 2012 1:53 AM
  • hola que tal gracias por la respuesta ...

    Sabes intente hacer lo que me indicas pero C# no me reconoce los siguientes:

    using Microsoft.SqlServer.Management.Smo;
    • Microsoft.SqlServer.ConnectionInfo
    • Microsoft.SqlServer.Smo
    • Microsoft.SqlServer.SmoEnum
    • Microsoft.SqlServer.SqlEnum

    el unico que si me sale es este:

    using Microsoft.SqlServer.Server;

    pero ese no me sirve de nada en los ejemplos que vienen en las paginas que mencionas .. te agradeceria si me podrias decir de que manera incluirlas o que debo hacer ?? ... manejo visual studio 2008... espero y puedas leer las respuesta que le puse a Yván Ecarri donde explico un poco mas detallado mi problema .. de antemano muchas gracias 

    Saturday, May 19, 2012 1:58 AM
  • es que debes instalar

    Microsoft SQL Server 2008 Feature Pack, October 2008

    para poder usarlo

    fijate donde dice "Microsoft SQL Server 2008 R2 Management Objects "


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Saturday, May 19, 2012 2:08 AM
  • Es este verdad???

    Microsoft SQL Server 2008 Replication Management Objects 
     El paquete de Microsoft SQL Server 2008 Replication Management Objects incluye API para administrar objetos de réplica de SQL Server 2008 mediante programación. El paquete Replication Management Objects requiere Windows Installer 4.5, Microsoft SQL Server Native Client 10.0 y el paquete de colección de Objetos de administración de SQL Server 2008 (SMO).

     Destinatarios: cliente, asociado, programador

    Paquete X86 (sql_rmo.msi) - 9005 KB

    ............

    oye una pregunta si mi sql no es original no pasa nada verdad ????

    Saturday, May 19, 2012 2:33 AM
  • si usas sql express no pasa nada, porque es de libre uso

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Saturday, May 19, 2012 2:58 AM
  • Pero si es ese que te puse verdad??? para ya descargarlo ... o hay alguna diferencia por que no dice "R2"

    Saturday, May 19, 2012 3:29 AM
  • hasta donde se no deberia afectar, igualmente como todo hay que realizar alguna prueba para terminar de validarlo

    un tema, no se si leiste

    Overview (SMO)

    alli dice

    The SMO assemblies are installed by default into the Global Assembly Cache (GAC) with the SQL Server SDK option. The assemblies are located in C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\.

    esa parte la habias leido

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Saturday, May 19, 2012 4:14 AM
  • esa forma en la cual deceas conectarte a la base de datos no creo que sea muy segura

    La forma mas segura es usando autentificacion de windows

    Data Source = ServidorSQL; Initial Catalog = BaseDatos; Integrated Security = True

     o de sql server si en tu caso tu base de tados tiene password y usuario

    data source = ServidorSQL; initial catalog = BaseDatos; user id = Usuario; password = Contraseña

     

    sqlconnection conn = "data source = nombreMaquina\\instancia sql server; initial catalog = nombreDeLaBaseDatos; integrated security = true";

    en mi caso yo hago lo siguiente.

    sqlConnection conn = "data source = william-pc\\SQLEXPRESS; initial catalog = prueba; integrated security = true";

    espero que mi informacion te sea util  -_-

    esta pagina podria servirte de ayuda

    http://www.elguille.info/net/adonet/cadena_de_conexion_para_conectar_a_una_base_de_sql_server.htm

    Sunday, May 20, 2012 3:23 AM
  • fijate que ya instale el 

    Microsoft SQL Server 2008 Feature Pack, October 2008

    y no me salen las librerías !!! :S

    Thursday, May 31, 2012 3:25 AM