none
Update SQL Datenbankdatei über SqlDataAdapter RRS feed

  • Frage

  • Hallo,

     kann mir bitte jemand mitteilen, wo hier der Fehler ist?

     

    http://www1.minpic.de/bild_anzeigen.php?id=119691&key=90780188&ende

    http://www1.minpic.de/bild_anzeigen.php?id=119692&key=77439128&ende

     

     

    DataSet

    Aktualisieren: TableMapping['Table'] oder DataTable 'Table' kann nicht gefunden werden.

     

    DataTable

    "Das Objekt des Typs System.Data.DataSet kann nicht in Typ System.Data.DataTable umgewandelt werden."

     

                    // Create a DataSet.

                    DataSet data = new DataSet ();

     

                    // Bind the master data connector to the Customers table.

                    masterBindingSource.DataSource = data;

                    masterBindingSource.DataMember = "Customers" ;

     

    Ich weise dem BindingSource das Dataset zu.

     

    Jetzt will ich halt updaten. Beide Fälle gehen nicht.

            private void tsBSave_Click(object sender, EventArgs e)

             {

               //masterDataAdapter.Update((DataSet)masterBindingSource.DataSource);

               //detailsDataAdapter.Update((DataSet)detailsBindingSource.DataSource);

               masterDataAdapter.Update((DataTable )masterBindingSource.DataSource);

                detailsDataAdapter.Update((DataTable )detailsBindingSource.DataSource);

            }

     

    P.S. Das muss ich noch so lassen, da ich keinen SQL Express Server installiert habe.

                    string help2;

                    help2 = string .Format("Data Source=.\\SQLEXPRESS;AttachDbFilename=\"C:\\_Prog\\ \\MasterDetail\\NORTHWIND.MDF\";Integrated Security=True;Connect Timeout=10;User Instance=True" );

                    connectionString = help2;

     

    Grüße Andreas

     

     

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Linq;

    using System.Text;

    using System.Windows.Forms;

     

     

    using System.Data.SqlClient;

     

     

    namespace MasterDetail

    {

        public partial class Form1 : Form

        {

         //   private DataGridView masterDataGridView = new DataGridView();

         //   private BindingSource masterBindingSource = new BindingSource();

         //   private DataGridView detailsDataGridView = new DataGridView();

         //   private BindingSource detailsBindingSource = new BindingSource();

     

            SqlDataAdapter masterDataAdapter;

            SqlDataAdapter detailsDataAdapter;

     

     

            public Form1()

            {

                InitializeComponent();

               //  masterDataGridView.Dock = DockStyle.Fill;

               // detailsDataGridView.Dock = DockStyle.Fill;

     

            //    SplitContainer splitContainer1 = new SplitContainer();

            //    splitContainer1.Dock = DockStyle.Fill;

            //    splitContainer1.Orientation = Orientation.Horizontal;

            //    splitContainer1.Panel1.Controls.Add(masterDataGridView);

            //    splitContainer1.Panel2.Controls.Add(detailsDataGridView);

     

            //    this.Controls.Add(splitContainer1);

            //    this.Load += new System.EventHandler(Form1_Load);

                this .Text = "DataGridView master/detail demo" ;

            }

     

            private void Form1_Load(object sender, EventArgs e)

            {

                // Bind the DataGridView controls to the BindingSource

                // components and load the data from the database.

                masterDataGridView.DataSource = masterBindingSource;

                detailsDataGridView.DataSource = detailsBindingSource;

     

     

                GetData();

     

                // Resize the master DataGridView columns to fit the newly loaded data.

                masterDataGridView.AutoResizeColumns();

     

                // Configure the details DataGridView so that its columns automatically

                // adjust their widths when the data changes.

                detailsDataGridView.AutoSizeColumnsMode =  DataGridViewAutoSizeColumnsMode .AllCells;

     

             }

     

            private void GetData()

            {

                try

                {

                    // Specify a connection string. Replace the given value with a

                    // valid connection string for a Northwind SQL Server sample

                    // database accessible to your system.

                    String connectionString =

                        "Integrated Security=SSPI;Persist Security Info=False;" +

                        "Initial Catalog=Northwind;Data Source=localhost" ;

     

                    string help2;

                    help2 = string .Format("Data Source=.\\SQLEXPRESS;AttachDbFilename=\"C:\\_Prog\\ \\MasterDetail\\NORTHWIND.MDF\";Integrated Security=True;Connect Timeout=10;User Instance=True" );

                    connectionString = help2;

     

                    SqlConnection connection = new SqlConnection (connectionString);

     

                    // Create a DataSet.

                    DataSet data = new DataSet ();

                    data.Locale = System.Globalization.CultureInfo .InvariantCulture;

     

                    // Add data from the Customers table to the DataSet.

                    masterDataAdapter = new

                        SqlDataAdapter ("select * from Customers" , connection);

                    masterDataAdapter.Fill(data, "Customers" );

     

                    // Add data from the Orders table to the DataSet.

                    detailsDataAdapter = new

                        SqlDataAdapter ("select * from Orders" , connection);

                    detailsDataAdapter.Fill(data, "Orders" );

     

                   // northwindDataSet.

     

                  

     

                     // Establish a relationship between the two tables.

                    DataRelation relation = new DataRelation ("CustomersOrders" ,

                        data.Tables["Customers" ].Columns["CustomerID" ],

                        data.Tables["Orders" ].Columns["CustomerID" ]);

                    data.Relations.Add(relation);

     

                    // Bind the master data connector to the Customers table.

                    masterBindingSource.DataSource = data;

                    masterBindingSource.DataMember = "Customers" ;

     

                    // Bind the details data connector to the master data connector,

                    // using the DataRelation name to filter the information in the

                    // details table based on the current row in the master table.

                     detailsBindingSource.DataSource = masterBindingSource;

                    detailsBindingSource.DataMember = "CustomersOrders" ;

                }

                catch (SqlException )

                {

                    MessageBox .Show("To run this example, replace the value of the " +

                        "connectionString variable with a connection string that is " +

                         "valid for your system." );

                }

            }

     

            private void tsBSave_Click(object sender, EventArgs e)

            {

               //masterDataAdapter.Update((DataSet)masterBindingSource.DataSource);

               //detailsDataAdapter.Update((DataSet)detailsBindingSource.DataSource);

     

               masterDataAdapter.Update((DataTable )masterBindingSource.DataSource);

               detailsDataAdapter.Update((DataTable )detailsBindingSource.DataSource);

            }

        }

    }

     

    Montag, 9. August 2010 16:38

Antworten

  • Hallo,

    2008er Versionen:

    http://cid-d5e5bd21dbf5e4e9.office.live.com/self.aspx/ng^_demo/ng^_Fragen/datatest.zip

    Sind auf AnyCpu eingestellt, wenn Du ein 64bit System nutzt, musst Du sie recompilieren gegen die x86 er Plattform, wegen OleDB (nicht für 64bit verfügbar).

    Viele Grüße,

      Thorsten

    Samstag, 14. August 2010 15:07
  • Hallo Andreas nochmals,

    ich habe gerade gesehen, in dem Beispiel "datatestProg" hatte ich den Pfad falsch aufgelöst (und die connection nicht explizit geöffnet - das habe ich auch geändert). Es hat zwar funktioniert, weil die db-Datei auf "immer kopieren" stand, ich habe den Pfad aber jetzt nochmal angepasst, damit es stimmt.

    Viele Grüße,

      Thorsten

    • Als Antwort markiert Andreas Bauer2 Donnerstag, 19. August 2010 06:03
    Mittwoch, 18. August 2010 20:57

Alle Antworten

  •  

    http://www1.minpic.de/bild_anzeigen.php?id=119691&key=90780188&ende

    http://www1.minpic.de/bild_anzeigen.php?id=119692&key=77439128&ende


    Hallo,

    private void tsBSave_Click(object sender, EventArgs e)

            {

               //masterDataAdapter.Update((DataSet)masterBindingSource.DataSource);

               //detailsDataAdapter.Update((DataSet)detailsBindingSource.DataSource);

     

               masterDataAdapter.Update((DataTable )masterBindingSource.DataSource);

               detailsDataAdapter.Update((DataTable )detailsBindingSource.DataSource);

            }

    es ja nur um das hier. Einen kleinen Tipp wäre sehr nett.

    Andreas

    Mittwoch, 11. August 2010 04:26
  • Hallo Andreas,

    die Fehlermeldung aus dem ersten Bild sagt doch eigentlich schon alles.

    Deine masterBindingSource.DataSource ist offensichtlich keine DataTable, sondern ein DataSet. Aber Du versuchst die DataSource in eine DataTable zu konvertieren/casten. Die DataSource ist das DataSet, der DataMember dann die jeweilige Tabelle.

    http://msdn.microsoft.com/de-de/library/system.data.common.dbdataadapter.update(v=VS.80).aspx

    Viele Grüße,

      Thorsten

    Donnerstag, 12. August 2010 07:23
  • Deine masterBindingSource.DataSource ist offensichtlich keine DataTable, sondern ein DataSet. Aber Du versuchst die DataSource in eine DataTable zu konvertieren/casten. Die DataSource ist das DataSet, der DataMember dann die jeweilige Tabelle.

    http://msdn.microsoft.com/de-de/library/system.data.common.dbdataadapter.update(v=VS.80).aspx

     


    Hallo Thorsten,

    ja ich habe es ja schon als Dataset gecastet auch ohne Erfolg.

     private void tsBSave_Click(object sender, EventArgs e)
            {
               masterDataAdapter.Update((DataSet)masterBindingSource.DataSource);
               detailsDataAdapter.Update((DataSet)detailsBindingSource.DataSource);
               //masterDataAdapter.Update((DataTable )masterBindingSource.DataSource);
               //detailsDataAdapter.Update((DataTable )detailsBindingSource.DataSource);
            }

    ok;-) dann müsste ich das

    SqlDataAdapter ("select * from Customers" , connection);                masterDataAdapter.Fill(data, "Customers" );

    dataset, sprich data übergeben?

    masterDataAdapter.Update((DataSet)data);
    ohne casten dann

    masterDataAdapter.Update(data);


    Viele Grüße Andreas

    • Bearbeitet Andreas Bauer2 Donnerstag, 12. August 2010 19:07 Zeile fehlte
    Donnerstag, 12. August 2010 19:06
  • Naja,

    > masterBindingSource.DataSource = data;

    Somit ist ja beides das Gleiche 

    masterDataAdapter.Update((DataSet)masterBindingSource.DataSource); 
    
    

    und

    masterDataAdapter.Update((DataSet)data);
    

    Was funktioniert denn damit nicht? Gibt es eine Fehlermeldung, oder wird nur nicht upgedatet, ohne Fehler? Eventuell fehlt dann ein CommandBuilder (?)

    http://msdn.microsoft.com/de-de/library/system.data.common.dbcommandbuilder.aspx

    Viele Grüße,

      Thorsten

    Freitag, 13. August 2010 15:00
  • Hallo nochmals,

    Mir fällt da noch etwas ein, was gerne übersehen wird, besonders bei Acces, SqlCe etc Datenbanken:

    Die Datenbankdatei. Wird diese ins Projektausgabeverzeichnis kopiert? Dann sind die updates natürlich nur in diese Datei geschrieben und bei jedem Buildvorgang wird dann die frühere Datenbakdatei wieder dorthin kopiert.

    Viele Grüße

      Thorsten

    Freitag, 13. August 2010 16:08
  • Was funktioniert denn damit nicht? Gibt es eine Fehlermeldung, oder wird nur nicht upgedatet, ohne Fehler? Eventuell fehlt dann ein CommandBuilder (?)

    Hallo,

    http://msdn.microsoft.com/de-de/library/z1z2bkx2(v=VS.80).aspx

    geht halt nicht.
    Bild A
    http://www1.minpic.de/bild_anzeigen.php?id=120025&key=36098016&ende

    Bild B
    http://www1.minpic.de/bild_anzeigen.php?id=120026&key=31647826&ende

    Grüße Andreas

    Freitag, 13. August 2010 16:36
  • die Datenbankdatei. Wird diese ins Projektausgabeverzeichnis kopiert? Dann sind die updates natürlich nur in diese Datei geschrieben und bei jedem Buildvorgang wird dann die frühere Datenbakdatei wieder dorthin kopiert.

    Hallo Thorsten,

    ja das ist mir auch aufgefallen. Das muss man wissen. Ich habe es jetzt anders gemacht, dennoch wäre hilfreich warum das obige nicht geht.

    Ich will ja nur Zeilen eingügen, ändern und speichern und suche eine gute verständliche Lösung.

    siehe

    http://www.materialordner.de/gWFXBXJFG1yvI5d8zTbktbyFFAMwIkhP.html

     

    Grüße Andreas

    Freitag, 13. August 2010 16:42
  • Ok,

    Bild B sagt uns, dass das TableMapping nicht korrekt ist, bzw die Tablee "Table" nicht gefunden werden kann.

    Wie heißen denn Deine DataTables im DataSet?

      foreach (DataTable dt in data.Tables)
      {
      MessageBox.Show(dt.TableName);
      }
    

    Geht das update, wenn Du direkt die DataTable zum updaten übergibst? Sowas, in etwa, wie hier:

    masterDataAdapter.Update(data.Tables[0]); 
    
    

    Viele Grüße,

      Thorsten

    Freitag, 13. August 2010 17:09
  • Hallo Andreas,

    ich habe mal zum Testen schnell ein ähnliches Projekt erstellt. Dort in Form1:

        private void Form1_Load(object sender, EventArgs e)
        {
    
          this.customersTableAdapter.Fill(this.northwindDataSet.Customers);
    
          this.ordersTableAdapter.Fill(this.northwindDataSet.Orders);
    
          //wirft einen Fehler, wenn der Datensatz mit dieser ID bereits vorhanden ist
          DataRow dr = this.northwindDataSet.Customers.NewRow();
          dr[0] = "ffff";
          dr[1] = "blabla";
          this.northwindDataSet.Customers.Rows.Add(dr);
    
          this.customersTableAdapter.Update(this.northwindDataSet);
        }
    

    Funktioniert hier wie erwartet: Beim ersten Aufruf wird der Datensatz hinzugefügt, beim zweiten gibt's den erwarteten Fehler.

    Viele Grüße,

      Thorsten

    Freitag, 13. August 2010 18:05
  • Geht das update, wenn Du direkt die DataTable zum updaten übergibst? Sowas, in etwa, wie hier:

    masterDataAdapter.Update(data.Tables[0]); 
    
    
    
    

     

    Hallo Thorsten, wenn ich keine Änderungen mache, tadellos.

    Namen sind da.

    http://www1.minpic.de/bild_anzeigen.php?id=120058&key=91307619&ende

    http://www1.minpic.de/bild_anzeigen.php?id=120059&key=74444752&ende

    http://www1.minpic.de/bild_anzeigen.php?id=120061&key=40462841&ende

    V2 ohne Assistent - Das Hauptproblem

    WARUM geht das nicht?

    http://www.materialordner.de/I5cHrHgBt1qcGaw49uRop9TSLthWzXQ7.html

    Version mit Wizard mehr über Formulare

    http://www.materialordner.de/6WgB7isVQ0UwMTzuFlIfXlhlrsJVlGgg.html
    Das sind 2 unterschiedliche Ansätze.

    Optimal - Musterbeispiel

    Contextmenü

    Zeile markieren, kopieren, einfügen.

    Spalte markieren, kopieren, einfügen

    Löschen, Updaten

    Was man halt so für Normal’ empfindet.

    Einfach mal die ganzen Zeilen/Spaltenwerte raus tracen.

    Dann hätte man alles.

    Grüße Andreas

     

    Samstag, 14. August 2010 11:49
  • Hallo Andreas,

    Bild2 und Bild4 weisen darauf hin, dass ein Commandbuilder (gültige update delete insert Commands) fehlt. Ich kann jetzt nicht Deine ganzen Projekte analysieren, aber ich schaue mal, ob ich bis heute Abend ein kleines Northwind Beispiel machen kann, allerdings mit der Access(OleDb)-Version.

    Viele Grüße,

      Thorsten

    Samstag, 14. August 2010 13:10
  • Hallo Andreas,

    ich habe hier:

    http://cid-d5e5bd21dbf5e4e9.office.live.com/self.aspx/ng^_demo/ng^_Fragen/datatestDesigner.zip

    ein kleines Northwind-Beispiel (ohne die Db) hingestellt.

    Du hast ja die Northwind.mdb (in Deinem ersten Projekt war sie enthalten). Kopiere diese Datei bitte in den Projekt-Ordner, "dahin, wo auch die Datei Form1.cs ist". Dann starte das Programm, drücke Button1 und schau ins DGV unten hin, da sollte ein neuer Datensatz sein. Zur Probe drücke Button1 nochmal und schaue aufs label1.

    Ich mache nachher noch ein Beispiel ohne Designer-Unterstützung.

    Viele Grüße,

      Thorsten

    Samstag, 14. August 2010 13:28
  • So,

    http://cid-d5e5bd21dbf5e4e9.office.live.com/self.aspx/ng^_demo/ng^_Fragen/datatestProg.zip

    Hier ist das andere Beispiel, die Datenbank musst Du aber wieder hineinkopieren.

    Bitte beachte das Object OleDbCommandBuilder _objCmdBld. Dies ist nötig, um automatisch die notwendigen SQL-Commands zu generieren. Wenn Du es weglässt kommt der Fehler mit dem "gültigen Updatecommand".

    http://msdn.microsoft.com/de-de/library/system.data.common.dbcommandbuilder(VS.80).aspx

    Viele Grüße,

      Thorsten

    Samstag, 14. August 2010 13:57
  • Hallo Thorsten,

    sorry ich habe nur VS2008. Wärs möglich du speicherst es als VS2008?

    Danke im Voraus!

    Grüße Andreas

    ---------------------------
    Microsoft Visual Studio
    ---------------------------
    Die ausgewählte Datei ist eine Projektmappendatei, wurde jedoch mit einer neueren Version dieser Anwendung erstellt und kann nicht geöffnet werden.
    ---------------------------
    OK  
    ---------------------------

    Samstag, 14. August 2010 14:41
  • Hallo,

    2008er Versionen:

    http://cid-d5e5bd21dbf5e4e9.office.live.com/self.aspx/ng^_demo/ng^_Fragen/datatest.zip

    Sind auf AnyCpu eingestellt, wenn Du ein 64bit System nutzt, musst Du sie recompilieren gegen die x86 er Plattform, wegen OleDB (nicht für 64bit verfügbar).

    Viele Grüße,

      Thorsten

    Samstag, 14. August 2010 15:07
  • http://cid-d5e5bd21dbf5e4e9.office.live.com/self.aspx/ng^_demo/ng^_Fragen/datatest.zip


    Hallo Thorsten, ja das war hilfreich.

    a) kann da jeder über Windows Live hochladen?

    b) ich brauche also

    private

     

    OleDbDataAdapter _objAdapter = null;

     

    private OleDbConnection _conn = null;

     

    private DataSet _ds = null;

     

    private OleDbCommandBuilder _objCmdBld = null;   XXXX WICHTIG XXXXX

    Kann man das dann adaptieren oder gilt es nur für OLE ?

    c) Du hast in der 2010 Version 2 Beispiele bereitgestellt.

        Wenn Du meinst es bringt was, gerne noch als 2008 er Version.

    d) Die Frage ist beantwortet.

        Wenn du dennoch einen Tipp hast ContextMenü, kopieren, einfügen, löschen wäre ich erfreut.

    Schöner Tag...

    Andreas

     

    Montag, 16. August 2010 07:13
  • a) kann da jeder über Windows Live hochladen? 

    private OleDbCommandBuilder _objCmdBld = null;   XXXX WICHTIG XXXXX

    Kann man das dann adaptieren oder gilt es nur für OLE ?

    c) Du hast in der 2010 Version 2 Beispiele bereitgestellt.

        Wenn Du meinst es bringt was, gerne noch als 2008 er Version.

    Hallo Andreas,

    Microsoft stellt jedem 25GB Online-Speicher zur Verfügung. Du selbst kannst dann festlegen, was davon öffentlich sichtbar ist und was privat ist.

    Siehe:

    http://www.windowslive.de/skydrive/

    Ich habe z.B. immer mal ein paar Bilder öffentlich, Testbilder für das, was ich so mache. Wenn Du Dich also für einen Kater in verschiedenen Ansichten interressierst:

    http://cid-d5e5bd21dbf5e4e9.photos.live.com/browse.aspx/%c3%96ffentlich

    Den CommandBuilder gibt's natürlich auch für die anderen Data-Provider, ist ja im Bereich Data.Common zu finden.

    Siehe die erste Zeile in:

    http://msdn.microsoft.com/en-us/library/system.data.common.aspx

    Die 2008er Versionen sind beide im zip-Archiv. Ich hatte sie auf die Schnelle zusammengefasst.

    Viele Grüße,

      Thorsten

    Montag, 16. August 2010 15:32
  • http://www.windowslive.de/skydrive/

    Ich habe z.B. immer mal ein paar Bilder öffentlich, Testbilder für das, was ich so mache. Wenn Du Dich also für einen Kater in verschiedenen Ansichten interressierst

    ja ok;-) nicht schlecht. Das macht ein C# Algorithmus, oder? Bist Du Mathematiker?

    Siehe:

    http://www.windowslive.de/skydrive/

    ja stimmt, wußte ich nicht. Danke.

    Kurz nochmals zu dem.

        Wenn du dennoch einen Tipp hast ContextMenü, kopieren, einfügen, löschen wäre ich erfreut.

    Grüße Andreas

    Montag, 16. August 2010 17:02
  • Hallo Andreas,

    naja, Mathematik ist für mich jedenfalls sehr interressant :-)

    ################# Update:

    Die meisten dieser Probleme sind aber mit Schulmathematik bequem zu lösen. Die Problematik erhöht sich hier eher durch die Komplexität der Vorgänge.

    #################

    Mit Deiner anderen Frage solltest Du vielleicht einen neuen Thread beginnen, da dieser hier schon recht lang ist, beantwortet ist und es ja auch eine andere Frage ist.

    Da könntest Du dann auch Mal spezifizieren, was denn kopiert, eingefügt etc werden soll und in welchem Zusammenhang das ContextMenu stehen soll.

    Viele Grüße,

      Thorsten

    Montag, 16. August 2010 17:32
  • Hallo Andreas nochmals,

    ich habe gerade gesehen, in dem Beispiel "datatestProg" hatte ich den Pfad falsch aufgelöst (und die connection nicht explizit geöffnet - das habe ich auch geändert). Es hat zwar funktioniert, weil die db-Datei auf "immer kopieren" stand, ich habe den Pfad aber jetzt nochmal angepasst, damit es stimmt.

    Viele Grüße,

      Thorsten

    • Als Antwort markiert Andreas Bauer2 Donnerstag, 19. August 2010 06:03
    Mittwoch, 18. August 2010 20:57
  • ich habe gerade gesehen, in dem Beispiel "datatestProg" hatte ich den Pfad falsch aufgelöst (und die connection nicht explizit geöffnet - das habe ich auch geändert). Es hat zwar funktioniert, weil die db-Datei auf "immer kopieren" stand, ich habe den Pfad aber jetzt nochmal angepasst, damit es stimmt.

    Guten Morgen Thorsten,

    Danke, ich lade es mir nochmals runter.

    Grüße Andreas

    Donnerstag, 19. August 2010 06:04