andrea montanari ha scritto:
salv Enso,
la cosa non mi "torna" molto..
se i file che costituiscono il database vengono effettivamente eliminati, cio' significa che la cancellazione ha avuto successo, diversamente, ad esempio nel caso tu esegua il drop del db nel contesto di connessione che punta al db stesso, ti verrebbe sollevata un'eccezione di database in uso e la cancellazione non avrebbe luogo..
d'altrocanto DROP DATABASE ovviamente provvede anche al cleanup dei dati interni di allocazione presenti nel database master.. e questo mi fa "specie" visto che tu indichi che sys.databases mantenga tracce..
riparto dal principio:
prima di eseguire quel comando "sposta" la connessione su altro database (in letteratura si utilizza solitamente il database master), poi esegui...
dopo di che la domanda mi sorge spontanea.. sempre sicuro che la "verifica" avvenga verso la medesima child instance (e non magari la parent instance) in attenzione?
per fortuna che le user instances sono gia' state deprecate e quindi termineranno presto di creare problemi
saluti
Andrea, scusaa se ho imèpiegato tempo per rispondere, ma purtroppo sono stato veramente impegnato in questi ultimi tempi e quindi non ho avuto modo ne di vedere, ne di seguire l'applicativo.
Comunque ti posto il codice con le spiegazioni, purtroppo il probema resta e non so da cosa possa dipendere
Questa routine carica da master i database presenti e scrive il nome e la data di creazione in una griglia, evitando di mostrare quelli di servizio, quali master etc.
me.accesibledescription contiene la stringa di connessione che passo al form ed è la seguente
Dim connectionstring As String = "Data Source=.\SQLEXPRESS;Integrated Security=True;Connect Timeout=30;User Instance=True"
come vedi non fa riferimento al db ma sys.master
Private Sub ScrivenellaGriglia()
Dim count As Integer
Dim sql As String = "SELECT name, create_date FROM sys.databases"
Using Db As New SqlClient.SqlConnection(Me.AccessibleDescription)
Dim cmd As New SqlClient.SqlCommand(sql, Db)
Db.Open()
Dim reader As SqlClient.SqlDataReader = cmd.ExecuteReader
Me.GridDescrizione.SetDataBinding()
Me.GridDescrizione.Delete(0, Me.GridDescrizione.RowCount)
While reader.Read()
If reader.GetString(0) <> "master" And reader.GetString(0) <> "tempdb" _
And reader.GetString(0) <> "model" And reader.GetString(0) <> "msdb" _
And reader.GetString(0) <> "Service" Then
Me.GridDescrizione.AddRows(1)
Me.GridDescrizione(count, "Nome") = reader.GetString(0)
Me.GridDescrizione(count, "Data Creazione") = reader.GetDateTime(1)
count += 1
End If
End While
End Using
End Sub
questo è il form load dove si trova la griglia
Private Sub DataErase_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ScrivenellaGriglia()
Me.Cursor = Cursors.Default
End Sub
questa e la routine che elimina il db dopo averlo selezionato dalla griglia ed aver premuto ovviamente il tasto Elimina
me.accesibledescription contiene la stringa di connessione che è la seguente
Dim connectionstring As String = "Data Source=.\SQLEXPRESS;Integrated Security=True;Connect Timeout=30;User Instance=True"
come vedi non fa riferimento al db ma sys.master
Private Sub CmdElimina_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles CmdElimina.Click
'Dim retval As Integer
'retval = Messaggi(1, DbName, "")
'If retval = 6 Then
Dim sql As String = "DROP DATABASE [" & DbName & "]"
Using db As New SqlClient.SqlConnection(Me.AccessibleDescription)
db.Open()
Dim cmd As New SqlClient.SqlCommand
cmd.Connection = db
cmd.CommandText = sql
cmd.ExecuteNonQuery()
End Using
'End If
ScrivenellaGriglia()
Questo è tutto, resta il fatto che il db viene eliminato fisicamente dal disco utilizzando il percorso completo memorizzato in master, ma in master non viene eliminato, creando il problema di un nuovo db con lo stesso nome.