PDA

Vollständige Version anzeigen : keypress / sql abfrage


doublex
11.10.2006, 09:12
hallo,

ich möchte, wenn ich in einem textfeld eine eingabe beende (mit return), eine SQL abfrage ausführen und entweder die zeilen oder ein bestimmtes ergebnis auslesen.

im anschluß soll er tab drücken, um automatisch ins nächste feld zu springen.

im moment sieht es wie folgt aus:

If e.KeyChar = Microsoft.VisualBasic.ChrW(13) Then
sqlgrid.DataSource = Db.exe("Select * from LsPaket where LsKoNr like " & txtLfs.Text)

txtPA.Text = sqlgrid.VisibleRowCount


problem ist, dass sqlgrid halt ein sichtbaren gridfeld im entwurf ist, welches aber nicht zu sehen sein soll, doch wenn ich visible = false einstelle, bekomme ich kein ergebnis..

es wäre auch möglich die sql abfrage
"Select count(*) from LsPaket where LsKoNr like " & txtLfs.Text

aussehen zu lassen, so erhalte ich 1 spalte/feld mit meinem gewünschten ergebnis, was aufs gleiche drauf raus kommt.

gespeichert werden soll es in einem text feld.

danke

Noodles
11.10.2006, 10:49
ich verstehe leider nicht genau wo jetzt Dein Problem ist.

doublex
11.10.2006, 12:25
ok gut.

mein problem ist, dass ich nicht weiß, wie der code heißt der folgendes macht:

ausführen der "Tab" taste nach einer bestätigung mit Enter/Return.

und 2tens:
Auslesen eines Wertes einer SQL abfrage in ein Textfeld

die Abfrage lautet :
"Select * from LsPaket where LsKoNr like " & txtLfs.Text

Der zurückgegebene wert ist 2. wie muss der code heißen, dass der wert im feld z.b: txtPA zu sehen ist ?

danke

p.s. nun besser verständlich ?

Noodles
11.10.2006, 12:51
Ok, jetzt is besser. ;o)
zu 1.
Du behandelst das KeyDown Event Deiner TextBox. Wenn Enter gedrückt wurde ( KeyCode auswerten ), dann sendest Du die TabTaste mit SendKeys.Send("{TAB}").

zu 2.
Du verwendest ja sicherlich ein Commandobjekt ( Sql- oder OleDbCommand ), dieses hat eine Methode ExecuteScalar. Da bekommst Du genau den ersten Wert zurück.

doublex
11.10.2006, 13:15
danke, 1 funktioniert wunderbar.

doch bei 2 bin ich leider nicht erfolgreich.

das projekt verfügt über eine zusätzliche klasse, in der die sql verbindung aufgebaut wird:

Sub Connect()

Me.DBConnection = "workstation id=" & Dbserver & " ;packet size=4096;user id=" & DbBenutzer & ";data source=" & Dbserver & " ;persist security info=True;initial catalog=" & Db & ";password=" & DbPasswort
Me.SQLConnection = New System.Data.SqlClient.SqlConnection(DBConnection)


Connection = New SqlClient.SqlConnection(Me.SQLConnection.ConnectionString.ToString)

Connection.Open()
End Sub

Function exe(ByVal query As String) As DataTable

Dim res As New DataTable

Dim oDaten As New System.Data.DataTable

Dim SqlSelectCommand1 = New System.Data.SqlClient.SqlCommand

SqlSelectCommand1.CommandTimeout() = 30000

SqlSelectCommand1.CommandText() = query

SqlSelectCommand1.Connection() = Connection

Dim SqlDataAdapter1 = New System.Data.SqlClient.SqlDataAdapter(query, Connection)

Try

SqlDataAdapter1.Fill(oDaten)

res = oDaten

Catch e As Exception

'MsgBox(query)

'MsgBox("Abfrage liefert keine Daten!" & e.ToString)

res = Nothing

End Try


Return res

End Function


in der hauptklasse (in meinem falle form1) wird dann die sql abfrage ausgeführt. und sieht so aus:

sqlgrid.DataSource = Db.exe("Select * from LsPaket where LsKoNr like " & txtLfs.Text)

sprich in finde in dem gridfeld die SQL abfrage wieder.

ich habe dann die abfrage wie folgt verändert: ...Select count(*)...

nun erhalte ich eine tabelle bestehend aus 1 zeile und 1 spalte.


Schön und gut, doch der wert soll in einem Textfeld angezeigt werden und das gridfeld entfernt werden.

sprich z.b.

txtPA = Db.exe("Select * from LsPaket where LsKoNr like " & txtLfs.Text)

nur fehlt mir leider das wissen, wie der code richtig heißen muss

Noodles
11.10.2006, 13:20
Nimm keine DataSet wenn Du nur einen Wert holen willst. Ist sinnlos viel Overhead.

SqlCommand.ExectueScalar(...);

Ansonsten kannst Du auch über DataSet.Tables["..."].Rows[0][0] ( C# Code ) auf den ersten Wert zugreifen. Wenn es aber immer nur ein Wert ist, nimm ExecuteScalar.