none
c# sql veri tabanını restore etme

    Soru

  • vs 2010 da sql server 2008 backup işleminde sorun yok ama restore etmeye çalıştığımda hata alıyorum. Bir önerisi olan var mı acaba?

    Yazdığım kod

               

    try
                {
    SqlConnection _cnn = new SqlConnection(Settings.Default.Master);
                  SqlCommand  _cmd = new SqlCommand(@"RESTORE DATABASE [LogoKobiv2] FROM  DISK = N'" + path + "' WITH  FILE = 1,  NOUNLOAD,  STATS = 10", _cnn);

                if (_cnn.State == ConnectionState.Closed) _cnn.Open();               

    _cmd.ExecuteNonQuery();

                    _cnn.Close();
                    return true;
                }

    Aldığım Hata

    Exclusive access could not be obtained because the database is in use.
    RESTORE DATABASE is terminating abnormally.

    18 Haziran 2012 Pazartesi 13:22

Yanıtlar

  • Merhaba facia026;

    aldığın hata basitce Database'in kullanımda Olduğuna dair bir Hata Yapılabilecekler;

    1- Öncelikle Setting.Default.Master Bağlantı cümleciğinin gerçekden SQL Server Master Database'ine bağlanıp bağlanamadığından Emin ol.

    2- Bu Restore Commandını kullanmakda Sorun Olmayabilir Ama Restore Etmeye Çalışdığın Database Yazdığın Program tarafından Kullanıyor Olabilir. (Açık Unutulmuş bir Bağlantı bile sebep olabilir buna)

    3- Yazmış Olduğun Programa Erişimi Olan Başka Bir Kullanıcı Var ise  ve Programı Kullanıyorsa Doğal Olarak Veritabanı Kullanımda Olduğu İçin Yine Bu Hatayı Alıyor Olabilirsin.

    4 - Yazmış Olduğun Programa ait olan Connection Stringinde Eğer Veritabanını Attached Olarak kullanıyorsan yani.. Programın çalışma esnasında Veritabanının DBAdi.mdf, DbAdi.log dosyalarını aktif olarak kullanıyorsa bu sorunla karşılaşmış olabilirsin.

    Şimdilik Aklıma Gelenler bunlar ...

    Bunları deneyip Sonucunu Bildirisen sevinirim. Birde Sanırsam Path Olarak Dosya yolu veriyorsun... Milattan önceki çalışmalarımdan birine ait Restore Methodu Şu şekildeydi bunuda deneyebilirsin.

            /// Database'i Restore Edecek Method 
            public static bool VeritabaniRESTORE(string RestoreDosyasi) /// Parametre Olarak .bak Dosyasının Path'ini ve Adını Gönderiyorum
            {
                string restoreString = @"if EXISTS (select name from sys.databases where name = '***EskiDbAdi***') 
    DROP DATABASE ***EskiDBAdi*** RESTORE DATABASE ***VermekİstediğinYeniDBAdi*** FROM DISK = '" + RestoreDosyasi + "'";
                SqlConnection cnn = new SqlConnection("server=.; Database = master; Integrated Security = SSPI;");
                SqlCommand cmd = new SqlCommand(restoreString, cnn);
                try
                {
                    cmd.Connection.Open();
                    int donen = cmd.ExecuteNonQuery();  ///Etkilenen Satır Sayısına Göre Bool
                    if (donen != 0)                     ///Değer Çeviriyorum
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                catch (SqlException)
                {
                    return false;
                }
                finally
                {
                    cmd.Connection.Close();
                    cmd.Dispose();
                }
            }


    Jesus Promised The End Of All Wicked People, ODIN Promised The End Of All Ice Giants. I Don't See Many Ice Giants Around... exe[nokta]cute[at]live[nokta]com


    • Düzenleyen Exe.Cute 18 Haziran 2012 Pazartesi 17:06
    • Yanıt Olarak Öneren Emre GunerturkModerator 21 Haziran 2012 Perşembe 10:56
    • Yanıt Olarak İşaretleyen facia026 21 Haziran 2012 Perşembe 14:48
    18 Haziran 2012 Pazartesi 17:02

Tüm Yanıtlar

  • http://social.msdn.microsoft.com/Forums/tr-TR/csharptr/thread/a6295ae6-b022-4831-83aa-58aef732a335

    burayı bi incele istersen (sayfanın sonlarına bak cevabın orada)   

    18 Haziran 2012 Pazartesi 14:01
  • Merhaba facia026;

    aldığın hata basitce Database'in kullanımda Olduğuna dair bir Hata Yapılabilecekler;

    1- Öncelikle Setting.Default.Master Bağlantı cümleciğinin gerçekden SQL Server Master Database'ine bağlanıp bağlanamadığından Emin ol.

    2- Bu Restore Commandını kullanmakda Sorun Olmayabilir Ama Restore Etmeye Çalışdığın Database Yazdığın Program tarafından Kullanıyor Olabilir. (Açık Unutulmuş bir Bağlantı bile sebep olabilir buna)

    3- Yazmış Olduğun Programa Erişimi Olan Başka Bir Kullanıcı Var ise  ve Programı Kullanıyorsa Doğal Olarak Veritabanı Kullanımda Olduğu İçin Yine Bu Hatayı Alıyor Olabilirsin.

    4 - Yazmış Olduğun Programa ait olan Connection Stringinde Eğer Veritabanını Attached Olarak kullanıyorsan yani.. Programın çalışma esnasında Veritabanının DBAdi.mdf, DbAdi.log dosyalarını aktif olarak kullanıyorsa bu sorunla karşılaşmış olabilirsin.

    Şimdilik Aklıma Gelenler bunlar ...

    Bunları deneyip Sonucunu Bildirisen sevinirim. Birde Sanırsam Path Olarak Dosya yolu veriyorsun... Milattan önceki çalışmalarımdan birine ait Restore Methodu Şu şekildeydi bunuda deneyebilirsin.

            /// Database'i Restore Edecek Method 
            public static bool VeritabaniRESTORE(string RestoreDosyasi) /// Parametre Olarak .bak Dosyasının Path'ini ve Adını Gönderiyorum
            {
                string restoreString = @"if EXISTS (select name from sys.databases where name = '***EskiDbAdi***') 
    DROP DATABASE ***EskiDBAdi*** RESTORE DATABASE ***VermekİstediğinYeniDBAdi*** FROM DISK = '" + RestoreDosyasi + "'";
                SqlConnection cnn = new SqlConnection("server=.; Database = master; Integrated Security = SSPI;");
                SqlCommand cmd = new SqlCommand(restoreString, cnn);
                try
                {
                    cmd.Connection.Open();
                    int donen = cmd.ExecuteNonQuery();  ///Etkilenen Satır Sayısına Göre Bool
                    if (donen != 0)                     ///Değer Çeviriyorum
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                catch (SqlException)
                {
                    return false;
                }
                finally
                {
                    cmd.Connection.Close();
                    cmd.Dispose();
                }
            }


    Jesus Promised The End Of All Wicked People, ODIN Promised The End Of All Ice Giants. I Don't See Many Ice Giants Around... exe[nokta]cute[at]live[nokta]com


    • Düzenleyen Exe.Cute 18 Haziran 2012 Pazartesi 17:06
    • Yanıt Olarak Öneren Emre GunerturkModerator 21 Haziran 2012 Perşembe 10:56
    • Yanıt Olarak İşaretleyen facia026 21 Haziran 2012 Perşembe 14:48
    18 Haziran 2012 Pazartesi 17:02
  • Timeout süresi doldu. İşlem tamamlanmadan zaman aşımı süresi doldu veya sunucu yanıt vermiyor.

    Kodun iyi ancak böyle bir sorunla karşılaştım. Muhtemelen cevabın doğru. Anladığım kadarıyla eski databasi kaldırıp yerine yenisini kuruyor ve yedeği restore ediyor. Eğerki bu sorunuda halledersem olay tamamlanmıştır.

    21 Haziran 2012 Perşembe 14:44
  • Tamam dır. Çok teşekkür ederim Exe.Cute. Verdiğiniz koda ek olarak cmd.CommandTimeout = 0; kodunu eklemem yeterli oldu. Umarım diğer arkadaşların da işine yarar.
    21 Haziran 2012 Perşembe 14:50