Avatar billede vegaz Juniormester
17. november 2011 - 01:02 Der er 25 kommentarer og
1 løsning

Søge funktion i C# (OleDb)

Hej folkens,

Efter utallige timers søgning på nettet og forsøg med at sætte noget sammen, er jeg nødt til at kapitulere.

Jeg har et meget simpelt setup/GUI (bruger Visual C# 2010, WPF) med en textBox1, en button og et dataGrid1.
Det jeg vil er at søge på et hvilket som helst ord i min access (2010) database, hvorefter den så udskriver hele rækken med alle informationerne til dataGrid.
Hvis jeg f.eks. skriver kundenr eller firmanavn i textBoxen og trykker søg, skal alle informationer der står i samme række med det søgte ord i databasen, altså udskrives til dataGridet.

I min database er en tabel kaldet Info og en masse felter:
Kundenr (Primær nøgle og autonummering - resten er tekst), Firmanavn, Adresse, By, Postnr, Land, Kontaktperson, Telefon, Mail.

Jeg kan få applikationen til at åbne op så jeg kan skrive noget i textBoxen, men når jeg så trykker søg giver den mig en fejl:
Der er en syntaksfejl i FROM-delsætningen.

Koden jeg bruger lige pt. er følgende:

using System.Data;          // ADO.Net namespace
using System.Data.OleDb;    // OleDb namespace


public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Application.Current.Properties["Main"] = this; // sætter dette vindue til navnet "Main"
            Application.Current.Properties["Vindue1"] = new Window1(); // sætter Window1 til navnet "Vindue1"

            // Lav et connection-objekt, åbn forbindelsen og gem objektet som global variabel
            OleDbConnection cn = new OleDbConnection();
            cn.ConnectionString =  @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Niclas\Desktop\Skole\Programmering\Database\KundeInfo.accdb;Persist Security Info=False;";
            cn.Open();
            Application.Current.Properties["DBConnection"] = cn;
       
        }

private void button_search(object sender, RoutedEventArgs e) // Søg-knappen
        {
                dataGrid1.Items.Clear();  // Tøm dataGrid1

  OleDbConnection conn = (OleDbConnection)Application.Current.Properties["DBConnection"];

  OleDbCommand dbCommand = conn.CreateCommand();
  dbCommand.CommandText = "SELECT * FROM Food LIKE '%" + textBox1.Text + "%'";

  OleDbDataAdapter dataAdapter = new OleDbDataAdapter(dbCommand);

  DataSet ds = new DataSet();
  dataAdapter.Fill(ds);
  dataGrid1.ItemsSource = ds.Tables[0].DefaultView;
        }
}

Håber på noget hurtigt hjælp :)
På forhånd tak!
Avatar billede arne_v Ekspert
17. november 2011 - 01:04 #1
Den SELECT ser OK ud.

Den vil naturligvis fejle ved input med ' i da du ikke bruger parameters.
Avatar billede vegaz Juniormester
17. november 2011 - 01:06 #2
Hej arne_v

Jeg er nybegynder mht. programmering, så ved ikke helt hvad det betyder at jeg skal bruge parameters. Kan du hjælpe mig på rette vej?
Avatar billede Syska Mester
17. november 2011 - 01:14 #3
Den gode Mr Arne_v har allerede en lang guide til dig her: http://www.eksperten.dk/guide/831

mvh
Avatar billede arne_v Ekspert
17. november 2011 - 01:15 #4
Avatar billede vegaz Juniormester
17. november 2011 - 01:54 #5
Tak for jeres links. Nu har jeg siddet og prøvet at tilføje parameters og ændre rundt i koden og bruge forskellige metoder, men får stadig den samme fejl!!

Noget sample kode hjælp vil være meget belejligt, da jeg simpelthen sidder fast.
Avatar billede vegaz Juniormester
17. november 2011 - 01:55 #6
dataAdapter.SelectCommand.Parameters.Add(textBox1.Text, OleDbType.VarChar, 50);
Avatar billede arne_v Ekspert
17. november 2011 - 01:56 #7
Kan du poste den relevante del af koden som dn ser ud nu og den praecise fejl tekst?
Avatar billede Syska Mester
17. november 2011 - 01:58 #8
Uden at være 100% sikker.

Er ret overbevist om det skal være i formen:
dataAdapter.SelectCommand.Parameters.Add("@Name", OleDbType.VarChar, 50).Value = textBox1.Text;

mvh
Avatar billede vegaz Juniormester
17. november 2011 - 02:06 #9
OleDbCommand dbCommand = conn.CreateCommand();
  dbCommand.CommandText = "SELECT * FROM Food LIKE '%" + textBox1.Text + "%'";

  OleDbDataAdapter dataAdapter = new OleDbDataAdapter(dbCommand);

  dataAdapter.SelectCommand.Parameters.Add(textBox1.Text, OleDbType.VarChar, 50);

  DataSet ds = new DataSet();
  dataAdapter.Fill(ds);
  dataGrid1.ItemsSource = ds.Tables[0].DefaultView;

Får fejlen: Der er en syntaksfejl i FROM-delsætningen.
OleDbException was unhandled.
Samtidigt markerer den dataAdapter med grå og .Fill(ds); med gul.

Tak.
Avatar billede vegaz Juniormester
17. november 2011 - 02:13 #10
Håber ikke jeg dobbelt poster nu, for virkede åbenbart ikke før.

Jeg får fejlen: Der er en syntaksfejl i FROM-delsætningen.
OleDbException was unhandled.
dataAdapter er markeret med gråt mens .Fill(ds); er gult.


OleDbCommand dbCommand = conn.CreateCommand();
  dbCommand.CommandText = "SELECT * FROM Food LIKE '%" + textBox1.Text + "%'";

  OleDbDataAdapter dataAdapter = new OleDbDataAdapter(dbCommand);

  dataAdapter.SelectCommand.Parameters.Add(textBox1.Text, OleDbType.VarChar, 50);

  DataSet ds = new DataSet();
  dataAdapter.Fill(ds);
  dataGrid1.ItemsSource = ds.Tables[0].DefaultView;
Avatar billede Syska Mester
17. november 2011 - 02:23 #11
"SELECT * FROM Food LIKE '%" + textBox1.Text + "%'";

Du mangler en WHERE

"SELECT * FROM Food WHERE LIKE '%" + textBox1.Text + "%'";

Udover det, så bruger du ikke Parameters. Du skal nok lige læse den artikel en gang mere.
Avatar billede Syska Mester
17. november 2011 - 02:25 #12
Rod fra mig også.

Hvad skal være hvad ?

SELECT * FROM table WHERE column LIKE '%value%'

Så må du selv lige fylde table, column og value ud med hvad du nu bruger.

Der findes ikke SQL command til at kigge i alle columns, så det bliver en lang query hvis det er dit mål.

Du kan eventuelt kigge på FullTextIndex ... men det virker som om du har problemer nok lige til at starte med.

mvh
Avatar billede vegaz Juniormester
17. november 2011 - 02:48 #13
Tak. Kan value ikke være textBox1.Text? Meningen er jo den skal skrive det hele ud i dataGridet.
Ved f.eks. at det kan lade sig gøre at skrive alt fra et "referencenr" i access ud i et dataGrid vha. noget DataRow og DataTable (desværre kan jeg kun få dette til at virke i Windows Forms?!). Så hvis jeg skriver f.eks. 1 i tekstboksen og trykker søg, så skriver den alt det info der står sammen med et-tallet, dvs. navn osv. :)
Nu har jeg ændret select til dette men får stadig en NY fejl.

"SELECT * FROM Info Where Kundenr, Firmanavn, Adresse, By, Postnr, Land, Kontaktperson, Telefon, Mail LIKE '%" + textBox1.Text + "%'";

Når jeg bruger den får jeg en ny syntaksfejl.
Har skrevet Niclas i textBox1 og trykket på søg-knappen.

Der er en syntaksfejl, fordi der mangler et komma. i forespørgselsudtrykket "Kundenr, Firmanavn, Adresse, By, Postnr, Land, Kontaktperson, Telefon, Mail LIKE '%Niclas%'".


Jeg smutter i seng, svarer imorgen (hvis I stadig er oppe, godnat).
Avatar billede vegaz Juniormester
17. november 2011 - 20:51 #14
Kan man lettere lave det med en combobox hvor man vælger f.eks. kundenr i comboboxen og så skriver det i textboxen, hvor den så finder det frem?

Ved ikke om det er lettere, men det kræver vel at man binder en masse tabeller sammen i Access?
Avatar billede Syska Mester
17. november 2011 - 21:31 #15
Som jeg skrev ... du kan ikke sprøge på flere felter og du kan ikke bare opfinde dit eget SQL.

SELCT columns FROM table WHERE column = value

(column = value) er en condition som skal være true.

Dem kan du sætte sammen med AND eller OR

SELCT columns FROM table WHERE column = value OR column = value OR column = value OR column = value OR column = value OR column = value

Jeg ville foreslå du læser en bog om SQL og alle de kan man kan, eventuelt specifik om Access.

Jeg forstår ikke din sidste kommentar.
Vil du skriver noget i en boks for at skrive det i en anden boks for derefter at bruge det i din query?
Avatar billede vegaz Juniormester
17. november 2011 - 21:40 #16
Jeg er jo nybegynder til alt det her med programmering, så var egentlig for at få noget kode hjælp. :)

Jeg bruger vel ikke SQL da databasen ligger offline på min computer, det er til et projekt, så SQL injection (attacks) etc. er ikke noget der spiller nogen stor rolle.
Generelt fatter jeg ikke at det skulle være så svært at lave? :O
Skal jeg droppe dataGrid og bruge listBox istedet for, det virker meget mere simpelt..?
Avatar billede Syska Mester
17. november 2011 - 21:56 #17
Du bruger SQL mod din Access database.

Hvis den er på din computer er den vel online ... offline er vel noget man ikke har adgang til.

Det er heller ikke svært, problemet er lidt at forstå hvad det er du vil.

Det du har lavet virker jo som sådan. Du skal bare lave din query rigtig.

mvh
Avatar billede vegaz Juniormester
19. november 2011 - 16:22 #18
Kan du hjælpe med at lave den query rigtig så? Jeg prøver og prøver med forskellige ting og læser alt muligt, men forstår det sgu ikke rigtigt. En samplecode ville hjælpe rigtigt meget og gerne med lidt forklaring.
Avatar billede Syska Mester
19. november 2011 - 18:19 #19
"SELECT * FROM Info Where Kundenr, Firmanavn, Adresse, By, Postnr, Land, Kontaktperson, Telefon, Mail LIKE '%" + textBox1.Text + "%'";

Eneste problem

SELCT columns FROM table WHERE column = value OR column = value OR column = value OR column = value OR column = value OR column = value

Eneste problem er jo at du skal OR dine conditions.

Jeg gider ikke laver det for alle de columns, det kan du selv.
Men den skal jo bare se ca. sådan her ud:
"SELECT * FROM Info WHERE Kontaktperson LIKE '%" + textBox1.Text + "%' OR Telefon LIKE '%" + textBox1.Text + "%'";

mvh
Avatar billede vegaz Juniormester
19. november 2011 - 19:06 #20
Aha.. Kanont :) Godt eksempel.

Så den skal se sådan her ud? Altså med Kundenr, Firmanavn, Adresse, By(har lavet det om til City da By vel er et reserveret navn?), Postnr, Land, Kontaktperson, Telefon, Mail?

"SELECT * FROM Info WHERE Kundenr LIKE '%" + textBox1.Text + "%' OR Firmanavn LIKE '%" + textBox1.Text + "%'" OR Adresse LIKE '%" + textBox1.Text + "%'" OR City LIKE '%" + textBox1.Text + "%'" OR Postnr LIKE '%" + textBox1.Text + "%'" OR Land LIKE '%" + textBox1.Text + "%'" OR Kontaktperson LIKE '%" + textBox1.Text + "%'" OR Telefon LIKE '%" + textBox1.Text + "%'" OR Mail LIKE '%" + textBox1.Text + "%'";
Avatar billede vegaz Juniormester
19. november 2011 - 19:09 #21
"SELECT * FROM Info WHERE Kundenr LIKE '%" + textBox1.Text + "%' OR Firmanavn LIKE '%" + textBox1.Text + "%' OR Adresse LIKE '%" + textBox1.Text + "%' OR City LIKE '%" + textBox1.Text + "%' OR Postnr LIKE '%" + textBox1.Text + "%' OR Land LIKE '%" + textBox1.Text + "%' OR Kontaktperson LIKE '%" + textBox1.Text + "%' OR Telefon LIKE '%" + textBox1.Text + "%' OR Mail LIKE '%" + textBox1.Text + "%'";

Nogle småfejl med " rettet.
Avatar billede vegaz Juniormester
19. november 2011 - 19:10 #22
Hmmm.. Applikationen åbner fint men når jeg trykker på søg, sker der intet. Der kommer heller ikke nogen fejl.
Avatar billede vegaz Juniormester
19. november 2011 - 21:22 #23
Så tror jeg sgu det virker!!!

Ændrede sidste linje til det her:

dataGrid1.ItemsSource = ds.Tables[0].DefaultView;

Tusind tak for hjælpen.
Kan det lade sig gøre at printe det man får udskrevet til datagridet?
Avatar billede Syska Mester
19. november 2011 - 22:46 #24
Ja, alt kan lade sig gøre.

Nemt, nej ... print fra WinForms sux.

og svar.
Avatar billede vegaz Juniormester
19. november 2011 - 23:10 #25
Tak for hjælpen :)
Det er jo i WPF, ved ikke om det er det samme. Men må jo prøve mig frem, mest af alt bare for lidt lir at have det.
Avatar billede Syska Mester
19. november 2011 - 23:23 #26
Mener faktisk at det er nemmere i WPF, men stadig ikke helt nemt. Tænkæ tænke, lang tid siden jeg har haft brug for det.

mvh
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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



IT-JOB

Metroselskabet og Hovedstadens Letbane

Cyber Security Konsulent

Udviklings- og Forenklingsstyrelsen

ITSM-koordinator

Danske Commodities A/S

IT Systems Engineer

Udviklings- og Forenklingsstyrelsen

Rådgivende informationsarkitekter med strategisk fokus

Sparekassen Danmark

RPA-udvikler til IT-afdelingen