Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Visual Basic .Net + SQL Server 2000 + restore database

Îåêßíçóå áðü ôï ìÝëïò aNTwNHs. Τελευταία δημοσίευση από το μέλος dbaltas στις 24-06-2005, 12:33. Υπάρχουν 13 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  23-05-2005, 16:29 2155

    Visual Basic .Net + SQL Server 2000 + restore database

    Καλησπέρα,
    προσπαθώ να κάνω restore μια βάση σε SQL Server 2000 μεσα από VB.NET.


    Dim cn As System.Data.SqlClient.SqlConnection
    Try
    cn = New System.Data.SqlClient.SqlConnection(MySettings.ConnectionString)
    Dim sql As New System.Data.SqlClient.SqlCommand("restore database DatabaseName from disk = 'c:\tmp\DatabaseName.dat' with replace", cn)
    cn.Open()
    sql.ExecuteNonQuery()
    cn.Close()
    Catch ex As System.Exception
    ExceptionManager.Publish(Me, ex)
    cn.Close()
    End Try

     

    Πέρνω το μήνυμα: Exclusive access could not be obtained because the database in use

    Στην βάση δεν είναι άλλος χρήστης συνδεδεμένος (το backup με παρόμοια υλοποίηση δεν έχει πρόβλημα)

    Καμιά ιδέα;

    aWaY
  •  23-05-2005, 16:50 2157 σε απάντηση της 2155

    Re: Visual Basic .Net + SQL Server 2000 + restore database

    Μήπως το connectionstring σου κοιτάζει την ίδια βάση? Δοκίμασε να συνδεθείς στη master ή κάποια άλλη βάση πρώτα. Βεβαιώσου επίσης ότι δεν είναι κανείς άλλος συνδεδεμένος, ούτε SQL Analzer ούτε Enterprise Manager, ούτε ανοιχτό query παράθυρο μέσα στο visual studio


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  24-05-2005, 09:15 2173 σε απάντηση της 2157

    Re: Visual Basic .Net + SQL Server 2000 + restore database

    Όχι, στην Master συνδέομαι. Και δεν είναι άλλος χρήστης μέσα.

    aWaY
  •  24-05-2005, 10:03 2174 σε απάντηση της 2173

    Re: Visual Basic .Net + SQL Server 2000 + restore database

    Και δεν έχει μείνει κανένα connection στο pool? Και είναι και ο SQLSERVERAGENT σταματημένος?

    Αν δεις την περιγραφή του λάθους (3101) αναφέρει ότι μπορείς να χρησιμοποιήσεις την εντολή ALTER DATABASE SET SINGLE_USER για να πετάξεις όλους τους χρήστες από τη βάση. Μετά το restore, κάνεις ALTER DATABASE SET MULTI_USER για να δουλεύει πάλι η βάση για πολλούς χρήστες.

    Τρέξε και ένα sp_who από το connection σου πριν κάνεις το restore. Ίσως να βρεις κάποιο connection που δεν περίμενες


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  24-05-2005, 13:23 2178 σε απάντηση της 2174

    Re: Visual Basic .Net + SQL Server 2000 + restore database

    Λοιπόν τελικά όντως έχω ένα connection ανοιχτό σε status sleeping/AWAITING COMMAND στην db που θέλω να κάνω restore. Το πρόβλημα είναι ότι δεν θέλω να κάνω kill το process γιατι το χρειάζομαι αργότερα. Γνωρίζετε κάποιο τρόπο να το κάνω suspend(η όποια άλλη κατάσταση μου επιτρέπει να κανώ το restore χωρίς πρόβλημα) και μετά το restore να το επαναφέρω.
    Ευχαριστώ


    aWaY
  •  24-05-2005, 13:32 2179 σε απάντηση της 2178

    Re: Visual Basic .Net + SQL Server 2000 + restore database

    Αν είναι τόσο σημαντικό να κρατήσεις το connection, εκτέλεσε ένα USE Master ή κάποια άλλη άσχετη βάση επάνω του και μετά το restore ξανακάνε USE MyDB. Γιατί όμως να μην το κλείσεις και να το ξανανοίξεις?


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  24-05-2005, 13:39 2180 σε απάντηση της 2179

    Re: Visual Basic .Net + SQL Server 2000 + restore database

    Kυρίως γιατί δεν έχω τον κώδικα που το ανοίγει, και δεν είμαι σίγουρος για το τι ακριβώς κάνει...
    Θα δοκιμάσω την λύση που μου προτείνεις.
    Ευχαριστώ για τις άμεσες απαντήσεις. Smile

    aWaY
  •  24-05-2005, 14:08 2182 σε απάντηση της 2180

    Re: Visual Basic .Net + SQL Server 2000 + restore database

    πως ακριβώς μπορώ να αλλάξω την db του συγκεκριμένου connection;

    aWaY
  •  24-05-2005, 14:20 2183 σε απάντηση της 2182

    Re: Visual Basic .Net + SQL Server 2000 + restore database

    Dim cmdSwitch As SqlCommand = New SqlCommand("USE MASTER", cn)
    cmdSwitch.ExecuteNonQuery()
    cmdSwitch.CommandText="USE MYDB"
    cmdSwitch.ExecuteNonQuery()


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  24-05-2005, 14:30 2184 σε απάντηση της 2182

    Re: Visual Basic .Net + SQL Server 2000 + restore database

    Δήλωσε ένα CommandObject, βάλτο να κάνει "USE xxx" (όπου xxx ή άλλη DB) και σύνδεσέ το με το Connection. Κατόπιν τρέξτο με ExecuteNonQuery.
    Μην δοκιμάσεις να παίξεις με το ChangeDatabase method γιατί απλά ανοίγει ένα δεύτερο connection στη νέα DB!


    Vir prudens non contra ventum mingit
  •  24-05-2005, 14:30 2185 σε απάντηση της 2183

    Re: Visual Basic .Net + SQL Server 2000 + restore database

    οκ, προφανώς δεν έχω το cn...:(

    και δυστοιχώς δεν μπορώ να αλλάξω το connection σε ένα process που δεν μου ανήκει, ε;






    aWaY
  •  24-05-2005, 15:01 2189 σε απάντηση της 2185

    Re: Visual Basic .Net + SQL Server 2000 + restore database

    Τότε Crying

    Ακόμα και αν μπορούσες να παγώσεις το connection δεν έχει νόημα. Οτιδήποτε state είχε κρατηθεί, ανοικτά transaction ή locks θα χάνονταν με το restore. Αλλά και το άλλο process, αν δεν είχε γραφτεί για να καταλαβαίνει από "παγωμένα" connections θα άρχιζε να ρίχνει exceptions.

    Μου φαίνεται ότι η μόνη σου ελπίδα είναι αν καταλαβαίνει το άλλο process από πεσμένα connections και να προσπαθεί να τα ξανασηκώσει.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  25-05-2005, 21:20 2210 σε απάντηση της 2189

    Re: Visual Basic .Net + SQL Server 2000 + restore database

    Για την ιστορία δεν μπόρεσα να κάνω τίποτα καλύτερο, από restart όλης της εφαρμογής μετά το restore της db (δεν είναι ότι καλύτερο σίγουρα, αλλά όταν τρέχουν deadlines δεν υπάρχει χρόνος για πολύ ψάξιμο). Ευχαριστώ για την βοήθεια Smile


    aWaY
  •  24-06-2005, 12:33 3072 σε απάντηση της 2155

    Re: Visual Basic .Net + SQL Server 2000 + restore database

    Για να κάνεις restore  μία βάση π.χ dbSample  στον SQL Server 2000, πρέπει να βεβαιωθείς ότι
    κανένα Connection στη βάση δεν είναι ανοιχτό.
    By default όταν ανοίγεις ένα Connection και έπειτα το κλείνεις αυτό μένει στο Pool για γρήγορη απάντηση σε μελλοντικά αιτήματα.

    Αυτό μπορείς να το λύσεις αν προσθέσεις στο ConnectionString του Connection με το οποίο έχεις ανοίξει ΠΡΟΗΓΟΥΜΕΝΩΣ τη βάση dbSample το ";pooling=false".

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems