adapter.Update(data);

Die Programmiersprache C# und Programmierung im .NET Framework/Mono
Antworten
AnFan
Beiträge: 12
Registriert: Fr Jan 02, 2015 2:05 pm

adapter.Update(data);

Beitrag von AnFan » Sa Jan 17, 2015 11:18 pm

... macht immer einen Error.
(bin blutiger Anfänger in der Materie; wie in der Vorstellung erwähnt, habe ich aber sonst schon so einiges programmiert, allerdings nur auf Laien-Ebene).

Ich komme und komme und komme nicht drauf, woran es liegt. Würde nur gerne mal "life" erleben, wie es so ist, wenn man
  • eine DataConnection aufbaut,
  • und einiges wenige in einer DataBase ändert oder (in diesem Fall) hinzufügt, - bevor ich dann zum großen Coup übergebe und mein (etwas größeres) Programm schreibe ...
(Hätte einer von Euch ein fertiges Beispiel, aber ein absolut fertiges, also mit allem Pi-Pa-Po?)
Danke für jede Art von Hilfe :)

P.S.:
  • 1. "static void Main" steht an anderer Stelle (in einem anderen Modul) und funktioniert gut.
  • 2. Ich habe heute ewig lange herumschustern müssen, bis ich überhaupt dieses Stückchen Code beinander hatte. Ich verwende Visual Studio Express 2008.

Code: Alles auswählen

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.SqlServerCe;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: Diese Codezeile lädt Daten in die Tabelle "versuch_DatenbankDataSet.Personen". Sie können sie bei Bedarf verschieben oder entfernen.
            this.personenTableAdapter.Fill(this.versuch_DatenbankDataSet.Personen);
            Rumprobieren Ausfuehren = new Rumprobieren();
            Ausfuehren.ConnectListAndSaveSQLCompactExample();
        }
    }
    abstract class MeineMethoden
    {
        public void ConnectListAndSaveSQLCompactExample()
        {
            // Create a connection to the file ....sdf in the program folder
            string dbfile = new System.IO.FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).DirectoryName + "\\Versuch_Datenbank.sdf";
            SqlCeConnection connection = new SqlCeConnection("datasource=" + dbfile);

            // Read all rows from the table test_table into a dataset (note, the adapter automatically opens the connection)
            SqlCeDataAdapter adapter = new SqlCeDataAdapter("select * from Personen", connection);

            //
            // habe auch das probiert: 
            // adapter.InsertCommand = new SqlCeCommand("INSERT INTO Personen",connection);
            // habe auch noch das probiert: SqlCeCommand blabla = adapter.InsertCommand;
            //

            DataSet data = new DataSet();
            adapter.Fill(data);

            // Add a row to the test_table (assume that table consists of a text column)
            data.Tables[0].Rows.Add(new object[] { "New row added by code" });

            // Save data back to the databasefile
            adapter.Update(data);

            // Close 
            connection.Close();
        }
    }
    class Rumprobieren : MeineMethoden
    {
        static void nochirgendwas()
        {
            Rumprobieren Ausfuehren = new Rumprobieren();
            Ausfuehren.ConnectListAndSaveSQLCompactExample();
        }
    }
}

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8486
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: adapter.Update(data);

Beitrag von Xin » Sa Jan 17, 2015 11:46 pm

AnFan hat geschrieben:... macht immer einen Error.
(bin blutiger Anfänger in der Materie; wie in der Vorstellung erwähnt, habe ich aber sonst schon so einiges programmiert, allerdings nur auf Laien-Ebene).
Ich muss Dich bitten, folgendes aus der FAQ zu lesen: Frage Formulieren
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

AnFan
Beiträge: 12
Registriert: Fr Jan 02, 2015 2:05 pm

Re: adapter.Update(data);

Beitrag von AnFan » So Jan 18, 2015 1:16 am

Entschuldigung, meine Frage war nicht klar formuliert.
(es scheint nicht mehr möglich zu sein, meine ursprüngliche Nachricht zu editieren und zu verbessern)

Nun, der zitierte Code wird in der Ausführung immer bei der Zeile
adapter.Update(data);
unterbrochen. Die (leider spanische) Error-Message sagt:
"Update requiere que InsertCommand sea válido cuando se pasa la colección DataRow con nuevas filas."
Auf English wäre es wohl:
"Update requires a valid InsertCommand when passed DataRow collection with new rows"

Was ist der Grund?
Für Hilfe dankbar!
AnFan

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8486
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: adapter.Update(data);

Beitrag von Xin » So Jan 18, 2015 9:49 am

AnFan hat geschrieben:Was ist der Grund?
Kann ich nicht mit Sicherheit sagen, im Prinzip kann ich nur die Übersetzung wiederholen.

Ein DataAdapter ist quasi eine Abstraktion für Datenquellen, häufig SQL.
Und in SQL benutzt man "Update" um vorhandene Zeilen zu aktualisieren und "Insert" um neue Zeilen in die Datenbank einzufügen.
Wenn Du nun neue DataRows hast und diese in Deine Datenbank einfügen willst, kannst Du keine nicht vorhandenen Zeilen aktualisieren ("updaten"). Du musst sie eben mit Insert() einfügen.
Update funktioniert nur dann, wenn Du die Zeilen vorher aus der Datenbank gelesen hast, damit die Datenbank weiß, welche Zeile überschrieben werden soll.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3083
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: adapter.Update(data);

Beitrag von cloidnerux » So Jan 18, 2015 1:25 pm

Die (leider spanische) Error-Message sagt:
Deutscher Code mit spanischen Fehlermeldungen?
Redundanz macht wiederholen unnötig.
quod erat expectandum

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: adapter.Update(data);

Beitrag von canlot » So Jan 18, 2015 1:57 pm

Betrachten wir mal den folgenden Code

Code: Alles auswählen

public class DbOp
	{
		private string table;
		private MySqlConnection con;
		private string login = 
				"SERVER=localhost;" +
				"DATABASE=test;" +
				"UID=root;" +
				"Password=;";
		private MySqlDataAdapter adapter;
		private string opString;
		
		public DbOp(string table_name)
		{
			table = table_name;
			//opString = "select * from " + table;
			opString = "select name.name, test.name from name, test where name.verweis = test.id";
			con = new MySqlConnection(login);
			adapter = new MySqlDataAdapter(opString, con);
			initCommands();
		}
		public void Fill(ref DataTable tabelle)
		{
			adapter.Fill(tabelle);
		}
		public void Fill(ref DataSet set)
		{
			adapter.Fill(set);
		}
		public void Update(ref DataTable tabelle)
		{
			
			adapter.Update(tabelle);
			//MessageBox.Show(tabelle.Rows[tabelle.Rows.Count-1][1].ToString());
		}
		public void Update(ref DataRow[] row)
		{
			adapter.Update(row);
		}
		private void initCommands()
		{
			/*
			adapter.InsertCommand = new MySqlCommand("Insert into test(id, name) values(@id, @name)", con);
			adapter.InsertCommand.Parameters.Add("@id", MySqlDbType.Int32);
			adapter.InsertCommand.Parameters.Add("@name", MySqlDbType.Text, 65535, "name");
			*/
			string insert_string = "BEGIN; INSERT INTO test(name) VALUES(@name); INSERT INTO name (name, verweis)  VALUES(@name1,LAST_INSERT_ID()); COMMIT;";
			//adapter.InsertCommand = new MySqlCommand("insert into " + table + "(name) values(@name)", con);
			adapter.InsertCommand = new MySqlCommand(insert_string, con);
			adapter.InsertCommand.Parameters.Add("@name", MySqlDbType.Text, 65535, "name");
			adapter.InsertCommand.Parameters.Add("@name1", MySqlDbType.Text, 65535, "name1");
		}
		
	}
Das habe ich mal zum testen geschrieben.

MySqlAdapter funktioniert hier als Schnittstelle von der Datenbank zum Programm.
Wie du siehst kann der Adapter die Datentypen verwalten, er kann sie füllen mit der Methode Fill() oder abgleichen mit der Methode Update(), zuerst brauchst du eine funktionierende Verbindung sprich Connection die man mit MySqlConnection erstellt.

In C# gibt es eine Komponente DataGridView, dort kannst du eine bestimmte Tabelle als DataSource einstellen, immer wenn der Inhalt der Komponente verändert wird kannst du adapter.Update(tabelle); aufrufen und du hast die Daten in der Datenbank, wenn es aber komplizierte Zusammenhänge zwischen den Daten gibt musst du die Anfragen spezialisieren, was im Beispiel die Funktion initCommands() tut.
Dabei bin ich mir nicht mehr sicher ob man es immer tun muss.
Unwissenheit ist ein Segen

AnFan
Beiträge: 12
Registriert: Fr Jan 02, 2015 2:05 pm

Re: adapter.Update(data);

Beitrag von AnFan » Di Jan 20, 2015 12:01 pm

vielen Dank für Eure Hilfe! Ich habe noch ein zu mangelhaftes Verständnis, insbesondere über die Verwendung von Klassen: welche ruft welche auf, etc.

Komme aber dank Eurer Hilfe einen Schritt weiter!
Übrigens: "Deutscher Code mit spanischen Fehlermeldungen?" Verschiedene Länder, verschiedene Rechner, wenig Zeit zum Programmieren ... :)

Antworten