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.
Und wo legst Du da in "btn_Update_Bearbeitung_Adressen_Click" an?
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
???
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.
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.
Warum benutzt Du nicht, wie hier ständig erklärt den MySqlConnector von MySql?
Schau mal in der Hilfe nach CommandBuilder.
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();
}
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!”
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...
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
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...
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();
}
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...
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....
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 !
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...
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...
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 ) 😉
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
@ 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
@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
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