webForumDet fria alternativet

från databasen till array

11 svar · 659 visningar · startad av Vinnaren

VinnarenMedlem sedan sep. 2005833 inlägg
#1

Hej

Jag behöver först lite hjälp med att hämta ut rätt data från en tabell. (VB.NET)
Har följande kod:

    Dim conString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Databas.mdb"
    Dim conn As OleDb.OleDbConnection = New OleDb.OleDbConnection(conString)
    Dim objDataSet As DataSet = New DataSet()
    Dim objDataAdapter As OleDb.OleDbDataAdapter

    Private Sub Start_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            getNamn()
            cbNamn.DataSource = objDataSet.Tables("Namn")
            cbNamn.DisplayMember = "Namn"
        Catch
            Call fel()
        End Try
    End Sub

    Private Sub getNamn()
        Const sql = "Select Namn, nID FROM Namn ORDER BY nID DESC"
        objDataSet = New DataSet()
        conn = New OleDb.OleDbConnection(conString)
        conn.Open()
        objDataAdapter = New OleDb.OleDbDataAdapter(sql, conn)
        objDataAdapter.Fill(objDataSet, "Namn")
        conn.Close()
    End Sub

    Private Sub btnStarta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStarta.Click

    End Sub

Det finns en dropdown ruta samt en knapp. I droppdown rutan visas det som koden ovan hämtar. Hur gör jag så jag får reda på vilket id (uID) den valda posten har som finns i dropdown rutan när användaren klickar på knappen?

Tacksam för all hjälp :stud

GlitterMedlem sedan juli 2003465 inlägg
#2

Jag brukar köra AutoPostBack="true" på DropDownListen och följande kod i onload

dim li as listitem
dim i as integer
for i to antalposter
li = new listitem
li.value = id
li.text = text
DropDownList.items.add(li)
next

i DropDownList.SelectedValue får du värdet sedan...

Koden är skriven på frihand så det kanske är fel någonstans.

VinnarenMedlem sedan sep. 2005833 inlägg
#3

tack, men får felmeddelandet:

Type 'listitem' is not defined.

på raderna:

Dim li As listitem

samt

li = New listitem

hur löser jag detta?

emissionMedlem sedan dec. 19996 721 inlägg
#4

Värdet ligger i cbNamn.SelectedValue, men du måste ange ValueMember på droppen.

Dessutom, globala variabler som inte behövs är ondska.

 'Bör hellre ligga i en config-fil
 Dim conString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Databas.mdb"
    

    Private Sub Start_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
           
            cbNamn.DataSource =  getNamn()
	    cbName.ValueMember = "nID"
            cbNamn.DisplayMember = "Namn"
        Catch
            Call fel()
        End Try
    End Sub

    Private Function getNamn() As DataTable
        Dim conn As OleDb.OleDbConnection = New OleDb.OleDbConnection(conString)
	Dim objDataTable As DataTable = New DataTable()
	Dim objDataAdapter As OleDb.OleDbDataAdapter

	Const sql = "Select Namn, nID FROM Namn ORDER BY nID DESC"
        conn.Open()
        objDataAdapter = New OleDb.OleDbDataAdapter(sql, conn)
        objDataAdapter.Fill(objDataTable)
        conn.Close()
	Return objDataTable
    End Sub

    Private Sub btnStarta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStarta.Click
		'Värdet ligger i cbNamn.SelectedValue (för det är väl inte ASP.NET?)
    End Sub
VinnarenMedlem sedan sep. 2005833 inlägg
#5

tack, det funkade perfekt :p

Nu vill jag att det som hämtas när man klickar på knappen ska sparas i 2 arrayer.

    Private Sub btnStarta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStarta.Click
        GroupBox1.Visible = False
        Panel1.Visible = True

        Dim valdID As Integer = cbNamn.SelectedValue
        getOrd(valdID)

    End Sub

    Private Function getOrd(ByVal valdID As Integer) As DataTable
        Dim conn As OleDb.OleDbConnection = New OleDb.OleDbConnection(conString)
        Dim objDataTable As DataTable = New DataTable()
        Dim objDataAdapter As OleDb.OleDbDataAdapter

        Const sql = "Select ord1, ord2 FROM Ord WHERE nID = " & valdID & ""
        conn.Open()
        objDataAdapter = New OleDb.OleDbDataAdapter(sql, conn)
        objDataAdapter.Fill(objDataTable)
        conn.Close()
        Return objDataTable
    End Functio

Hur får jag ord1 i en array, sen ord2 i en annan array? eller kan man göra typ en matris?

Får ett litet felmeddelande på min sql sats:
Constant expression is required.

Hur löser jag detta??

Tacksam för all hjälp :stud

emissionMedlem sedan dec. 19996 721 inlägg
#6

Om du verkligen måste ha två arrayer så får du loopa igenom DataTable:n och bygga upp dem själv. Annars är ju tabellen i sig en matris.

Felmeddelandet kan betyda vad som helst. Har du något värde i "valdID"?

Tre saker:

SelectedValue är en sträng. valdID är en integer. Du bör typomvandla (VB gör det automatiskt om inte Option Strict är påslaget. Att programmera utan Option Strict är också ondska)

Const sql är ingen konstant och ska inte definieras som en sådan.

Man ska ALLTID använda parametriserade frågor, ALDRIG bygga ihop SQL-strängar (säkerhet och prestanda)

Ungefär:

Dim sql As String= "Select ord1, ord2 FROM Ord WHERE nID = ?"
conn.Open()
objDataAdapter = New OleDb.OleDbDataAdapter(sql, conn)
objDataAdapter.SelectCommand.Paramaters.Add("nID",OleDbType.Integer,4).Value=valdID
'osv.
VinnarenMedlem sedan sep. 2005833 inlägg
#7

tack :bire

får felmeddelandet:
'Paramaters' is not a member of 'System.Data.OleDb.OleDbCommand'.

vad är det jag ska importera?

samt hur gör jag för att få ut tex få ut 1 raden av ord1 och ord2? :q

JosefMedlem sedan mars 20023 561 inlägg
#8

Tror att Parameters fungerar bättre. ;)

VinnarenMedlem sedan sep. 2005833 inlägg
#9

haha, :i , tack :e

Hur gör jag nu för att få ut första raden från det som hämtas från databasen? ord1 samt ord2 ?? :q

emissionMedlem sedan dec. 19996 721 inlägg
#10

Loopa igenom en DataTable

For Each row as DataRow in objDataTable.Rows
   'Värdet kan hämtas ur row("kolumnnamn")
Next

Första raden:

If objDataTable.Rows.Count>0
   'Värdet kan hämtas ur objDataTable.Rows(0)("kolumnnamn")
End If
emissionMedlem sedan dec. 19996 721 inlägg
#11

Jag rekommenderar att du använder Visual Studio (t.ex. gratisversionen) eller SharpDevelop när du kodar, så slipper du undra över saker som "Paramaters"-stavningen.

VinnarenMedlem sedan sep. 2005833 inlägg
#12

tack emission, nu funkar den (y) .

134 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)