Avatar billede left Nybegynder
03. april 2006 - 04:35 Der er 10 kommentarer og
1 løsning

Lave SQL-kald og vise i datagrid

Jeg har en database med over 10.000 adresser og kontaktoplysninger. For at kunne søge heri, ønsker jeg at der kan søges på en eller flere kolonner. I én søgning kræver jeg f.eks. at postnummeret skal være mellem 8000 og 8200, samt at navnet skal være LIKE 'Jensen'. I en anden søgning kunne søgningen gå på telefonnummeret alene.

Jeg har derfor brug for at kunne sammensætte et SQL-kald helt som det passer mig. Vigtigt er det så at resultatet kan vises i et datagrid bagefter.

Jeg har forsøgt at lave noget med paramere, men det går ikke helt, når hvert kald kan indeholde forskellige krav.

Hvad gør jeg?
Avatar billede arne_v Ekspert
03. april 2006 - 04:41 #1
du både konstruerer en SQL sætning og adder parametre udfra input
Avatar billede arne_v Ekspert
03. april 2006 - 04:43 #2
skitseret:

If noget Then
  sqlstr = sqlstr & " AND f = @f"
  cmd.Parameters.Add("@f", SqlDBType.Integer)
  cmd.Parameters["@f"].Value = tal
End If
Avatar billede left Nybegynder
03. april 2006 - 05:07 #3
Du sover da heller aldrig arne :-)

Den måde havde jeg slet ikke tænkt det. Men hvordan kalder du så kaldet og omsætter det til et dataset, så jeg kan få vist det i mit datagrid?
Avatar billede arne_v Ekspert
03. april 2006 - 05:10 #4
klokken er kun 23:09 her

noget a la:

cmd.CommandText = sqlstr
Dim da As SqlDataAdapter = new SqlDataAdapter(cmd)
da.fill(ds)
Avatar billede left Nybegynder
03. april 2006 - 05:32 #5
Ok, jeg har startet med at lave Imports af System og System.Data.OleDB

Herefter,
Dim strsql As String = "SELECT * FROM Kontakter" 'Altså uden para i første omgang.
Dim cmd As OleDbCommand 'SqlCommand findes ikke (underligt)?

cmd.CommandText = strsql
Dim da As OleDbDataAdapter = New OleDbDataAdapter(cmd)
da.Fill(ds)

Jeg kan ikke få lov til at bruge SqlDataAdapter og SqlCommand

Jeg går ud fra at ds skal oprettes på en eller anden måde (bare uden indhold)?
Avatar billede arne_v Ekspert
03. april 2006 - 13:17 #6
OleDbXxxxx klasserne bruges til Acces og kræver at du importerer System.Data.OleDb

SqlXxxxx klasserne bruges til SQLServer og kræver at du importerer System.Data.SqlClient
Avatar billede left Nybegynder
04. april 2006 - 16:07 #7
Ja, det havde jeg også en anelse om.

Men har nu siddet 2 dage og forsøgt frem og tilbage. Har ikke fået det til at virke, men det tætteste jeg er kommet frem til er følgende - dog uden parametre da jeg bare gerne vill kalde en sqlstreng og få den ind i et dataset:

Dim strsql As String = "SELECT * FROM Kontakter"
Dim cmd As OleDbCommand
cmd.CommandText = strsql
Dim da As OleDbDataAdapter = New OleDbDataAdapter(cmd)
da.Fill(DataSet1)

Dette er så koden. Derudover har jeg så også oprettet DataSet1 som tomt skema.

Det virker dog stadig ikke :-(
Avatar billede arne_v Ekspert
07. april 2006 - 02:40 #8
her er et eksempel som virker:

Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.Drawing
Imports System.Windows.Forms

Namespace DefaultNamespace
    Public Class MainForm
        Inherits Form
        Private dg As DataGrid
        Private save As Button
        Private con As OleDbConnection
        Private cmd As OleDbCommand
        Private da As OleDbDataAdapter
        Private cb As OleDbCommandBuilder
        Private ds As DataSet

        Public Shared Sub Main
            Dim fMainForm As New MainForm
            fMainForm.ShowDialog()
        End Sub

        Public Sub New()
            MyBase.New
            Me.InitializeComponent
        End Sub

        Private Sub InitializeComponent()
            con = New OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Databases\MSAccess\Test.mdb")
            con.Open
            cmd = New OleDbCommand("SELECT * FROM T1 WHERE F1 >= ?", con)
            cmd.Parameters.Add("@F1", OleDbType.Integer)
            cmd.Parameters("@F1").Value = 2
            da = New OleDbDataAdapter(cmd)
            cb = New OleDbCommandBuilder(da)
            da.UpdateCommand = cb.GetUpdateCommand
            ds = New DataSet
            da.Fill(ds, "T1")
            dg = New DataGrid
            save = New Button
            SuspendLayout
            dg.Location = New Point(50, 50)
            dg.Size = New Size(300, 200)
            dg.SetDataBinding(ds, "T1")
            save.Location = New Point (50, 300)
            save.Size = New Size (100, 25)
            save.Text = "Save"
            AddHandler save.Click, AddressOf SaveClick
            ClientSize = New Size(400, 400)
            Controls.Add(dg)
            Controls.Add(save)
            Text = "Main Form"
            ResumeLayout(false)
        End Sub
       
        Sub SaveClick(ByVal sender As Object, ByVal e As EventArgs)
            da.Update(ds, "T1")
            ds.AcceptChanges
            dg.Refresh
        End Sub
    End Class
End Namespace
Avatar billede arne_v Ekspert
07. april 2006 - 02:41 #9
brugen af parameters virker nok lidt søgt, men det er en modificering af kode
uden parameter
Avatar billede left Nybegynder
14. april 2006 - 03:22 #10
Lækkert, så fik jeg mit program til at virke :-)

Smider du lige et svar arne - og mange tak!
Avatar billede arne_v Ekspert
14. april 2006 - 03:27 #11
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester