2017-02-19 1 views
0

Ich habe eine WPF 4.5 .NET-Anwendung mit einer Datenbank-Backup-Funktion erstellt. Die Funktionen und die Sicherung funktionieren einwandfrei beim Debuggen, aber wenn ich sie in ClickOnce veröffentliche und auf dem Zielcomputer installiere, funktioniert alles, außer die Sicherung funktioniert nicht, da ClickOnce den Standort des Anwendungsordners verschleiert, so dass die Backup-Anweisung zu lang wird! Gibt es eine Möglichkeit, die Backup-Anweisung kürzer zu machen? hier ist mein Code und die Fehler, die ich erhalten: Code:Backup lokale Datenbank in ClickOnce

SaveFileDialog sfd = new SaveFileDialog(); 
string stringCon = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\whdb.mdf;Integrated Security=True"; 
string dbPath = Application.StartupPath + @"\whdb.mdf"; 
if (sfd.ShowDialog() == DialogResult.OK) 
{ 
    using (SqlConnection conn = new SqlConnection(stringCon)) 
    { 
     string backupStmt = string.Format(@"backup database @whdb to disk='{0}' WITH INIT ", sfd.FileName); 
     using (SqlCommand sqlComm = new SqlCommand(backupStmt, conn)) 
     { 
      sqlComm.Parameters.AddWithValue("@whdb", dbPath); 
      conn.Open(); 
      sqlComm.ExecuteNonQuery(); 
      conn.Close(); 
     } 
    } 
) 

************** Ausnahmetext **************

System.Data.SqlClient.SqlException (0x80131904): Invalid database name 'C:\Users\Abubaker\AppData\Local\Apps\2.0\52WR4JTO.12O\D6M4D7OQ.Z3D\sa3a..tion_fef19ab42c2b8f22_0001.0000_9fc10c82bbf23ed2\whdb.mdf' specified for backup or restore operation. 
BACKUP DATABASE is terminating abnormally. 

Antwort

0

Die Datenbankdatei 'whdb.mdf' wird von einer anderen vorhandenen Anwendung erstellt? Und Ihre WPF-Anwendung dient nur zum Sichern der vorhandenen whdb.mdf-Datenbank?

Ich kämpfte auch tagelang für diese Art von Situation. Ich habe versucht | Datenverzeichnis | und Application.StartupPath und einige andere Ansätze, wie Sie auch gefunden haben.

Allerdings habe ich mich endlich für diesen Weg entschieden und meinen Dienst erfolgreich gestartet (veröffentlicht).

Nach meiner Erfahrung, | Data Directory | gibt verschiedene Orte an, abhängig von den Umständen, mit anderen Worten, es ist nicht immer das selbe .. Und ich konnte (SQL Select Befehl) Datenbank mit | Data Directory | lesen setting in connectionString, aber konnte die Datenbank nicht einfügen oder aktualisieren. Sie können einige Leute finden, die diese Schwierigkeiten haben, indem Sie auf interent suchen. Ich denke, wenn wir | Data Directory | In connectionString spielt die Datenbank eine Rolle als schreibgeschützte Datendatei, wie die Nuance von | Data Directory |.

Stattdessen das | Data Directory |, wählte ich offensichtlichen Pfad, der immer den gleichen Ort (Verzeichnis) angibt.

@"Data Source=(LocalDB)\v11.0;AttachDbFilename=" + Environment.GetEnvironmentVariable("APPDATA") + @"\whdb.mdf;Integrated Security=True"; 

Oberhalb Umwelt Variable gibt immer C: \ Benutzer \ Abubaker \ AppData \ Roaming-Verzeichnis.

In diesem Szenario müssen Sie zuerst die Datenbankdatei "whdb.mdf" mit dem obigen Pfad erstellen.

Und weiter, können Sie Ihr eigenes zusätzliches Verzeichnis wie mybackup mit der Connection wie schaffen

@"Data Source=(LocalDB)\v11.0;AttachDbFilename=" + Environment.GetEnvironmentVariable("APPDATA") + @"\mybackup" + @"\whdb.mdf;Integrated Security=True"; 

Ich konnte nicht das offizielle Dokument von Microsoft finden, wie das | Datenverzeichnis | funktioniert aber gescheitert. Verständnis | Datenverzeichnis | wäre dein Schlüssel, sonst gibt es einen alternativen Weg wie meinen Fall. Mein Fall ist auch WPF, Clickonce, SQL-Datenbank (es war LocalDB aber ich änderte den normalen SQL-Datenbank wegen der Remote-Netzwerk)

+0

funktioniert nicht! das Problem immer noch da ich Application.StartupPath in der Backup-Anweisung verwenden muss! die Verbindungszeichenfolge ist in Ordnung – user7586828

+0

Ich kenne den Prozess, der localDB an Projekt und Veröffentlichung anfügt. Vielleicht ist es notwendig, | Data Directory | zu verstehen. Viel Glück ! –

0

das Problem gelöst, indem Initial catalog=whdb in der Verbindungszeichenfolge das Hinzufügen und Ersetzen Sie den vollständigen Pfad Application.StartupPath + @"\whdb.mdf" mit nur der Datenbankname "whdb"!