none
Daten in SQL Server 2012 LocalDB anzeigen RRS feed

  • Frage

  • Hallo liebe Forenmitglieder,

    dank Eurer Hilfe klappt jetzt die Verbindung mit der in VisualStudio 2012 enthaltenen SQL Server 2012 LocalDB. Daten Hochladen mit BulkInsert funktioniert auch. Einen Satz Testdaten mit 20 Zeilen kann ich hochladen, er wird im DataGrid angezeigt und unter ServerExplorer ->Datenbank ->Tabelle ->Tabellendaten anzeigen. Versuche ich diese Datei erneut hochzuladen, kommt die Fehlermeldung "Daten schon vorhanden". Soweit ist alles bestens.

    Versuche ich jetzt eine Datei mit gut 30 000 Datensätzen hochzuladen, klappt das auch, beim zweiten Versuch kommt ebenfalls die Fehlermeldung "Daten schon vorhanden" - nur wo sind die Datensätze?

    Sie werden weder im Datagrid angezeigt, noch unter "Tabellendaten anzeigen, müssen aber in der Tabelle stehen, sonst käme die Fehlermeldung nicht.

    Ich aktualisiere das Dataset mit der TableAdapter-Fill-Methode vor der Anzeige im Datagrid.

    Mit freundlichen Grüßen

    Ottilie

    Donnerstag, 30. Mai 2013 15:51

Antworten

  • Hallo Ottilie,

    hast Du die lokale Datenbank im Projekt gespeichert?
    Wenn ja, dann überprüfe bitte:

    1. auf welche Datenbankdatei die Verbindungszeichenfolge verweist (die im Projekt-, oder die im Bin-Verzeichnis)
    2. was steht in den Dateieigenschaften der Projektdatei [DeineDb].mdf unter "In Ausgabeverzeichnis kopieren". Es könnte nämlich sein, dass dort die Einstellung "Immer kopieren" dazu führt, dass die Datenbankdatei im bin-Verzeichnis überschrieben wird.

    Gruß
    Marcel

    • Als Antwort markiert ottilie Sonntag, 2. Juni 2013 07:44
    Donnerstag, 30. Mai 2013 18:05
    Moderator
  • Hallo Ottilie,

    Wenn ich aber das DataSet aktualisieren möchte mit tableadapter.Fill kommt folgende Fehlermeldung:

    An attempt to attach an auto-named database for file C:\Users\Ottilie\Documents\Visual Studio 2012\Projects\RiskAnalyzer\RiskAnalyzerTest\bin\Debug\RiskAnalyzerDB.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.

    das ist vermutlich doppelt gemoppelt: Wenn ich mich recht aus dem anderen Thread erinnere, baust Du für den Massenimport eine eigene Verbindung auf. Darin wird die mdf-Datendatei (welche genau?) angehängt. Wenn Du nun den TableAdapter deine Datentabelle füllst, wird eine zweite Verbindung hergestellt und darin wird nochmals versucht die gleichnamige Datendatei anzuhängen, daher die Fehlermeldung von oben. Eine einzige SqlConnection müßte das Problem lösen.

    Desgleichen: Du arbeitest mit  zwei MDF-Datenbankdateien. Eine im Projkektpfad, die anderen im Bin-Ausgabepfad. Der Sinn der Projekt-Datenbank ist es, Änderungen an der Datenbank während der Entwicklung permanent zu speichern. Daher ist die Standardeinstellung für "In Ausgabeverzeichnis kopieren" auf "immer kopieren" gesetzt. Die Logik ist also: In der Projekt-DB änderst Du das Schema, bei der Projekterstellung wird die geänderte MDF in den Bin-Pfad kopiert, von wo aus deine Anwendung mit der MDF arbeiten kann (quasi wie mit einer eingebetteten DB). Du möchtest ja am Ende des Entwicklungszyklus nicht das Projekt sondern deine Anwendung verteilen. Das bedeutet aber, dass deine Anwendung nicht die Projekt-MDF, sondern die Bin-MDF attachen muss, und zwar nur ein einziges Mal.

    In meinem Setting, habe ich die MDF-Datei weder in persönlichen Ordner des Benutzers, noch im Bin-Verzeichnis belassen, weil zum einen die MDF-Datei anders als eine Access-MDB nicht einfach als Dokumentdatei verteilbar ist, zum anderen die Benutzung nicht auf einen Benutzer beschränkt bleiben sollte. Daher schien mir Application.CommonAppDataPath eine gute lokale Lösung zu sein.

    Desweiteren: Es hat den Anschein, dass Du eine WPF- und keine Windows Forms-Anwendung erstellst.  Bei Path.Combine, handelt es sich um den System.IO-Namensraum, da solltest Du keine Probleme bekommen. Und Application.CommonAppDataPath logiert im System.Windows.Forms-Namensraum, den Du in einer WPF-Anwendung nicht wirklich brauchst. Du kannst aber zum einen direkt auf Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) zugreifen, zum anderen tut auch das in der Verbindungszeichenfolge angegebene |DataDirectory| gute Dienste, wenn Du's in Zusammenhang mit AppDomain.SetData("DataDirectory", objValue)- verwendest.

    Wichtig ist nur, dass Du dich immer auf eine einzige MDF beziehst. SqlBulkCopy hat übrigens einen Konstruktor der eine SqlConnection als Argument akzeptiert (die Verbindung muss vorher geöffnet werden) und die Methode WriteToServer akzeptiert auch eine stark typisierte Tabelle, so wie sie z.B. durch den Designer erstellt wurde. Damit hast Du gute Karten für dein Vorhaben.

    Gruß
    Marcel

    • Als Antwort markiert ottilie Sonntag, 2. Juni 2013 07:44
    Freitag, 31. Mai 2013 09:20
    Moderator

Alle Antworten

  • Hallo Ottilie,

    hast Du die lokale Datenbank im Projekt gespeichert?
    Wenn ja, dann überprüfe bitte:

    1. auf welche Datenbankdatei die Verbindungszeichenfolge verweist (die im Projekt-, oder die im Bin-Verzeichnis)
    2. was steht in den Dateieigenschaften der Projektdatei [DeineDb].mdf unter "In Ausgabeverzeichnis kopieren". Es könnte nämlich sein, dass dort die Einstellung "Immer kopieren" dazu führt, dass die Datenbankdatei im bin-Verzeichnis überschrieben wird.

    Gruß
    Marcel

    • Als Antwort markiert ottilie Sonntag, 2. Juni 2013 07:44
    Donnerstag, 30. Mai 2013 18:05
    Moderator
  • Hallo Marcel,

    Du hast mir ja heute schon mal sehr geholfen, auch jetzt der Hinweis ist sehr gut. Herzlichen Dank.

    Ich habe den zweiten Punkt geändert auf "In Ausgabeverzeichnis kopieren" auf "nicht kopieren gesetzt. Jetzt werden im ServerExplorer alle Zeilen angezeigt.

    Wenn ich aber das DataSet aktualisieren möchte mit tableadapter.Fill kommt folgende Fehlermeldung:

    An attempt to attach an auto-named database for file C:\Users\Ottilie\Documents\Visual Studio 2012\Projects\RiskAnalyzer\RiskAnalyzerTest\bin\Debug\RiskAnalyzerDB.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.

    Aktualisiere ich das DataSet nicht, wird im DataGrid nichts angezeigt.

    Als Pfad habe ich den zum Projektverzeichnis mit

     conbuilder.AttachDBFilename = "|DataDirectory|RiskAnalyzerDB.mdf";


    angegeben, der von Dir im anderen Thread vorgeschlagene Weg mit

    conbuilder.AttachDBFilename = Path.Combine(Application.CommonAppDataPath, "RiskAnalyzerDB.mdf");

    wollte nicht funktionieren. Hier bekomme ich von VisualStudio zwei Fehlermeldungen:

    "Path" ist ein mehrdeutiger Verweis, kann zu System.IO oder zu System.Windows.Shapes.Path gehören. Und CommonAppDataPath kennt das System nicht. Suche ergab Namespace windows.forms, aber das wurde auch nicht akzeptiert.

    Ich benötige zwar späer die Anzeige im DataGrid nicht, aber ein aktuelles Dataset muss schon her.

    Gruß

    Ottilie

    • Als Antwort markiert ottilie Sonntag, 2. Juni 2013 07:44
    • Tag als Antwort aufgehoben ottilie Sonntag, 2. Juni 2013 07:44
    Donnerstag, 30. Mai 2013 18:59
  • Hallo Ottilie,

    Wenn ich aber das DataSet aktualisieren möchte mit tableadapter.Fill kommt folgende Fehlermeldung:

    An attempt to attach an auto-named database for file C:\Users\Ottilie\Documents\Visual Studio 2012\Projects\RiskAnalyzer\RiskAnalyzerTest\bin\Debug\RiskAnalyzerDB.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.

    das ist vermutlich doppelt gemoppelt: Wenn ich mich recht aus dem anderen Thread erinnere, baust Du für den Massenimport eine eigene Verbindung auf. Darin wird die mdf-Datendatei (welche genau?) angehängt. Wenn Du nun den TableAdapter deine Datentabelle füllst, wird eine zweite Verbindung hergestellt und darin wird nochmals versucht die gleichnamige Datendatei anzuhängen, daher die Fehlermeldung von oben. Eine einzige SqlConnection müßte das Problem lösen.

    Desgleichen: Du arbeitest mit  zwei MDF-Datenbankdateien. Eine im Projkektpfad, die anderen im Bin-Ausgabepfad. Der Sinn der Projekt-Datenbank ist es, Änderungen an der Datenbank während der Entwicklung permanent zu speichern. Daher ist die Standardeinstellung für "In Ausgabeverzeichnis kopieren" auf "immer kopieren" gesetzt. Die Logik ist also: In der Projekt-DB änderst Du das Schema, bei der Projekterstellung wird die geänderte MDF in den Bin-Pfad kopiert, von wo aus deine Anwendung mit der MDF arbeiten kann (quasi wie mit einer eingebetteten DB). Du möchtest ja am Ende des Entwicklungszyklus nicht das Projekt sondern deine Anwendung verteilen. Das bedeutet aber, dass deine Anwendung nicht die Projekt-MDF, sondern die Bin-MDF attachen muss, und zwar nur ein einziges Mal.

    In meinem Setting, habe ich die MDF-Datei weder in persönlichen Ordner des Benutzers, noch im Bin-Verzeichnis belassen, weil zum einen die MDF-Datei anders als eine Access-MDB nicht einfach als Dokumentdatei verteilbar ist, zum anderen die Benutzung nicht auf einen Benutzer beschränkt bleiben sollte. Daher schien mir Application.CommonAppDataPath eine gute lokale Lösung zu sein.

    Desweiteren: Es hat den Anschein, dass Du eine WPF- und keine Windows Forms-Anwendung erstellst.  Bei Path.Combine, handelt es sich um den System.IO-Namensraum, da solltest Du keine Probleme bekommen. Und Application.CommonAppDataPath logiert im System.Windows.Forms-Namensraum, den Du in einer WPF-Anwendung nicht wirklich brauchst. Du kannst aber zum einen direkt auf Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) zugreifen, zum anderen tut auch das in der Verbindungszeichenfolge angegebene |DataDirectory| gute Dienste, wenn Du's in Zusammenhang mit AppDomain.SetData("DataDirectory", objValue)- verwendest.

    Wichtig ist nur, dass Du dich immer auf eine einzige MDF beziehst. SqlBulkCopy hat übrigens einen Konstruktor der eine SqlConnection als Argument akzeptiert (die Verbindung muss vorher geöffnet werden) und die Methode WriteToServer akzeptiert auch eine stark typisierte Tabelle, so wie sie z.B. durch den Designer erstellt wurde. Damit hast Du gute Karten für dein Vorhaben.

    Gruß
    Marcel

    • Als Antwort markiert ottilie Sonntag, 2. Juni 2013 07:44
    Freitag, 31. Mai 2013 09:20
    Moderator
  • Hallo Marcel,

    vielen Dank für Deine ausführliche Antwort. Dadurch wird mir einiges klarer.

    Außerdem noch ein ganz herzliches Dankeschön für Deine intensiven Mühen mir in Sachen SQLServer auf die Sprünge zu helfen.

    Gruß

    Ottilie

    Samstag, 1. Juni 2013 06:49
  • Hallo Ottilie,

    Gerne. Sollte dir eines der Postings bei der Lösung deines Problems geholfen haben, markiere es bitte als Antwort.

    Gruß
    Marcel

    Samstag, 1. Juni 2013 09:20
    Moderator