02. februar 2008 - 08:25Der er
40 kommentarer og 1 løsning
Detach en database
Jeg har et program, som kræver, at man kan eksportere en database. Men når jeg kopiere databasen, gennem kode, skriver den at den ikke kan få adgang til databasen, da den bruges af en anden proces. Jeg har læst at man skal detach databasen, men hvordan gør jeg det? Og i så fald, hvordan attack'er jeg den igen?
using System; using System.Collections.Specialized;
// Opret desuden references til: // 1) Microsoft.SqlServer.ConnetionInfo.dll // 2) Microsoft.SqlServer.Smo.dll // using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; // Server Management Objects
namespace e817653 { class Program { static void Main(string[] args) { Server server = new Server();
Console.WriteLine("Før deattach:"); foreach (Database database in server.Databases) Console.WriteLine("\t" + database.Name);
// Deattach database.
server.DetachDatabase("dinDatabase", true);
Console.WriteLine("Efter deattach:"); foreach (Database database in server.Databases) Console.WriteLine("\t" + database.Name);
Hvis databasen allerede er detachet, vil du få en fejl som den du beskriver.
At filen bruges af en anden process er ikke nødvendigvis det samme som at sie at den er attachet. Det kan sagtens være noget helt andet som har låst filerne.
Hvad mener du med at det "ikke skaber problemer" - virker koden så lige pludselig, eller hvad?
Synes godt om
Slettet bruger
02. februar 2008 - 10:48#14
Ja, hvis jeg flytter den del der kopiere op over initializecomponent, bliver databasen kopieret som den skal. Jeg har prøvet med den metode du skrev, men der skriver den 'Failed to connect to server ..':
foreach (Database database in server.Databases) Console.WriteLine("\t" + database.Name);
Du bliver selvfølgeli nødt til at finde ud af hvor filen ligger hos dig.
Dette har dog ingen indflydelse på om databasen kan detaches, men *kun* på om den kan gen-attaches.
Uden at databasen gen-attaches, vil du som sagt få den fejl du fortæller om der.
Synes godt om
Slettet bruger
02. februar 2008 - 11:57#21
Jeg har fundet databasen, men jeg tror det er 'Server' det er galt med. Uanset hvad jeg gør som bruger server melder den fejl. F.eks. når jeg skriver server.KillAllProcesses("MinDatabase")
Men hvorfor prøver du i øvrigt at gøre det? Databasen kan sagtens detaches uden at det skulel være nødvendigt.
Synes godt om
Slettet bruger
02. februar 2008 - 16:59#25
Jeg gjorde det kun for at prøve. Kan det være noget med at jeg kører Vista? Der er nogle mapper jeg ikke har adgang til hvis ikke jeg er administrator. Det er dog stadig SQL Server 2005.
1) Hvordan ved du at databasen overhovedet er attachet? Hvis den er blevet deattachet ved en tidligere kørsel, vil det fejle hvis man forsøger at deattache den.
2) Du har ikke noget kode somattacher databasen igen efter at den er blevet kopieret. Derfor vil databasen fortsat være detattachet nuste gang koden køres - hvilket giver en fejl i følge 1)
3) Dine filnavne *skal* bruge absolutte stier. Du kan ikke bruge File.Copy() ellers. Hvis du alligevel forsøger, vil koden fejle (og så vil databasen ikke blive attachet igen ... hvsi du ellers havde den kode med.
Synes godt om
Slettet bruger
02. februar 2008 - 23:37#29
1) Jeg har en attach kode under detach koden. 2) Jeg har aldrig oplevet at den gik videre uden at melde fejl. 3) Når jeg sætter koden op i over initializecomponent, kopiere den databasen som den skal selvom jeg ikke har den absolutte sti.
1) Det er altså lidt svært at hjælpe uden al den relevante kode...
2) Hvis du tilfældigvis aldrig har kørt koden på et tidspunkt hvor databasen faktisk var attachet på kørselstidspunktet, er det vel at forvente.
Jeg har ingen anelse om hvorvidt at det faktisk er tilfældet, men hvis den stump kode altid fejler så er din database detachet det meste af tiden.
I øvrigt virker koden. Du har bare aldrig fået den til at virke lige der på det sted i programmet ... og det er vel *det* som er det mystiske.
3) Det skyldes nok at du får oprettet databasen på samme sted hvor dit program køre fra. Hvis du opretter den fra dit program, er dette vel egentlig ikke så underligt. Den sti som jeg brugte i 02/02-2008 11:06:41 er den sti som SQL Server selv foreslår hvis man opretter databasen derfra.
Tak. Du må meget gerne gøre mere ud af at beskrive hvad du gør og hvad der så sker (og hvad du forventede). Desværre sidder jeg ikke ved din skærm og min ESP har aldrig været noget særligt. Og så er der jo kun gætteri tilbage...
Hvad får du hvis du erstatter den throw med dette:
// Deattach databasen. // try { server.DetachDatabase("dinDatabase", true); } catch (FailedOperationException ex) { if (ex.InnerException is MissingObjectException) { MessageBox.Show("Databasen var åbenbart ikke attachet.\nVi prøver alligevel at gå vidre.", "Hmmm", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("InnerException: " + ex.InnerException.GetType().ToString() + "\n" + ex.InnerException.Message); } }
Synes godt om
Slettet bruger
03. februar 2008 - 12:46#38
Så får jeg beskeden: InnerException: Microsoft.SqlServer.Management.Common.ConnectionFailureException Failed to connect to server ..
MySQL er udemærket, men jeg er 100 % sikker på at det sagtent kan lade sig gøre at få det til at virke med SQL Server. Det er sikkert bare en dum lille ting som ligger og spænder ben.
Du kan først give point når der er nogen som har lagt et svar, så det gør jeg da lige.
Men ellers er jeg ad frisk til at fortsætte... :^)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.