Laden...

UpdateCommand wird nicht ausgeführt?

Erstellt von Deletemaster vor 18 Jahren Letzter Beitrag vor 18 Jahren 12.033 Views
Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 18 Jahren
UpdateCommand wird nicht ausgeführt?

Hallo zusammen,
folgendes Problem:
ich lese einen string aus einer TextBox und slektiere den dazugehörigen Datensatz

nach einer Veränderung möchte ich diesen Datensatz per Update aktualisieren.
wo liegt hier mein Fehler?

private void btn_DS_Suchen_Click(object sender, System.EventArgs e)
	{
		str_Such_Vrn = txt_Such_Vrn.Text;
			
		OdbcDataAdapter da = new OdbcDataAdapter("SELECT * FROM winners49 WHERE vrn = '" + str_Such_Vrn + "'", conn);
						
						dataGrid1.DataSource = ds;
	try
	{
								conn.Open();
								da.Fill(ds, "winners49");
	}
	catch (Exception ex)
	{
								MessageBox.Show(ex.Message);
	}

								conn.Close();

}

	private void btn_Update_Bearbeitung_Adressen_Click(object sender, System.EventArgs e)
{

	if(ds.HasChanges())
	{
	try
								{
	da.Update(ds, "winners49");
								MessageBox.Show("Update erfolgreich");
								}
								catch(Exception ex)
								{
								MessageBox.Show(ex.Message);
								}
}

}

Fehlermeldung: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

F
10.010 Beiträge seit 2004
vor 18 Jahren

Und wo legst Du da in "btn_Update_Bearbeitung_Adressen_Click" an?

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 18 Jahren

OK, klar das hatte ich vergessen, aber jetzt bekomme ich die Meldung

... Aktualisieren erfordert einen gültigen Update-Command,
wenn eine Data-Row-Auflistung mit modifizierten Zeilen weitergegeben wird"

wie muss hier das Update Command aussehen?
"UPDATE winners49 SET(feld1, feld2, feld3, feld4)VALUES(?,?,?)", conn

???

G
131 Beiträge seit 2005
vor 18 Jahren

Der müsste etwa so sein:

Update winners49 set
feld1 =@paramFeld1,
feld2 =@paramFeld2,

...

where vrn = @paramVRN;

Als Parameter müssten dann die Feldwerte übergeben werden und
als @paramVRN der str_Such_Vrn.

Tip:

Wenn du mit Visual Studio arbeitest, dann kannst du das auch dir zusammenstellen
lassen.

Tabelle im ServerExplorer auswählen und auf dein Formular ziehen. Dann über rechte Maustaste über den DataAdapter auf konfigurieren gehen und danach im Code dir das unter InitializeComponent (oder wie die funktion jetzt hieß) anschauen, wie es gemacht wird.

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 18 Jahren

Leider nutzt mir der Serverexplorer nichts, da ich keine OleDb Datenquelle nutze, sondern Odbc (Mysql)
wenn ich den inhalt von textboxsteuerelementen in die db zurückschreiben wollte könnte ich mit @arbeiten.
da ich aber den selektierten datensatz im dataGrid aktualisieren möchte geht die variante nicht.
wenn ich daten per select *
anfordere und den assistenten die commandos erstellen lasse funktioniert alles
aber ich will keine 90.000 datensätze aufrufen, sondern nur den der die bedingung erfüllt.

F
10.010 Beiträge seit 2004
vor 18 Jahren
  1. Warum benutzt Du nicht, wie hier ständig erklärt den MySqlConnector von MySql?

  2. Schau mal in der Hilfe nach CommandBuilder.

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 18 Jahren

Jetzt bekomme ich folgende Fehlermeldung:

Mysql-Syntax-Fehler?
Bei einem ähnlichen Projekt sieht das Update´Command so aus...

Code:

private void btn_DS_Suchen_Click(object sender, System.EventArgs e)
{
str_Such_Vrn = txt_Such_Vrn.Text;
			
da = new OdbcDataAdapter("SELECT anrede, vorname, nachname, strasse, plz, ort, vorwahl, telefon, status, kennung," +
"vrn, geburtsdatum, bankname, blz, konto, robinsonliste, variante_1, variante_2, spielbeginn, abschlussdatum, agent, ok, storno, b_storno, rls, kuendigung FROM winners49 WHERE vrn = '" + str_Such_Vrn + "'", conn);
						
	ds = new DataSet();
						dataGrid1.DataSource = ds;
	try
		{
								conn.Open();
								da.Fill(ds, "winners49");
	}
	catch (Exception ex)
	{
								MessageBox.Show(ex.Message);
	}
								conn.Close();
}

private void btn_Update_Bearbeitung_Adressen_Click(object sender, System.EventArgs e)
{
	da = new OdbcDataAdapter("UPDATE winners49 SET anrede, vorname, nachname, strasse, plz, ort, vorwahl, telefon, status, kennung, vrn, geburtsdatum, bankname, blz, konto, robinsonliste, variante_1, variante_2, spielbeginn, abschlussdatum, agent, ok, storno, b_storno, rls, kuendigung" +
"VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", conn);
					
cb = new OdbcCommandBuilder(da);
if(ds.HasChanges())
	try
	{
	conn.Open();
	da.Update(ds, "winners49");
//	cb.GetUpdateCommand();
								MessageBox.Show("Update erfolgreich");
								}
								catch(Exception ex)
								{
										MessageBox.Show(ex.Message);
								}
										conn.Close();
}
4.506 Beiträge seit 2004
vor 18 Jahren

Hallo DeleteMaster,

ich denke Deine Syntax von Deinem Update Befehl ist schlichtweg falsch.

Ich glaube, dass es bei einem Update nicht möglich ist, zunächst die Felder aufzuzählen, und dann die VALUES...

Ich bin der Meinung, das muss so aussehen:


UPDATE winners49 SET
   anrede = @anredeValue,
   vorname = @vornameValue,
   // ...
   kuendigung = @kuendigungValue
WHERE
   vrn = @vrnValue

Eventuell kann es für die Parameter auch '?' anstatt von '@' heißen, einfach ausprobieren. (Das sind übrigens SQL-Parameter, und sollten dann schon wie Generalissimo geschrieben hat anzuwenden sein).

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

4.221 Beiträge seit 2005
vor 18 Jahren

Dein Code als ganzes macht keinen Sinn.

Entweder verwendest Du einen Command welchen Du selber mit einem Update-Statement füllst ODER einen CommandBuilder... Wenn Du aber einen CommandBuilder verwendest, dann muss im DataAdapter ein Select gefüllt sein (nicht ein Update)

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 18 Jahren

OK hab das jetzt mal mit anrede = @anrede... versucht
allerdings ohne Value anrede = @anredeValue
jetzt bekomme ich folgende Fehlermeldung:

"Dynamische SQL-Generierung wird gegen einen SELECT-Command der keine Basistabelleninformationen zurückgibt, nicht unterstützt"

woran liegt denn diese Meldung
oder besser: wie muss ich dieser Fehlermeldung entgegenwirken?

Danke für Eure Hilfe

4.221 Beiträge seit 2005
vor 18 Jahren

Original von Deletemaster

"Dynamische SQL-Generierung wird gegen einen SELECT-Command der keine Basistabelleninformationen zurückgibt, nicht unterstützt"

Ein Update ist nun mal kein Select 🙂 Lies meinen Post

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 18 Jahren

OK auch wenn ich als Update einen select-command verwende, bekomme ich diese Fehlermeldung.
Wie muss denn nun die Aktualisierung aussehen, damit der angezeigte DS geändert wird?

Kannst du mir bitte den richtigen Ablauf zeigen?
Danke
Mein Code:

				private void btn_Update_Bearbeitung_Adressen_Click(object sender, System.EventArgs e)
				{

						da = new OdbcDataAdapter("SELECT anrede, vorname, nachname, strasse, plz, ort, vorwahl, telefon, status, kennung," +
								"vrn, geburtsdatum, bankname, blz, konto, robinsonliste, variante_1, variante_2, spielbeginn," +
								"abschlussdatum, agent, ok, storno, b_storno, rls, kuendigung FROM winners49", conn);
					
						cb = new OdbcCommandBuilder(da);
						if(ds.HasChanges())
						
								try
								{
										conn.Open();
										da.Update(ds, "winners49");
										cb.GetUpdateCommand();
										MessageBox.Show("Update erfolgreich");
								}
								catch(Exception ex)
								{
										MessageBox.Show(ex.Message);
								}
										conn.Close();
				}
4.221 Beiträge seit 2005
vor 18 Jahren

Schmeiss mal Dein ODBC-Teil weg und nimm nen vernünftigen Provider für MySQL (die Performance wird es dir danken)

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 18 Jahren

OK hab mir das Teil runtergeladen...
jetzt möchte ich aber erstmal die Update Funktion hinbekommen
sämtliche Verbindungen in meinem projekt laufen derzeit noch über ODBC 3.51
die Connection später anpassen dürfte nicht soo schwierig sein...?
Wichtig ist jetzt, daß ich der Fehlermeldung entgegenwirken kann.
Danke für Deine Hilfe....

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 18 Jahren

hab den MysqlConnector installiert, bei den Verweisen hab ich MyslData hinzugefügt
aber
using System.Data.MysqlClient;
gibt es nicht !

Deshalb würde ich gern erstmal den Update-Befehl Funktionstüchtig haben.

OK using System MySql.Data.MySqlClient; // erledigt

aber ich brauche die Hilfe für den Update-Befehl immer noch !

4.221 Beiträge seit 2005
vor 18 Jahren

So und jetzt ziehst Du dir mal so einen MySQLDataAdapter auf ein Form.

Konfigurierst den SelectCommand im Designer und schaust Dir an was der Designer für Code schreibt.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 18 Jahren

Dazu benötige ich aber die MySqlConnection.
Den dazugehörigen ConnectionString kenne ich aber nicht.
und den Adapter kann ich nicht mit einem Assi konfigurieren.
im Designer kann ich nur "Keine" auswählen!

OK Verbindung erfolgreich....
kann weiter gehen...

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 18 Jahren

So nachdem alle "deutschsprachigen" Fehlermeldungen keine wirkliche Abhilfe geschaffen haben, habe ich mit dem MySqlConnector eine "englischsprachige" bekommen.
Die da "sagte" ... can't.... with no unique...
AHA Heureka
ich habe keinen Primärschlüssel gesetzt !
Das heißt der PK ist beim Export von Access zu Mysql "verlorengegenagen"
Jetzt funktioniert es.....

Danke für Eure Hilfe.

(Ich denke diese simple Sache habt ihr vorrausgesetzt, damit alles ordungsgemäß funktioniert ) 😉

J
4 Beiträge seit 2006
vor 18 Jahren

wie sieht denn nun deine endgültige, funtkionierende lösung aus?

ich kämpfe gerade mit einem ähnlichen problem und bin auf der suche nach einer hilfe auf diesen beitrag gestoßen.

kannst du mir kurz schreiben, wie du nun das update machst.

danke
Janos

264 Beiträge seit 2006
vor 18 Jahren

@ Janos
Hi ich hatte das gleiche Problem, nur mit MSSQL und C#.

Ich habe mir eine SQLConnection geschrieben und hab über den Assi ein SQLDataAdapter erstellt, danach habe ich mir ein DataSet geschrieben. Ich konnte wunderbar Daten in die Datenbank schreiben, nur änderungen und löschanfragen wollte er nicht bearbeiten. Habe mit dem Comandbuilder gearbeitet, hat alles nix genutzt.

Mein Problem war das ich kein Primärschlüssel in der Tabelle die ich bearbeiten wollte gesetzt habe. Danach hat es ohne Probleme geklappt.

Hast du ein Primärschlüssel vergeben?

MFG

J
4 Beiträge seit 2006
vor 18 Jahren

@King-Malkav

das mit dem Primary-key klappt nun. ich bekomme jetzt zumindest einmal keine fehlermeldung mehr.
allerdings wird aber das update auch nicht durchgeführt.

ich bin mir sicher, dass dies am updateCommand liegt. wie muss das aussehen?

danke für die hilfe,

Janos

264 Beiträge seit 2006
vor 18 Jahren

Am einfachsten ist es wenn du den DataAdapter per Assi machen lässt, der erzeugt dir dann die richtigen Commands.

Wie genau meiner Aussieht kann ich im Moment nicht sagen, da ich erst in 2 Wochen wieder an meiner Entwicklungsumgebung im Betrieb kann. Im Moment hab ich nämlich frei und bereite mich auf meine Microsoft Prüfung zum MCSA vor (70-290 falls es dir was sagt).

MFG