Avatar billede simsen Mester
12. maj 2007 - 13:03 Der er 7 kommentarer og
1 løsning

Fejl ved variabel i select statement - SQL: Data type mismatch in

Hej,

Jeg har følgende selectstatement, hvor den går i fejl, når jeg forsøger mig med @BrugerId i de to WHERE statements. Bruger jeg istedet 1 i dem begge, kommer den frem med de rigtige rækker fra databasen.

Når jeg kører selectstatement fra access databasen i en forespørgsel, kommer den frem med de rigtige rækker.....

Jeg HAR checket, at BrugerId i Bruger og GemteOpskrifter tabellerne er et langt heltal.....

Fejlen jeg får er  SQL: Data type mismatch in criteria expression

Nogen der kan  hjælpe mig...jeg er temmelig desperat - har forsøgt mig frem med diverse ting hele formiddagen....

Koden:
public Status GetSeekSimpelSortNameMine(int BrugerId, string seekstring, ref DataTable SeekSimpel)
    {
        Status status = Status.Failure;

        DataRow r = null;
        DataTable AItems = new DataTable();

        try
        {
            AItems.Columns.Add(new DataColumn("OpskriftId", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("OpskriftNavn", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("Ingredienser", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("Fremgangsmaade", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("Servering", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("Points", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("Dato", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("Print", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("BrugerNavn", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("KategoriNavn", Type.GetType("System.String")));

         
            command.CommandText = "SELECT Opskrift.OpskriftId, Opskrift.OpskriftNavn, Opskrift.KategoriId, Opskrift.LandId, Opskrift.TemaId, Opskrift.MaaltidId, Opskrift.Tilberedningstid, Opskrift.BrugerId, Opskrift.Kilde, Opskrift.PortionStk, Opskrift.Protein, Opskrift.Fedt, Opskrift.Kulhydrat, Opskrift.Pris, Opskrift.BilledeNavn, Opskrift.Ingredienser, Opskrift.Fremgangsmaade, Opskrift.Servering, Opskrift.Fedtfattig, Opskrift.AntalVisninger, Opskrift.Offentlig, Opskrift.Dato, Opskrift.Print, Opskrift.Points, Opskrift.AntalPersonerAfgivetPoints, Bruger.BrugerNavn, Kategori.KategoriNavn  FROM (Kategori INNER JOIN Opskrift ON Kategori.KategoriId=Opskrift.KategoriId) INNER JOIN Bruger ON Opskrift.BrugerId=Bruger.BrugerId  WHERE (Opskrift.BrugerId = @BrugerId) UNION SELECT Opskrift.OpskriftId, Opskrift.OpskriftNavn, Opskrift.KategoriId, Opskrift.LandId, Opskrift.TemaId, Opskrift.MaaltidId, Opskrift.Tilberedningstid, Opskrift.BrugerId AS Opskrift_BrugerId, Opskrift.Kilde, Opskrift.PortionStk, Opskrift.Protein, Opskrift.Fedt, Opskrift.Kulhydrat, Opskrift.Pris, Opskrift.BilledeNavn, Opskrift.Ingredienser, Opskrift.Fremgangsmaade, Opskrift.Servering, Opskrift.Fedtfattig, Opskrift.AntalVisninger, Opskrift.Offentlig, Opskrift.Dato, Opskrift.Print, Opskrift.Points, Opskrift.AntalPersonerAfgivetPoints, Bruger.BrugerNavn, Kategori.KategoriNavn FROM Bruger INNER JOIN (Kategori INNER JOIN (Opskrift INNER JOIN GemteOpskrifter ON Opskrift.OpskriftId = GemteOpskrifter.OpskriftId) ON Kategori.KategoriId = Opskrift.KategoriId) ON Bruger.BrugerId = GemteOpskrifter.BrugerId WHERE (((GemteOpskrifter.BrugerId)= @BrugerId))";

            command.Parameters.Clear();           
            command.Parameters.Add(new OleDbParameter("@seekstring", seekstring));
            command.Parameters.Add(new OleDbParameter("@BrugerId", BrugerId));

            OleDbDataReader myReader = command.ExecuteReader();

            //går gennem tabellen og lægger ind i rækker
            while (myReader.Read())
            {
                r = AItems.NewRow();

                try
                {
                    r["OpskriftId"] = (myReader["OpskriftId"]);
                    r["OpskriftNavn"] = (myReader["OpskriftNavn"]);
                    r["Ingredienser"] = (myReader["Ingredienser"]);
                    r["Fremgangsmaade"] = (myReader["Fremgangsmaade"]);
                    r["Servering"] = (myReader["Servering"]);
                    r["Points"] = (myReader["Points"]);
                    r["Dato"] = (myReader["Dato"]);
                    r["Print"] = (myReader["Print"]);
                    r["BrugerNavn"] = (myReader["BrugerNavn"]);
                    r["KategoriNavn"] = (myReader["KategoriNavn"]);
                }
                catch
                { }

                //Tilføjer rækken til datatable
                AItems.Rows.Add(r);
            }

            myReader.Close();
            SeekSimpel = AItems;
            status = Status.Success;
        }
        catch
        { }

        return status;
    }

mvh
simsen :-)
Avatar billede neoman Novice
12. maj 2007 - 13:24 #1
OleDb ikke bruger ikke parameternavne ved CommandType Text men deres rækkefølge: Dvs du skal nok lave dig dette her:
  command.Parameters.Add(new OleDbParameter("@BrugerId1", BrugerId));
  command.Parameters.Add(new OleDbParameter("@BrugerId2", BrugerId));

(hvor parameternavnene er der bare for at se hvad der sker)

For øjeblikket så prøver den desperat at aflæse den første BrugerID i din @seekstring (fordi den står først) og dette giver fejlen.
Avatar billede simsen Mester
12. maj 2007 - 13:45 #2
Hejsa neoman,

Jeg forsøger mig med nedenviste....den fremkommer ikke med fejl længere....Men den kommer heller ikke frem med de korrekte rækker (som jeg har testet i Access).... Nu tager den kun den(de) rækker med der er i anden select statement - alte WHERE BrugerId = @BrugerId2

Nogen flere gode ideer?

command.CommandText = "SELECT Opskrift.OpskriftId, Opskrift.OpskriftNavn, Opskrift.KategoriId, Opskrift.LandId, Opskrift.TemaId, Opskrift.MaaltidId, Opskrift.Tilberedningstid, Opskrift.BrugerId, Opskrift.Kilde, Opskrift.PortionStk, Opskrift.Protein, Opskrift.Fedt, Opskrift.Kulhydrat, Opskrift.Pris, Opskrift.BilledeNavn, Opskrift.Ingredienser, Opskrift.Fremgangsmaade, Opskrift.Servering, Opskrift.Fedtfattig, Opskrift.AntalVisninger, Opskrift.Offentlig, Opskrift.Dato, Opskrift.Print, Opskrift.Points, Opskrift.AntalPersonerAfgivetPoints, Bruger.BrugerNavn, Kategori.KategoriNavn  FROM (Kategori INNER JOIN Opskrift ON Kategori.KategoriId=Opskrift.KategoriId) INNER JOIN Bruger ON Opskrift.BrugerId=Bruger.BrugerId WHERE (((Opskrift.BrugerId) = @BrugerId1)) UNION SELECT Opskrift.OpskriftId, Opskrift.OpskriftNavn, Opskrift.KategoriId, Opskrift.LandId, Opskrift.TemaId, Opskrift.MaaltidId, Opskrift.Tilberedningstid, Opskrift.BrugerId AS Opskrift_BrugerId, Opskrift.Kilde, Opskrift.PortionStk, Opskrift.Protein, Opskrift.Fedt, Opskrift.Kulhydrat, Opskrift.Pris, Opskrift.BilledeNavn, Opskrift.Ingredienser, Opskrift.Fremgangsmaade, Opskrift.Servering, Opskrift.Fedtfattig, Opskrift.AntalVisninger, Opskrift.Offentlig, Opskrift.Dato, Opskrift.Print, Opskrift.Points, Opskrift.AntalPersonerAfgivetPoints, Bruger.BrugerNavn, Kategori.KategoriNavn FROM Bruger INNER JOIN (Kategori INNER JOIN (Opskrift INNER JOIN GemteOpskrifter ON Opskrift.OpskriftId = GemteOpskrifter.OpskriftId) ON Kategori.KategoriId = Opskrift.KategoriId) ON Bruger.BrugerId = GemteOpskrifter.BrugerId WHERE (((GemteOpskrifter.BrugerId2)= @BrugerId))";

            command.Parameters.Clear();           
            command.Parameters.Add(new OleDbParameter("@seekstring", seekstring));
            command.Parameters.Add(new OleDbParameter("@BrugerId1", BrugerId));
            command.Parameters.Add(new OleDbParameter("@BrugerId2", BrugerId));

mvh
simsen :-)
Avatar billede simsen Mester
12. maj 2007 - 13:46 #3
Hov - fik lige skrevet forkert af.......

command.CommandText = "SELECT Opskrift.OpskriftId, Opskrift.OpskriftNavn, Opskrift.KategoriId, Opskrift.LandId, Opskrift.TemaId, Opskrift.MaaltidId, Opskrift.Tilberedningstid, Opskrift.BrugerId, Opskrift.Kilde, Opskrift.PortionStk, Opskrift.Protein, Opskrift.Fedt, Opskrift.Kulhydrat, Opskrift.Pris, Opskrift.BilledeNavn, Opskrift.Ingredienser, Opskrift.Fremgangsmaade, Opskrift.Servering, Opskrift.Fedtfattig, Opskrift.AntalVisninger, Opskrift.Offentlig, Opskrift.Dato, Opskrift.Print, Opskrift.Points, Opskrift.AntalPersonerAfgivetPoints, Bruger.BrugerNavn, Kategori.KategoriNavn  FROM (Kategori INNER JOIN Opskrift ON Kategori.KategoriId=Opskrift.KategoriId) INNER JOIN Bruger ON Opskrift.BrugerId=Bruger.BrugerId WHERE (((Opskrift.BrugerId) = @BrugerId1)) UNION SELECT Opskrift.OpskriftId, Opskrift.OpskriftNavn, Opskrift.KategoriId, Opskrift.LandId, Opskrift.TemaId, Opskrift.MaaltidId, Opskrift.Tilberedningstid, Opskrift.BrugerId AS Opskrift_BrugerId, Opskrift.Kilde, Opskrift.PortionStk, Opskrift.Protein, Opskrift.Fedt, Opskrift.Kulhydrat, Opskrift.Pris, Opskrift.BilledeNavn, Opskrift.Ingredienser, Opskrift.Fremgangsmaade, Opskrift.Servering, Opskrift.Fedtfattig, Opskrift.AntalVisninger, Opskrift.Offentlig, Opskrift.Dato, Opskrift.Print, Opskrift.Points, Opskrift.AntalPersonerAfgivetPoints, Bruger.BrugerNavn, Kategori.KategoriNavn FROM Bruger INNER JOIN (Kategori INNER JOIN (Opskrift INNER JOIN GemteOpskrifter ON Opskrift.OpskriftId = GemteOpskrifter.OpskriftId) ON Kategori.KategoriId = Opskrift.KategoriId) ON Bruger.BrugerId = GemteOpskrifter.BrugerId WHERE (((GemteOpskrifter.BrugerId)= @BrugerId2))";

command.Parameters.Clear();           
            command.Parameters.Add(new OleDbParameter("@seekstring", seekstring));
            command.Parameters.Add(new OleDbParameter("@BrugerId1", BrugerId));
            command.Parameters.Add(new OleDbParameter("@BrugerId2", BrugerId));
Avatar billede neoman Novice
12. maj 2007 - 13:48 #4
command.Parameters.Clear();         
            command.Parameters.Add(new OleDbParameter("@seekstring", seekstring));
            command.Parameters.Add(new OleDbParameter("@BrugerId1", BrugerId));
            command.Parameters.Add(new OleDbParameter("@BrugerId2", BrugerId));

skal vist være (jeg kan ikke få øje på hvor du bruger din seekstring - hvis den ikke optræder så skal den væk):
            command.Parameters.Clear();         
            command.Parameters.Add(new OleDbParameter("@BrugerId1", BrugerId));
            command.Parameters.Add(new OleDbParameter("@BrugerId2", BrugerId));

og i din select:
(((GemteOpskrifter.BrugerId2)= @BrugerId))"; skal være
(((GemteOpskrifter.BrugerId)= @BrugerId2))";
Avatar billede neoman Novice
12. maj 2007 - 14:02 #5
Avatar billede simsen Mester
12. maj 2007 - 15:22 #6
Det var da lige det der var galt.....og har/havde den med....for jeg er ikke færdig med min select endnu.....

Så jeg kan tænke mig til, når jeg skal have seekstring med - skal jeg også have to seekstrings i command.Parameters.Add?

Tak skal du have - giver du et svar?

simsen :-)
Avatar billede neoman Novice
12. maj 2007 - 16:39 #7
for hver gang der er en plads i din select, hvor data skal komme fra en parameter, så skal du have en tilsvarende parameter i parameterlisten - blot fordi du bruger navne betyder ikke at OleDb selv bruger navnene til noget :) - så, f.eks. for 6 steder i din select hvor der er plads til en parameter, skal der defineres 6 parametre i SAMME RÆKKEFØLGE  - deres navne er ret ligegyldige, men variabletypen skal jo svare til det forventede.  Dette gælder selv hvis det er samme værdi som skal bruges på nogle af pladserne - kig på det link fra før:)
Avatar billede simsen Mester
12. maj 2007 - 19:24 #8
Tak rigtig mange gange.....

mvh
simsen :-)
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