20 messaggi dal 08 novembre 2008
Questo il codice

Dim sql As String = "DROP DATABASE [" & AppPath & "\Database\Users.mdf" & "]"
ScriveNelDatabase(sql, "Data Source=.\SQLEXPRESS;Integrated Security=True;Connect Timeout=30;User Instance=True")

Il db viene regolarmente eliminato dalla directory sia il file mdf che il file ldf ma in sys.databases rimane sempre e quando cerco di ricreare il database con lo stesso nome mi dice che (ovviamente) è presente.

AppPath è il percorso completo dell'applicazione dove al suo interno vi è una directory con nome Database ed all'interno il database Users.mdf
In cosa sto sbagliando??? Grazie a tutti
Enzo
1.976 messaggi dal 27 luglio 2005
Contributi
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 Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
20 messaggi dal 08 novembre 2008
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.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.