db-Abfragewert in variable speichern?

Deletemaster

Erfahrenes Mitglied
Sorry, aber habe ne simple sache einfach "vergessen"
Ich möchte benutzerdaten aus einer tabelle lesen
den wert <benutzertyp> möchte ich in einer variable speichern und weiterverarbeiten
Wenn Typ = <wert>
öffne Fenster <nächstes Fenster> ...show.Dialog();
also variable deklarieren ist klar...
dann war da was mit cmd.parameters.add(@benutzertyp) ?
Könnt ihr mir bitte schnell auf die Sprünge helfen...
Danke

Code:
private void btn_Login_Click(object sender, System.EventArgs e)
{

if (txt_Benutzername.Text !="" && txt_Kennwort.Text !="")
		
try
{
conn.Open();
OdbcCommand cmd_userCheck = new OdbcCommand(
"SELECT Benutzername, Kennwort, Typ FROM Benutzer "+
"WHERE Benutzername=\'"+(txt_Benutzername.Text)+"\'"+
" AND Kennwort=\'"+(txt_Kennwort.Text)+"\'", conn);
MessageBox.Show("Verbindung erfolgreich");
						
//	Hier soll der Wert von "Typ" in die Variable gespeichert werden
//	wenn Inhalt der Variablen "Admin"
//	öffne Fenster "admin"
//	wenn Inhalt der Variablen "User"
//	öffne Fenster "User"
{
admin admin = new admin();
admin.ShowDialog();
}
}
catch(Exception ex)
{
MessageBox.Show("Verbindung gescheitert " + ex.Message);
}
conn.Close();
}
 
Zuletzt bearbeitet:

Deletemaster

Erfahrenes Mitglied
Danke erstmal für Deine Hilfe Norbert,
aber ich möchte diese Daten (Werte) nicht zwischen den Forms austauschen
sondern mein Ziel ist es,
der Benutzer gibt sein Benutzernamen UND sein Kennwort in eine TextBox
Daraufhin folgt eine Query in der Benutzername, Kennwort UND ein dritter Wert aus der db-table gelesen wird
diesen Wert möchte ich nur in eine Variable speichern
wenn 3. wert = admin dann öffne Formular 1
wenn 3. wert = user dann öffne Formular 2
hoffentlich habe ich mich nicht zu kompliziert ausgedrückt?
 

MFC openGL

Erfahrenes Mitglied
Deletemaster hat gesagt.:
....

Code:
private void btn_Login_Click(object sender, System.EventArgs e)
{
 
if (txt_Benutzername.Text !="" && txt_Kennwort.Text !="")
 
try
{
conn.Open();
OdbcCommand cmd_userCheck = new OdbcCommand(
"SELECT Benutzername, Kennwort, Typ FROM Benutzer "+
"WHERE Benutzername=\'"+(txt_Benutzername.Text)+"\'"+
" AND Kennwort=\'"+(txt_Kennwort.Text)+"\'", conn);
MessageBox.Show("Verbindung erfolgreich");
 
//	Hier soll der Wert von "Typ" in die Variable gespeichert werden
//	wenn Inhalt der Variablen "Admin"
//	öffne Fenster "admin"
//	wenn Inhalt der Variablen "User"
//	öffne Fenster "User"
{
admin admin = new admin();
admin.ShowDialog();
}
}
catch(Exception ex)
{
MessageBox.Show("Verbindung gescheitert " + ex.Message);
}
conn.Close();
}

Hi,

also ich arbeite momentan nur mit dem SQL Connector, aber dort ist das zumindest nicht so das ein Query ein \ haben muss. Das mal zu aller erst. Des weiteren, wieso ließt du nochmal den Username und das Passwort aus, du hast es doch schon übergeben. Wenn das nicht stimmt wird das Query eh sagen, das es keinen Typ dafür gibt.
Und dann zu deiner Frage, du musst natürlich den Stream abfangen, und das Ergebnis rausholen.

Also beim SQL Connector geht das so :

Code:
ArrayList al = new ArrayList();

MySqlCommand cmd = new MySqlCommand("select * from artikelgruppe order by GruppenID;", conn); 

reader = cmd.ExecuteReader(); 

while (reader.Read())

{

al.Add(reader.ToString());

al.Add(reader.ToString()); 

} 

reader.Close();

l.addlog("Alle Artikelgruppen erfolgreich aus der Datenbank gelesen");

return al;

Für ODBC geht das meines wissens ähnlich, die benötigen auch einen Reader.
So steht das in meiner MSDN... denke damit kommst du weiter.

Code:
public DataSet SelectOdbcSrvRows(DataSet dataset,string connection,string query) 
{
    OdbcConnection conn = new OdbcConnection(connection);
    OdbcDataAdapter adapter = new OdbcDataAdapter();
    adapter.SelectCommand = new OdbcCommand(query, conn);
    adapter.Fill(dataset);
    return dataset;
}

Gruß

MFC OpenGL
 

Deletemaster

Erfahrenes Mitglied
Danke erstmal für deine Mühe...

hier noch mal mein Code (überarbeitet)
Ziel soll sein: durch // auskommentiert

Code:
private void UserCheck()
{
if (txt_Benutzername.Text !="" && txt_Kennwort.Text !="")
		
try
{			
string _strTyp;//Hier soll der Wert von Typ gespeichert werden !

conn.Open();
OdbcCommand cmd_userCheck = new OdbcCommand(
"SELECT Benutzername, Kennwort, Typ FROM Benutzer "+
"WHERE Benutzername=\'"+(txt_Benutzername.Text)+"\'"+
" AND Kennwort=\'"+(txt_Kennwort.Text)+"\'", conn);
OdbcDataAdapter testcheck = new OdbcDataAdapter(cmd_userCheck);
testcheck.SelectCommand = cmd_userCheck;

DataSet pruefen = new DataSet();
testcheck.Fill(pruefen, "testtab");

int zaehler = 0;

zaehler=pruefen.Tables["testtab"].Rows.Count;
								
if(zaehler > 0)	
							
//if(strTyp="admin")
{
admin admin = new admin();
admin.ShowDialog();
}
//elseif(strTyp="user")
//{
//user user = new user();
//user.ShowDialog();
//}
else
{
MessageBox.Show("Sie sind nicht registriert!");Fehler", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
								}
txt_Benutzername.Text	="";
txt_Kennwort.Text		="";
			
}
catch(Exception)
{
MessageBox.Show("Verbindung gescheitert, Sie sind Nicht registriert");
}
else
{
MessageBox.Show("Benutzername und Kennwort eingeben");
}
conn.Close();
}

Also ich brauche einfach nur den Wert der in "Typ" steht...
 

Deletemaster

Erfahrenes Mitglied
So, das habe ich hinbekommen mit: (DataReader)

Nächstes Problem
Beim Start wird das login-Form angezeigt
je nach login öffnet sich ein entsprechendes Form

allerdings wird das login-Form nicht geschlossen...

private void user_verwaltung_Load(object sender, System.EventArgs e)
{
new login().Close();
}

bringt nicht den gewünschten Erfolg....
Wo liegt bitte der Fehler..?
 

Norbert Eder

Erfahrenes Mitglied
Warum einen eigenen Thread, wenn du hier auch fragst? Naja, egal .. auf jeden Fall, kann man hier mit deiner Erklärung viel mehr anfangen.

Such dir mal Infos zu Dialogen raus. Formular mit ShowDialog aufrufen und danach DialogResult abfragen. Wie das zu machen ist, sollte unter DialogResult in der MSDN zu finden sein.
 

Deletemaster

Erfahrenes Mitglied
Hmmm, vielleicht ein bißchen seltsam formuliert.
Also das login-form ist die start-form.
diese bleibt auch nach dem öffnen von unter-formularen erhalten.
Nach dem Schliessen der anderen Forms bleibt diese immer noch erhalten
die TextBoxen zur Eingabe habe ich durch TextBox ="";
"geleert"
wenn ich nun eine neue login-query stelle
kommt bei mir die (selbst gestaltete) Fehlermeldung:

else
{
MessageBox.Show("Sie sind nicht registriert !","Zugriff verweigert !", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

Hier nochmal der Code im Zusammenhang:

Code:
private void UserCheck()
{
	if (txt_Benutzername.Text !="" && txt_Kennwort.Text !="")
		
	try
	{
	conn.Open();
	OdbcCommand cmd_userCheck = new OdbcCommand(
	"SELECT * FROM Benutzer "+
	"WHERE Benutzername=\'"+(txt_Benutzername.Text)+"\'"+
	" AND Kennwort=\'"+(txt_Kennwort.Text)+"\'", conn);
										OdbcDataReader reader = cmd_userCheck.ExecuteReader();
										while(reader.Read())
	{
	_Benutzertyp += reader["Typ"];
	}
										if(_Benutzertyp=="admin")
	{
	admin admin = new admin();
	admin.ShowDialog();								}
										else if(_Benutzertyp=="user")
	{
	user_verwaltung user_verwaltung = new user_verwaltung();
	user_verwaltung.ShowDialog();
	}
	else
	{
	MessageBox.Show("Sie sind nicht registriert !","Zugriff verweigert !", MessageBoxButtons.OK, MessageBoxIcon.Error);
	}
										txt_Benutzername.Text	="";
	txt_Kennwort.Text		="";
										conn.Close();
										reader.Close();
	}
	catch(Exception)
	{									MessageBox.Show("Verbindung gescheitert, Sie sind Nicht registriert");
	}
	else
	{
	MessageBox.Show("Benutzername und Kennwort eingeben");
	}
	conn.Close();
}

Hier soll aber eine neue Query möglich sein
 

Reverent

Erfahrenes Mitglied
Hallo Deletemaster,
Warum denn "SELECT * FROM Benutzer ..."?
Wenn Du nur den Typ willst dann mach das doch bitte so "SELECT Typ FROM Benutzer ...". das spart Rescoursen. OK das ist nur eine kleine Abfrage, aber wenn die Abfragen umfangreicher werden, dann kostet es richtig Zeit und dann hast du noch einen Datenbankserver der in Netz hängt und und und, bitte etwas auf die Rescoursen achten.
Ich hoffe Ihr stimmt mir zu!
Bis Dann

//EDIT Du bekommst da doch nur einen Wert wieder zurück oder?
 

zovax

Erfahrenes Mitglied
Was willst du denn nun genau? In deinem vorigen Post hast du gesagt, du willst die Login Form schliessen (in dem Code hingegen erstellst du eine komplett neue Instanz). Nun soll sie doch offen bleiben?

Hast du mal geschaut was in "_Benutzertyp" steht? Dort haengst du String-Werte an, die Variable wird jedoch nirgends zurueckgesetzt. Koennte mir gut vorstellen, dass, wenn du eine neue Abfrage startet der alte Wert dort noch drinsteht, du etwas wie "adminuser" erhaeltst und deshalb der else Blockt ausgefuehrt wird.

Ich wuerde mir uebriegens (kommt auch auf die Groesse der Datenbank an) die Benuzter von Anfang an in ein DataSet laden bzw. Benuzterklassen nutzen (je nachdem ob du mit den Daten noch weiterarbeiten musst), dann brauchst du nicht soviele round trips zur Datenbank und hast alles lokal.