Benutzer mit den meisten Antworten
Update SQL Datenbankdatei über SqlDataAdapter

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);
}
}
}
- Bearbeitet Andreas Bauer2 Montag, 9. August 2010 16:40 Formatierung
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
- Als Antwort markiert Andreas Bauer2 Montag, 16. August 2010 07:13
-
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
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
-
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
-
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 dannmasterDataAdapter.Update(data);
Viele Grüße Andreas- Bearbeitet Andreas Bauer2 Donnerstag, 12. August 2010 19:07 Zeile fehlte
-
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
-
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
-
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&endeBild B
http://www1.minpic.de/bild_anzeigen.php?id=120026&key=31647826&endeGrüße Andreas
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
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
--------------------------- -
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
- Als Antwort markiert Andreas Bauer2 Montag, 16. August 2010 07:13
-
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
-
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
-
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
-
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
-
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
-
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