Hallo Peter,
ich habe vor mehrere Forms zu entwickeln, auf deren Seiten dann Kundendaten eingegeben werden können, bzw. ausgelesen werden können.
Ich möchte verhindern, daß ein "Fremder" Zugang zu den Seiten hat in dem er einfach die url um die Zielseite erweitert. Diese könnte ihm bekannt geworden sein.
Da ich allerdings auch hier mit den Sessions arbeite und aufrufe würde es schwer werden an Daten zu kommen.
private void agentur_laden()
{
string str_username = (string)Session["login"];
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT agentur_name FROM agenturen INNER JOIN users ON(agenturen.agentur_id = users.agentur_id) WHERE benutzername = '" + str_username + "'";
MySqlDataReader reader = cmd.ExecuteReader();
ddl_Agentur.Items.Clear();
while (reader.Read())
{
ddl_Agentur.Items.Add(reader["agentur_name"].ToString());
}
reader.Close();
}
Auch hier würde der "Fremde" nichts zu sehen bekommen, da ja nichts in der Session steht.
Ich habe zwar schon einige Vorstellungen wie ich die anderen Seiten gestalte, aber ich denke das hier die Abfrage, "kommt der Aufruf von der Seite XY" irgendwo bestimmt eine Wichtige Rollte spielen kann / wird.
Und ich werde immer noch auf die Seite nixda.aspx geleitet...
Es wird doch aber geprüft bool ob in dem string:
bool loggedIn;
if (!bool.TryParse("login".ToString(), out loggedIn) || !loggedIn)
{
überhaupt etwas steht und es wird doch true zurückgegeben...
Gruß Frank
Ergänzung:
Im Debugger wird:
loggedIn false bool
ausgegeben.
Soweit es die Sessions betrifft funktioniert auch alles.
Ich kann auf der Zielseite mit meinen Daten weiterarbeiten.
login
if (str_username == benutzername && str_kennwort == password && gruppe == "1")
{
Session.Add("login", str_username);
Response.Redirect("kunde_neu.aspx");
}
kunde_neu.aspx
private void Begruessung()
{
string str_login = (string)Session["username"];
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT anrede, nachname FROM users WHERE benutzername = '" + str_login + "'";
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
lbl_useranrede.Text = reader["anrede"].ToString();
lbl_Sessionuser.Text = reader["nachname"].ToString();
}
reader.Close();
}
Das funktioniert doch auch.
Mein Problem:
Ich möchte, daß beim Aufruf der Seite kunde_neu.aspx geprüft wird, ob der Aufruf von der login-Seite erfolgte:
Response.Redirect("kunde_neu.aspx");
ich kann wahrscheinlich auch nur prüfen, ob der Session-String leer ist.
Und warum werde ich nun im Code:
string login = (string)Session["login"].ToString();
bool loggedIn;
if (!bool.TryParse("login".ToString(), out loggedIn) || !loggedIn)
{
Response.Redirect("nixda.aspx");
}
trotz erfolgreicher Anmeldung auf die Seite nixda.aspx geleitet?
Diese Frage hatte ich ja nun schon einige Male gestellt aber nicht mal im Ansatz eine Erklärung dafür bekommen.
Es ist echt schade, daß dieser Thread so lang geworden ist.
Hat die Seite im IIS ein virtuelles Verzeichnis?
Hallo Peter,
also es liegen definitiv KEINE Fehlermeldungen bei meinem benutztem Code vor.
auch ein:
if (!bool.TryParse("login".ToString(), out loggedIn) || !loggedIn)
bringt keine Fehlermeldung.
Warum also werde ich trotz erfolgreicher Anmeldung auf die Seite nixda.aspx katapultiert.
Wenn man keine Fehlermeldung mehr erhält, kann man auch nirgends nachschauen.
Hilfreicher wäre es, nachdem ich geschrieben habe, daß ich den Code nicht nachvollziehen kann, ihn mir vielleicht zu erläutern. Das ist auch eine Art von lernen. So kann ich bei einem ähnlichem Problem vielleicht davon ableiten und brauche niemanden zu "nerven".
Aber ich habe mir nun mal ein größeres Projekt vorgenommen und stehe am Anfang und würde gern von Anfang an sauber und richtig programmieren. Das fängt nun mal bei der Sicherheit an.
In meinen vorigen Projekten habe ich alles sehr einfach realisiert, aber erst wenn man etwas "fertig" hat und benutzt sieht man was man besser machen /ändern kann.
Sorry, zu früh gefreut, ich habe lediglich geprüft, ob ich in die Adresszeile: .../kunde_neu.aspx
eingeben kann ohne mich vorher anzumelden.
Dann lande ich auf der Seite: nixda.aspx
so sollte es sein.
Aber wenn ich mich korrekt anmelde und vorher zu meiner Seite kunde_neu.aspx geleitet wurde, werde ich jetzt trotzdem zu nixda.aspx geleitet?
Ist also noch nicht komplett funktionstüchtig... 😭
An was liegt jetzt dieses?
Danke für die Hilfe
Hallo Peter, ich habs gelesen.
- (Session.Add("username", txt_username) , keine Controls oder komplexere Objekte in der Session speichern. (Ausnahmen bilden hier natürlich reine Business Objects)
Also hier -> txt_username.Text!
Wenn ich wüsste, WIE ich WAS ändern muss, würde ich nicht ständig das gleiche fragen.
Kurze Zeit später:
Nach ein bisschen probieren, hab ich hinbekommen, weiß aber nicht, warum ich bei TryParse das Session weglassen musste???
bool loggedIn;
if (!bool.TryParse("login", out loggedIn) || !loggedIn)
{
Response.Redirect("nixda.aspx");
}
aber zumindest ist jetzt der Erfolg eingetreten.
Ich verstehe zwar den Code nicht komplett, aber kommt vielleicht noch...
Es wird also geprüft, ob es überhaupt einen Benutzernamen gibt liefert also true oder fals zurück soweit so gut
aber was die Teile:
", out loggedIn) || !loggedIn)
bewirken weiß ich leider nicht
Danke Gruß Frank
Hallo zusammen,
hab das jetzt mal versucht, bekomme aber beim Compilieren Fehlermeldungen:
login.aspx.cs:
if (str_username == benutzername && str_kennwort == password && gruppe "1")
{
Session.Add("username", txt_username.Text);
Session["login"] = false;
Response.Redirect("kunde_neu.aspx");
}
kunde_neu.aspx.cs:
protected void Page_Load(object sender, EventArgs e)
{
bool loggedIn;
if (!bool.TryParse(Session["login"], out loggedIn) || !loggedIn)
{
Response.Redirect("nixda.aspx");
}
}
Fehlermeldung:
if (!bool. = Fehler 1 Die beste Übereinstimmung für die überladene Methode bool.TryParse(string, out bool) hat einige ungültige Argumente.
Fehler2:
TryParse(Session["login"] = Fehler 2 Das Argument 1 kann nicht von object in string konvertiert werden.
Ich weiß nicht, wie ich diese Fehler beheben kann.
Hallo Peter,
nachdem ich nun das Forum durchforstet habe, bin ich zu meiner Lösung gekommen.
und eigentlich ist es ganz wenig Code:
Seite1:
Session.Add("login", txt_username.Text);
Response.Redirect("kunde_neu.aspx");
Seite2:
string str_login = (string)Session["login"];
Hier kann ich nun gleich in welcher Funktion darauf zugreifen 😉
Nur die Prüfung auf der 2. Seite, ob der Zugriff auf die 2.Seite über das login-Formular erfolgte fehlt mir noch
Reicht hier nicht theoretisch aus, ob der Wert des TextFeldes username auf der login-Seite !="" ist?
Dann könntre ich doch auf die nixda.aspx verweisen.
Das ist bestimmt nicht die eleganteste Methode?
Gruß Frank
Hallo @all,
habe den Fehler gefunden.
Der Einsatz des Parameters @ ist hier Falsch.
Richtig ist:
private void KundenBestandSuchen()
{
string str_CheckVorwahl = txt_CheckVorwahl.Text;
string str_CheckTelefon = txt_CheckTelefon.Text;
string str_CheckVrn = str_CheckVorwahl + str_CheckTelefon;
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT COUNT(*) AS anzahl FROM kunden WHERE telefon = '" + str_CheckVrn + "'";
conn.Open();
int anzahl = Convert.ToInt32(cmd.ExecuteScalar());
if (anzahl == 0)
{
Alert.Show("Sie können den Kunden mit dieser Telefonnummer in das System eingeben");
}
else
{
Alert.Show("Sorry, Kunde bereits im System vorhanden");
}
conn.Close();
}
Hi, ich habe eben noch mal in der DB-Tabelle geschaut und ein Update durchgeführt.
Hier ist definitiv die vorwahl: 0123 und die Telefonnummer 456789
zusammengesetzt ergibt das 0123456789
die Telefonnummer ist als varchar also Text gespeichert, so daß evtl. auch keine führende null verlorengeht.
Habe auch versucht in Einzelschritten zu durchlaufen bzw. zu debuggen...
auch im Debugger wird die
string str_CheckVrn = str_CheckVorwahl + str_CheckTelefon;
mit dem Wert 0123456789 gefüllt...
habe versucht mir mal lediglich die Anzahl im Label auszugeben, auch hier bekomme ich 0 zurück???
private void KundenBestandSuchen()
{
string str_CheckVorwahl = txt_CheckVorwahl.Text;
string str_CheckTelefon = txt_CheckTelefon.Text;
string str_CheckVrn = str_CheckVorwahl + str_CheckTelefon;
string str_Anzahl = "SELECT COUNT(*) str_Anzahl FROM kunden WHERE telefon = @telefon";
MySqlCommand cmd_Anzahl = new MySqlCommand(str_Anzahl, conn);
conn.Open();
MySqlDataReader reader = cmd_Anzahl.ExecuteReader();
while (reader.Read())
{
lbl_fehler.Text = reader["str_Anzahl"].ToString(); // 0 wird ausgegeben
}
reader.Close();
}
Zu Testzwecken ist das die einzige Telefonnummer (Datensatz) in der Tabelle
So klar Typkonvertierung durchgeführt.
Allerdings bekomme ich jetzt jedesmal die Meldung:
if (anzahl == 0)
Alert.Show("Sie können den Kunden mit dieser Telefonnummer in das System eingeben");
auch wenn diese Nummer bereits vorhanden ist???
eigentlich sollte hier kommen:
else
Alert.Show("Sorry, Kunde bereits im System vorhanden");
hier nochmal der komplette Code:
private void KundenBestandSuchen()
{
string str_CheckVorwahl = txt_CheckVorwahl.Text;
string str_CheckTelefon = txt_CheckTelefon.Text;
string str_CheckVrn = str_CheckVorwahl + str_CheckTelefon;
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
cmd.Parameters.Add("@telefon", str_CheckVrn);
cmd.CommandText = "SELECT COUNT(*) AS anzahl FROM kunden WHERE telefon = @telefon";
conn.Open();
int anzahl = Convert.ToInt32(cmd.ExecuteScalar());
if (anzahl == 0)
Alert.Show("Sie können den Kunden mit dieser Telefonnummer in das System eingeben");
else
Alert.Show("Sorry, Kunde bereits im System vorhanden");
conn.Close();
}
Das verstehe ich nicht???
Deshalb war ja am Anfang die Idee:
Wenn Rufnummer gefunden: (if reader.read()
Eingabe möglich
else
Eingabe möglich
Wo liegt hier bitte mein Denkfehler?
@Lion1984,
sorry das habe ich inzwischen ergänzt, ganz klar, sonst ist ein Vergleich ja nicht möglich.
Jetzt habe ich nur das Problem mit der Typumwandlung.
private void KundenBestandSuchen()
{
string str_CheckVorwahl = txt_CheckVorwahl.Text;
string str_CheckTelefon = txt_CheckTelefon.Text;
string str_CheckVrn = str_CheckVorwahl + str_CheckTelefon;
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
cmd.Parameters.Add("@telefon", str_CheckVrn);
cmd.CommandText = "SELECT COUNT(*) AS anzahl FROM kunden WHERE telefon = @telefon";
conn.Open();
int anzahl = (int)cmd.ExecuteScalar();
if (anzahl == 0)
Alert.Show("Sie können den Kunden mit dieser Telefonnummer in das System eingeben");
else
Alert.Show("Sorry, Kunde bereits im System vorhanden");
conn.Close();
}
Hallo Khalid, danke für Deine Antwort.
Allerdings bekomme ich jetzt die Fehlermeldung: Die Angegebene Umwandlung ist ungültig.
Kann ich an der Stelle:
int anzahl = (int)cmd.ExecuteScalar();
zusätzlich noch eine Typumwandlung durchführen?
Danke
verwendetes Datenbanksystem: MySql
Hallo zusammen,
in meiner kleinen Anwendung möchte ich lediglich prüfen, ob eine bestimmte Telefonnummer in der db_tabelle vorhanden ist. Wenn ja Meldung <Meldung1>
Wenn Nein: <Meldung2>
Nun bekomme ich stets <Meldung2>, auch wenn die gesuchte Telefonnummer definitiv NICHT im Sysetm vorhanden ist?
An welcher Stelle liegt hier mein Fehler?
protected void btn_KundeBestand_Click(object sender, EventArgs e)
{
string str_CheckVorwahl = txt_CheckVorwahl.Text;
string str_CheckTelefon = txt_CheckTelefon.Text;
string str_CheckVrn = str_CheckVorwahl + str_CheckTelefon;
if (str_CheckVorwahl != "" && str_CheckTelefon != "")
{
KundenBestandSuchen();
}
else
{
Alert.Show("Leere Felder sind unzulässig!!!");
}
}
//**************************************************************************************************
private void KundenBestandSuchen()
{
string str_CheckVorwahl = txt_CheckVorwahl.Text;
string str_CheckTelefon = txt_CheckTelefon.Text;
string str_CheckVrn = str_CheckVorwahl + str_CheckTelefon;
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
cmd.Parameters.Add("@telefon", str_CheckVrn);
cmd.CommandText = "SELECT telefon AS str_CheckVrn FROM kunden";
conn.Open();
MySqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
Alert.Show("Sorry, Kunde bereits im System vorhanden");
}
else
{
Alert.Show("Sie können den Kunden mit dieser Telefonnummer in das System eingeben");
}
reader.Close();
conn.Close();
}
Eigentlich ist der Code doch korrekt oder?
Wenn reader.Read(), also wenn gefunden...
sonst...
Danke für Eure Hilfe
Hallo Peter,
aber entschuldige ich habe Deine Antworten gelesen, wenn diese aber Fehler auslösen und ich daraufhin eine Lösung erfrage ist das doch nicht verkehrt oder irre ich mich da?
Schlieslich habe ich ja die Fehlermeldung mit gepostet.
Das bedeuet, daß Dein Lösungsansatz ja nicht korrekt sein kann.
Ich habe in meinem Buch nur ein Beispiel was die Session innerhalb einer Seite beschreibt, das nutzt mir aber nichts, da ich ja die Werte auf der 2. Seite nutzen möchte.
Ein konkretes Beispiel gibt es nur in selteen Fällen.
Aus diesem Grund habe ich ja mein Code gepostet, diesen könnte man ja editieren bzw. erweitern.
Deine Lösungsvorschläge sehen ziehmlich einfach und logisch aus (wenig Codezeilen)
Da stelll ich mir die Frage:" Das kann doch nicht so schwer sein"
Gruß Frank
Hallo Peter, also ich bekomme es nicht hin... ?
Ich versuche ja erst bei erfolgreichem Vergleich mit der bd-Abfrage den usernamen in der Session zu speichern.
Und die Fehlermeldung auf der Zielseite bleibt bestehen.
Ich könnte ein kleines funktionierendes Beispiel als Anschauungsmodell gebrauchen.
login.aspx
protected void btn_login_Click(object sender, EventArgs e)
{
Session.Add("username", txt_username);
string str_username = txt_username.Text;
string str_kennwort = txt_kennwort.Text;
string benutzername;
string password;
string gruppe;
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
cmd.Parameters.Add("@benutzername", str_username);
cmd.Parameters.Add("@password", str_kennwort);
cmd.CommandText = "SELECT benutzername AS benutzername, password AS password, gruppe AS gruppe FROM users";
try
{
conn.Open();
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
benutzername = reader["benutzername"].ToString();
password = reader["password"].ToString();
gruppe = reader["gruppe"].ToString();
if (str_username == benutzername && str_kennwort == password && gruppe == "1")
{
Session.Add("login", txt_username.Text);
Response.Redirect("kunde_neu.aspx");
}
if (str_username == benutzername && str_kennwort == password && gruppe == "2")
{
Session.Add("login", txt_username.Text);
Response.Redirect("verwaltung_auswahl.aspx");
}
if (str_username == benutzername && str_kennwort == password && gruppe == "3")
{
Session.Add("login", txt_username.Text);
Response.Redirect("admin.aspx");
}
else
{
lbl_fehler.Text = "Sie sind nicht registriert";
}
}
reader.Close();
}
catch (Exception ex)
{
lbl_fehler.Text = (ex.Message.ToString());
}
conn.Close();
}
Zielseite.aspx
protected void Page_Load(object sender, EventArgs e)
{
bool loggedIn;
if (!bool.TryParse(Session["login"], out loggedIn) || !loggedIn)
{
Response.Redirect("nixda.aspx");
}
// hier erhalte ich ja auch weiterhin die Fehlermeldung:
// Fehler 1 Die beste Übereinstimmung für die überladene Methode bool.TryParse(string, out bool) hat einige ungültige Argumente.
//Fehler 2 Das Argument 1 kann nicht von object in string konvertiert werden.
}
Wie gesagt ein funktionierendes Beispiel wäre da sehr hilfreich
Danke Gruß Frank
Hallo Peter, also ganz so einfach scheint es nicht zu sein, ich hab mal meine Funktion genommen und die Compiler-Fehler dazugetan:
login.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btn_login_Click(object sender, EventArgs e)
{
Session.Add("username", txt_username);
string str_username = txt_username.Text;
string str_kennwort = txt_kennwort.Text;
string benutzername;
string password;
string gruppe;
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
cmd.Parameters.Add("@benutzername", str_username);
cmd.Parameters.Add("@password", str_kennwort);
cmd.CommandText = "SELECT benutzername AS benutzername, password AS password, gruppe AS gruppe FROM users";
try
{
conn.Open();
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
benutzername = reader["benutzername"].ToString();
password = reader["password"].ToString();
gruppe = reader["gruppe"].ToString();
if (Session["str_username"] == benutzername && str_kennwort == password && gruppe == "1")
Session["Login"] = true;
Response.Redirect("kunde_neu.aspx");
Warnung:Unbeabsichtigter Verweisvergleich. Wandeln Sie die linke Seite in den Typ string um, um einen Wertvergleich zu erhalten.
//if (str_username == benutzername && str_kennwort == password && gruppe == "1")
//{
// Response.Redirect("kunde_neu.aspx");
//}
if (str_username == benutzername && str_kennwort == password && gruppe == "2")
{
Response.Redirect("verwaltung_auswahl.aspx");
}
if (str_username == benutzername && str_kennwort == password && gruppe == "3")
{
Response.Redirect("admin.aspx");
}
else
{
lbl_fehler.Text = "Sie sind nicht registriert";
}
}
reader.Close();
}
catch (Exception ex)
{
lbl_fehler.Text = (ex.Message.ToString());
}
conn.Close();
}
kunde_neu.aspx.cs
public partial class kunde_neu : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
bool loggedIn;
if (!bool.TryParse(Session["Login"], out loggedIn) || !loggedIn)
Fehlermeldung: Das Argument 1 kann nicht von object in string konvertiert werden
{
Response.Redirect("nixda.aspx");
}
}
}
Hallo Peter,
ich hab zwar ein dickes Buch "ASP.NET Grundlagen und Profiwissen", finde aber hier kein geeignetes Beispiel...
Kannst du mir bitte die Vorgehensweise zeigen für die login-Seite sowie für die Zielseiten?
Danke Gruß Frank
@blackman1983,
also anmelden sollen sich nur user können, die auch die login-seite kennen. Dies soll ein CRM werden (Kunden- und Auftragsverwaltung).
Es wird geprüft:
user und pw (Abgleich in DB-Tabelle)
je na dem welcher gruppe (user, verwaltung, administration) wird der user zur nächsten Seite weitergeleitet (Response.Redirect) z.B. login.aspx --> admin.aspx
beim Page_onLoad-Ereignis auf der admin.aspx soll nun geprüft werden, ob der Aufruf der Seite admin.aspx über die Seite login.aspx erfolgte.
Ich möchte lediglich vermeiden, daß "jemand" in die Adresszeile: domain.de/admin.aspx eingibt und unberechtigt auf der admin.aspx landet.
Danke Gruß Frank
Hallo zusammen,
beim Page_onLoad_Ereignis möchte ich prüfen, ob der Seitenaufruf über die LoginForm.aspx erfolgte. Damit soll ausgeschlossen werden, daß die Zielseite in die Adressleiste direkt eingegeben werden kann.
Also login Form --> prüfen ob username und pw richtig (db_table), darin auch gruppen_id. Je nach dem welcher Gruppen_id zugehörig soll der user auf die nächste Seite geleitet werden... (ResponseRedirect)
Hier soll nun wie gesagt geprüft werden: erfolgte der Seitenaufruf von der loginForm ansonsten: Fehlermeldung.aspx oder so?
Danke für Eure Hilfe
Hallo cmaurer,
sicher hast du recht, was die Feldnamen bzw. Tabellennamen betrifft.
Tabelle <offen> bedeutet bei mir "nicht bearbeitet"
vrn als Schlüssel bedeutet v:::
werde aber deine Methode mal ausprobieren.
Inzwischen habe ich einen string übergeben.
private void geprueft_am()
{
try
{
string str_vrn = txt_vrn.Text;
DateTime dt = DateTime.Now;
string str_datum = Convert.ToString(dt);
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
cmd.Parameters.Add("@vrn", txt_vrn.Text);
cmd.CommandText = "UPDATE offen SET [geprüft am] = '" + str_datum + "' WHERE vrn = @vrn";
cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
lbl_Fehler.Text = (ex.Message);
}
}
ist zugegeben nicht die "sauberste Methode...
Hallo dimuwe,
also als erstes musst du wissen, welche Felder aktualisiert werden sollen.
2. in beiden Tabellen müssen eindeutige Schlüssel vorhanden sein die jeden DS identifizieren
Beispiel:
Bei der Suche in Tabelle1 nach dem DS mit dem Schlüssel 123 muss der gleiche DS in der Tabelle2 mit dem Schlüssel 123 gefunden werden.
Dann ist der Rest kein Problem, die Abfrage bei ca. 3000 DS dauert nur Bruchteile
UPDATE <Tabelle1>, <Tabelle2>
SET <Tabelle1.Feld1=Tabelle2.Feld1>
WHERE Tabelle1.Schlüssel=Tabelle2.Schlüssel
beliebig erweiterbar auf mehrere Felder
sorry hatte vergessen:
cmd.Parameters.Add...
Es kommt kein Compiler-Fehler
Erst beim Update-Befehl
also der Parameterwert ist der Datumswert
aber das war nicht der Fehler.
Der Fehler liegt irgendwie am Datumsformat welches nicht korrekt übergeben wird.
verwendetes Datenbanksystem: ACCESS
Hallo zusammen,
ich möchte über ein Formular Daten in meiner Tabelle aktualisieren, sowei so gut
Abschließend möchte ich das Änderungsdatum mittels:
private void geprueft_am()
{
try
{
string str_vrn = txt_vrn.Text;
DateTime dt = DateTime.Now;
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
cmd.Parameters.Add("@vrn", txt_vrn.Text);
cmd.CommandText = "UPDATE offen SET [geprüft am] = dt WHERE vrn = @vrn";
cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
lbl_Fehler.Text = (ex.Message);
}
}
Fehler: (Für mindestens einen erforderlichen Parameter wurde kein Wert übergeben.
Warum funktioniert diese einfache Query nicht?
Danke für Eure Hilfe
Hallo BerndFfm,
das kuriose ist: ich bekomme keine Fehlermeldung!
Der Statusbalken vom Browser klettert bis 5 Kästchen, danach bleibt er stehen.
Beim Odbc-String hingegen: Bums fertig!!
Kann deshalb keine Fehlermeldung posten.
Verweis habe ich hinzugefügt!!!
Aber der simpelste Versuch scheitert:
MySqlConnection conn;
string myConnectionString;
myConnectionString = "server=localhost;database=test;UID=;pwd=;";
try
{
conn = new MySqlConnection(myConnectionString);
conn.Open();
}
catch (MySql.Data.MySqlClient.MySqlException ex)
{
lbl_Fehler.Text = ex.Message.ToString();
}
Merkwürdig ist:
mit:
OdbcConnection conn = new OdbcConnection(
"Driver={MySQL ODBC 3.51 Driver};database=test;UID=;PW=;Options=3");
conn.Open();
lbl_Fehler.Text = "erfolgreich";
conn.Close();
klappt es.
Also muss es an der Verbindung mit dem Connector scheitern.
verwendetes Datenbanksystem: <bitte immer angeben>mysql 4.0.12
Ich versuche gerade erfolglos einen Verweis auf die Mysql.Data.dll herzustellen.
Habe den Connector mit msi installiert.
Verwende VS.Net 2003 (Framework 2.0, SDK 2.0)
Warum lässt sich der Verweis nicht herstellen?
Im GAC ist dieser zu sehen, nicht aber bei "Verweis hinzufügen > Durchsuchen
Wo bitte liegt mein Fehler?
Danke für Eure Hilfe
genau, das scheint es zu sein. Lade mir das 2.0er runter und versuche es erneut.
Danke erst mal...
Gruß Frank
Hallo zusammen,
es ist ja nun schon eine Weile her, daß ich dieses Problem hatte. In meinem letzten Projekt habe ich mit dem MSSQL Server gearbeitet.
Heute möchte ich eine kleine Web-Anwendung entwickeln die auf eine Access DB zugreift.
Wieder das Thema mit dem Datumswerten:
Beim Code:
private void MVL_Aktualisieren()
{
string str_vrn = txt_vrn.Text;
DateTime MVL;
OleDbCommand cmd = new OleDbCommand("UPDATE offen SET MVL = @MVL WHERE vrn = @vrn", conn);
cmd.Parameters.Add("@vrn", txt_vrn.Text);
if (DateTime.TryParse(txt_MVL.Text, out MVL))
cmd.Parameters.AddWithValue("@MVL", MVL);
else
cmd.Parameters.AddWithValue("@MVL", DBNull.Value);
cmd.ExecuteNonQuery();
}
bekomme ich folgende Fehlermeldungen:
'System.DateTime' enthält keine Definition für 'TryParse'
'System.Data.OleDb.OleDbParameterCollection' enthält keine Definition für 'AddWithValue'
Wie kommt diese Meldung zustande, was ist die Ursache dafür und wie kann ich sie beheben?
Danke für Eure Hilfe
Beim Debuggen bzw. Haltepunkt/Einzelschritt sehe ich folgende Werte:
vorwahl: 030
Telefon: 1234567
vrn: (wird erzeugt) 0301234567
Wie schon gesagt, bei der Arbeit mit den Parametern, würde **(Warum auch immer) **NULL in die Tabelle geschrieben werden,
Wenn ich aber den Inhalt der string Variablen übergebe:
Values(' " + str_vorwahl + " ', ' " + str_teöefon + " ' , ' " + str_vrn + " ' );
werden die Werte in die Tabelle geschrieben...
Hallo, vielen Dank für Deine Antwort, aber bei mir kommt jetzt die Meldung:
Column 'vrn' cannot be null
Das bedeutet, daß jeweils 'null' in die Tabelle geschrieben werden soll?
Im Einzelschritt ist zu sehen, daß der Wert vrn nicht null ist sonder der verkettete string aus vorwahl + telefon
vorwahl: 030
telefon: 1234567
str_vrn = str_vorwahl + str_telefon
string str_vrn = (str_vorwahl + str_telefon);
wenn ich anstelle der Parameter die strings einfüge (Values('" + str_vorwahl + "', usw. werden die Werte in die Tabelle geschrieben!
Warum bekomme ich jetzt diese Meldung?
Danke für Eure Hilfe
Hallo,
aus Performancegründen würde ich empfehlen:
Feld <bildurl>
alle Bilder in ein Verzeichnis auf dem Server laden
in das Feld <bildurl> nur den link /Verweis/relativer Pfad auf das Bild speichern
(./images/meinbild1.jpg)
zum "ansehen" Steuerlement Image Inhalt = <bildurl>
zumal hier bei einer Upload-Funktion geprüft werden kann, wie groß darf das Bild sein, welche Endungen darf das Dateiformat haben.
ein Beispiel das ich vor einiger Zeit mal zum testen gebastelt habe
Hier mit SQL-Server
Einfach mal die Artikelnummer 1000 eingeben und Enter
Original von DeveloperX
Hallo!Du musst die Fragezeichen mit den entsprechenden Parameter-Namen ersetzen.
cmd_Insert.CommandText = "INSERT INTO kundendaten(anrede, vorwahl, telefon, vrn) VALUES(@anrede,@vorwahl,@telefon,@vrn)";
mfg
Genau das hatte ich vorher versucht.
in meiner Tabelle darf das Feld vrn nicht leer sein, aber bei dieser Variante wird nur null in die Felder geschrieben:
protected void btn_Insert_Neu_Click(object sender, EventArgs e)
{
try
{
string str_kdnr = txt_Kundennummer.Text;
string str_bkonto = txt_Buchungskonto.Text;
string str_anrede = ddl_Anrede.SelectedValue.ToString();
string str_vorname = txt_Vorname.Text;
string str_nachname = txt_Nachname.Text;
string str_strasse = txt_Strasse.Text;
string str_plz = txt_Plz.Text;
string str_ort = txt_Ort.Text;
string str_vorwahl = txt_Vorwahl.Text;
string str_telefon = txt_Telefon.Text;
string str_vrn = str_vorwahl + str_telefon;
string str_Geburtsdatum = txt_Geburtsdatum.Text;
string str_email = txt_email.Text;
string str_status = ddl_Status.SelectedValue.ToString();
string str_produkt = ddl_Produkte.SelectedValue.ToString();
string str_verzeichnis = ddl_Verzeichnis.SelectedValue.ToString();
string str_kontoinhaber = txt_Kontoinhaber.Text;
string str_bankname = txt_Bankname.Text;
string str_blz = txt_Blz.Text;
string str_konto = txt_Konto.Text;
string str_agentur = ddl_Agentur.SelectedValue.ToString();
string str_mitarbeiter = ddl_Berater.Text;
string str_auftragsdatum = txt_Auftragsdatum.Text;
string str_kontrolle = ddl_Kontrolle.SelectedValue.ToString();
MySqlCommand cmd_Insert = new MySqlCommand();
cmd_Insert.Connection = conn;
cmd_Insert.CommandText = "INSERT INTO kundendaten(anrede, vorwahl, telefon, vrn) VALUES(@anrede,@vorwahl,@telefon,@vrn)";
cmd_Insert.Parameters.Add("@anrede", str_anrede);
cmd_Insert.Parameters.Add("@vorwahl", str_vorwahl);
cmd_Insert.Parameters.Add("@telefon", str_telefon);
cmd_Insert.Parameters.Add("@vrn", str_vrn);
//zum testen habe ich erstmal die anderen Felder weggelassen
conn.Open();
cmd_Insert.ExecuteNonQuery();
conn.Close();
}
catch (Exception ex)
{
txt_Bemerkungen.Text = ex.Message.ToString();
}
}
Fehlermeldung: vrn darf nicht null sein!
Hallo zusammen,
in meiner Anwendung nutze den den MySqlConnector 5.1
Für den Insert-Befehl möchte ich Parameter einsetzen.
Allerdings bekomme ich hier die Meldung:
"Parameters must defined"
MySqlCommand cmd_Insert = new MySqlCommand();
cmd_Insert.Connection = conn;
cmd_Insert.CommandText = "INSERT INTO kundendaten(anrede, vorwahl, telefon, vrn) VALUES(?,?,?,?)";
cmd_Insert.Parameters.Add("@anrede", ddl_Anrede.SelectedValue.ToString());
cmd_Insert.Parameters.Add("@vorwahl", varchar(20),txt_Vorwahl.Text);
cmd_Insert.Parameters.Add("@telefon", varchar(20), txt_Telefon.Text);
cmd_Insert.Parameters.Add("@vrn", varchar(40), str_vrn);
Wo liegt hier mein Fehler?
Danke für Eure Hilfe
Hallo FZelle,
herzlichen Dank für Deine Antwort.
Deine gezeigte Vorgehensweise klappt.
Wie ich schon erwähnt hatte, habe ich immer Stichpunkte und Hinweise bekommen aber nirgends ein vergleichbares Beispiel gefunden.
Ich findes es toll, daß sich einige die Mühe machen und extra ein kleines Prgramm "basteln" um nachvollziehen zu können, warum manches nicht klappt.
Viele Funktionen die mit einem Designer generiert werden funktionieren einfach oder auch nicht.
Deshalb verwende ich gerade was Connections usw. betrifft keinen Designer, um die Funktionsweise besser zu verstehen und Fehler an den Richtigen Stellen zu finden.
PS: die conn.Open()
sieht bei mir so aus:
private void Aktualisieren()
{
conn.Open();
conn.Open();
cmd_Befehl.Execute.NonQuery();
conn.Close();
ausführe um die Verbindung nur sehr kurz offen zu halten.
Danke Dir vielmals
Gruß Frank
Ich habe eine einfache Lösung gefunden:
private void GeburtsDatum_Aktualisieren()
{
string str_VRN = txt_VRN.Text;
string str_GeburtsDatum = txt_GeburtsDatum.Text;
if (txt_GeburtsDatum.Text == "")
{
SqlCommand cmd_GebUpdate = new SqlCommand();
cmd_GebUpdate.Connection = conn;
cmd_GebUpdate.Parameters.Add("@vrn", txt_VRN.Text);
txt_GeburtsDatum.Text);
cmd_GebUpdate.CommandText = "UPDATE <tabelle> SET geburtsdatum = null WHERE vrn = @vrn";
cmd_GebUpdate.ExecuteNonQuery();
}
else
{
SqlCommand cmd_GebUpdate = new SqlCommand();
cmd_GebUpdate.Connection = conn;
cmd_GebUpdate.Parameters.Add("@vrn", txt_VRN.Text);
cmd_GebUpdate.Parameters.Add("@GeburtsDatum", txt_GeburtsDatum.Text);
cmd_GebUpdate.CommandText = "UPDATE <tabelle> SET geburtsdatum = @GeburtsDatum WHERE vrn = @vrn";
cmd_GebUpdate.ExecuteNonQuery();
}
}
Bei dieser Variante wird keinerlei Typumwandlung vorgenommen, die mir in einigen Foren **immer als Stichwort **gegeben wurde.
Das Datum wird intern als DateTime in die Tabelle geschrieben
Wenn jemand eine "vernünftigere" Lösung hat, BITTE mitteilen.
Danke
Wenn ich als GeburtsDatum lediglich die Variable string str_GeburtsDatum.Text übergebe, wird DB-Intern der 01.01.1900 reingeschrieben:
str_GeburtsDatum = txt_GeburtsDatum.Text
Update <tabelle> set geburtsdatum = @geburtsdatum where vrn = @vrn
cmd.Parameters.Add("@geburtsdatum", txt_GeburtsDatu.Text);
ist ja erstmal was, aber eigentlich soll null zurückgeschrieben werden!
Dafür müsste ich wieder den Variablen-Inhalt von str_GeburtsDatum in ein DateTime convertieren, wobei ich wieder am Ausgangspunkt meines Problems lande... Grrrrrrrrrrrr
Hallo falangkinjau,
vielen Dank dafür, daß du dir die Mühe gemacht hast.
Aber es funktioniert immer noch nicht!
Wie ich oben schon gepostet habe:
Wenn ich "Ohne Variablen" arbeite, werden UPDATES durchgeführt egal ob ich:
UPADTE <tabelle> SET geburtsdatum = '' WHERE vrn = '1234567'; oder
UPDATE <tabelle> SET geburtsdatum = null WHERE vrn = '1234567';
schreibe. Also wenn ich den CODE hart reinschreibe wird er übernommen!
Sobald ich versuche eine Variable zu übergeben, kommt die Fehlermeldung?
string str_GeburtsDatum = txt_GeburtsDatum.Text;
DateTime _GeburtsDatum = Convert.ToDateTime(str_GeburtsDatum);
"Die Zeichenfolge wurde nicht als gültiges DateTime erkannt!"
Bin echt am verzweifeln, zumal bei mysql keine Probleme auftraten mit dem gleichen Programm
Hallo Fzelle,
wie muss denn aber nun meine Funktion aussehen, damit sie funktioniert?
Es werden Daten aus einer Tabelle geladen und in verschiedenen Steuerelementen angezeigt.
Wenn in einem DS kein Datumswert vorhanden ist, wird auch nichts dargestellt.
Wenn nun der Update-Befehl kommt, wird jeder Inhalt der Steuerelemente in die Tabelle zurückgeschrieben.
Gibt der Benutzer in das Textfeld Geburtsdatum nun einen wert ein, z.B. 19.01.1968 steht dieser ja zunächst als Zeichenkette in der Variablen txt_GeburtsDatum.Text
dieser string wird nun zum Datum convertiert.
Ich habe nun versucht über DBNull Informationen zu erlangen, aber keine Lösung gefunden, die mein Problem beschreibt.
Deshalb die Frage:
Wie muss meine Funktion geändert werden, damit bei fehlendem GeburtsDatum null in die Tabelle geschrieben wird?
Danke für Deine Hilfe
Der String wird ja üblicherweise in das DateTime-Format Convertiert.
Hier bloß auskommentiert.
Wenn ich das Feld nicht leer lasse, gibt es auch keine Probleme
Nur wenn das Feld leer bleibt:
" wird die Zeichenfolge nicht als gültiges DateTime erkannt".
Hallo,
die Tabellenstruktur sieht so aus:
geburtsdatum datetime
NICHT NOT NULL
KEIN DEFAULT
Lasse mir gerade die Struktur mit MS SQL Maestro anzeigen.
Beim erzeugen der Tabelle habe ich lediglich:
CREATE TABLE <Tabelle>
...
...
geburtsdatum datetime,
...
...
Hallo falangkinjau,
hab das jetzt mal probiert:
private void GeburtsDatum_Aktualisieren()
{
string str_VRN = txt_VRN.Text;
DateTime _GeburtsDatum;
string str_GeburtsDatum = txt_GeburtsDatum.Text;
//_GeburtsDatum = Convert.ToDateTime(str_GeburtsDatum);
SqlCommand cmd_GebUpdate = new SqlCommand();
cmd_GebUpdate.Connection = conn;
cmd_GebUpdate.Parameters.Add("@vrn", txt_VRN.Text);
//cmd_GebUpdate.Parameters.Add("@GeburtsDatum", _GeburtsDatum);
cmd_GebUpdate.CommandText = "UPDATE <Tabelle> SET geburtsdatum = null WHERE vrn = @vrn";
cmd_GebUpdate.ExecuteNonQuery();
}
Jetzt bekomme ich zwar keine Fehlermeldung mehr, aber
Logischerweise wird jetzt aber auch das GeburtsDatum nicht aktualisiert, wenn es eingetragen wird, weil es wird ja nirgends übergeben
Hallo,
ich habe ein kleines Programm zum testen, in dem ich eine Query in ein TextFeld eingebe, den Inhalt des TextFeldes an meine Variable str_QueryString übergebe:
UPDATE <Tabelle> SET geburtsdatum = null WHERE vrn = '1234567'
Hier wird der Befehl ausgeführt!
bei UPDATE <Tabelle> SET geburtsdatum = '' WHERE vrn = '1234567'
wird der 01.01.1900 in die Tabelle geschrieben!
Hallo kleines_eichhoernchen;
danke für deine Antwort, leider klappt dies auch nicht.
Bekomme wieder die gleiche Fehlermeldung:
"Die Zeichenfolge wurde nicht als gültiges DateTime erkannt"
Habe diese Frage schon in einem anderen Forum besprochen und in anderen Threads gesucht, aber keine funktionierende Lösung gefunden oder ein Beispiel für den Einsatz mit DBNull, daß ich in meinem Fall anwenden kann.
Vorher hatte ich mit mysql gearbeitet, dort wurde ohne zu "meckern" einfach NULL in die Tabelle geschrieben, wenn das Textfeld leer war.
Vielleicht gibt es ja doch eine Lösung?
Hallo Danke für den Tipp,
habe mir eben die Tehemen angesehen, aber keine funktionierende Lösung gefunden.
Ich kann meinem DateTime _GeburtsDatum nicht den Wert DBNull zuweisen!
Da DBNull nicht in DateTime convertiert werden kann.
Ich frage ab:
if(txt_GeburtsDatum.Text == "")
_GeburtsDatum = Convert.DBNull.Value;
dann Update-Command
aber sooo geht das nicht?
Wie muss es denn bei meinem Beispiel aussehen?
Danke für Eure Hilfe
Hallo zusammen,
ich nerve schon wieder wegen meines DatumUpdates:
In meiner Tabelle sind einige Daten mit Geburtsdatum einige Ohne,
das Anzeigen der Daten in beiden Fällen klappt.
Allerdings bekomme ich, bei meinem Update (wenn das Feld txt_GeburtsDatum leer ist) die Fehlermeldung: "Die Zeichenfolge wurde nicht als gültiges DateTime erkannt"
Wie muss ich hier vorgehen, um ein leeres Feld zu akzeptieren?
Meine Funktion:
private void GeburtsDatum_Aktualisieren()
{
string str_VRN = txt_VRN.Text;
string str_GeburtsDatum = txt_GeburtsDatum.Text;
str_GeburtsDatum = Convert.ToDateTime(str_GeburtsDatum).ToShortDateString();
SqlCommand cmd_GebUpdate = new SqlCommand();
cmd_GebUpdate.Connection = conn;
cmd_GebUpdate.Parameters.Add("@vrn", txt_VRN.Text);
cmd_GebUpdate.Parameters.Add("@geburtsdatum", str_GeburtsDatum);
cmd_GebUpdate.CommandText = "UPDATE <Tabelle> SET geburtsdatum = @geburtsdatum WHERE vrn = @vrn";
cmd_GebUpdate.ExecuteNonQuery();
}
Habe versucht:
IF TextBox leer DateTime _GeburtsDatum = DBNull
Aber das funktioniert nicht so richtig, weil hier DBNull als Variable fungieren würde.
Danke für Eure Hilfe
@ unconnected
Danke für die Antwort.
Leider kann ich Nullable nicht umsetzen, daher die Frage, ob du mir an meinem Beispiel zeigen kannst, wie ich prüfen kann, ob der Wert der in die Tabelle geschrieben werden soll null ist. Und wenn null was dann als Wert in die Tabelle geschrieben werden soll.
Wie gesagt, ich will nicht prüfen, ob der Inhalt des Feldes Geburtsdatum in der Tabelle null ist, sondern ob der Wert der beim Update in die Tabelle geschrieben werden soll null ist.
Demzufolge muss ich als Wert etwas angeben, da ich sonst die Meldung bekomme:
"Die Zeichenfolge wurde nicht als gültiges DateTime erkannt"
In meiner Methode wirden wie oben zu sehen 3 strings aneinander gekettet und zu DateTime Convertiert, wenn der string nun **"" **ist, kann kein gültiges DateTime erstellt werden.
Die Daten werden aus der Tabelle geladen (ohne Fehlermeldung) wenn der Inhalt des Feldes <geburtsdatum> null ist
Danke für Deine Hilfe
OK hört sich prima an, ich kann also einem Wert vom Typ DateTime null zuweisen
Aber wie muss da aussehen, ich hab keine Ahnung
Kannst du mir das Bitte anhand meines Beispiels zeigen?
Danke
Bleibt mir wohl nur:
if(str_GeburtsDatum !="")
{
weiter im Programm
}
else
{
nächster Schritt
}
oder?
Hallo zusammen,
folgendes Problem:
ich lasse mir in meiner WebForm Personendaten anzeigen, die per Update geändert werden können.
Sollte das Feld <geburtsdatum> in der Tabelle leer sein, wird in den TextBoxen nichts dargestellt.
Das Geburtsdatum wird sonst gesplittet in 3 TextBoxen angezeigt
GeburtsTag
GeburtsMonat
GeburtsJahr
diese 3 strings werden verkettet und zu DateTime konvertiert.
Sofern diese 3 Felder nicht leer sind funktioniert das Update.
Wenn nun diese 3 Felder leer sind kann für das Feld <geburtsdatum> kein Update erfolgen:
Zeichenfolge wurde als nicht gültiges DateTime erkannt
Welche Möglichkeit habe ich auch ein leeres Feld per Update in die Tabelle zu schreiben?
Hier die Methode:
private void GeburtsDatum_Aktualisieren()
{
// Diese Methode funktionier aufgrund der DATE_FORMAT Methode bei SLQ nicht!
string str_VRN = txt_VRN.Text;
string str_GeburtsTag = txt_GeburtsTag.Text;
string str_GeburtsMonat = txt_GeburtsMonat.Text;
string str_GeburtsJahr = txt_GeburtsJahr.Text;
string str_Trennzeichen = ".";
//DateTime _GeburtsTag = Convert.ToDateTime(str_GeburtsTag).AddDays();
//DateTime _GeburtsMonat = Convert.ToDateTime(str_GeburtsMonat);
//DateTime _GeburtsJahr = Convert.ToDateTime(str_GeburtsJahr);
string str_GeburtsDatum = str_GeburtsJahr + str_Trennzeichen + str_GeburtsMonat + str_Trennzeichen + str_GeburtsTag;
DateTime _GeburtsDatum = Convert.ToDateTime(str_GeburtsDatum);
SqlCommand cmd_UpdateCommand = new SqlCommand();
if (_GeburtsDatum == null)
{
// Fehlerbehandlung
}
cmd_UpdateCommand.Connection = conn;
cmd_UpdateCommand.Parameters.Add("@vrn", txt_VRN.Text);
cmd_UpdateCommand.Parameters.Add("@geburtsDatum", str_GeburtsDatum);
cmd_UpdateCommand.CommandText = "UPDATE <tabelle> SET geburtsdatum = '" + _GeburtsDatum + "' WHERE vrn = @vrn";
cmd_UpdateCommand.ExecuteNonQuery();
}
Danke für Eure Hilfe