Avatar billede simsen Mester
25. juli 2006 - 09:14 Der er 18 kommentarer og
1 løsning

Fejl i hentning fra database

Jeg har hentet en værdi (FakturaID) over på en ny form, nu skal jeg så
spørge på denne i min select statement. Dette mener jeg, at jeg har lært, at
(selvom det er access database), skal jeg bruge @ for at søge på feltet?

Jeg har forsøgt at lave et ? i min WHERE del, men den fremkommer stadig med
fejlen: "No value given for one or more required parameters"

Kan en af jer, se hvor fejlen ligger?

Min kode:
public partial class FakturaVis : Form

{

int fakid;

private DataViewManager dsView;

private DataSet ds;

private OleDbDataAdapter da;

private OleDbCommandBuilder cBuilder;

string myDB = "c:\\ANSI\\Fakturasystem.mdb";





public FakturaVis(string id)

{

InitializeComponent();

this.fakid = Convert.ToInt16(id);

}


private void FakturaVis_Load(object sender, EventArgs e)

{

txtID.Text = fakid.ToString();

loadFakturaVis();

}

private void loadFakturaVis()

{

//create a connection string to the access database

OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;

User Id=;Password=;

Data Source=" + myDB);

// Create the DataSet

ds = new DataSet("FakturaOrdre");

// Fill the Dataset with Kunder, map Default Tablename  "Table" to "Kunder".

//da = new OleDbDataAdapter("SELECT Faktura.FakturaID, Faktura.KundeID,
Faktura.Dato, Faktura.BetalingsDato, Faktura.Betalt, Kunder.KundeId,
Kunder.Navn, Kunder.Adresse, Kunder.Postnr, Kunder.Byen, Kunder.Telefonnr,
Kunder.Mobilnr, Ordre.OrdreID, Ordre.FakturaNr, Ordre.Antal,
Ordre.Ordre_VareNr, Ordre.Produkter_VareNr, Ordre.Varenavn,
Ordre.PrisExMoms, Ordre.SalgsPrisInclMoms FROM Kunder INNER JOIN (Faktura
INNER JOIN Ordre ON Faktura.FakturaID = Ordre.FakturaNr) ON Kunder.KundeId =
Faktura.KundeID WHERE FakturaID=@id", cn);

da = new OleDbDataAdapter("SELECT FakuraID FROM Faktura WHERE
FakturaID=@fakid", cn);

da.TableMappings.Add("Table", "Ordre");

da.Fill(ds);

// The DataViewManager returned by the DefaultViewManager  property allows
you to create custom settings for each  DataTable in the DataSet.

dsView = ds.DefaultViewManager;

// Databinding for the Grid's

dgrOrdre.DataSource = dsView;

dgrOrdre.DataMember = "Ordre";

}

}
Avatar billede the_party_dog Nybegynder
25. juli 2006 - 09:19 #1
Når du bruger et @ din select statement, så forventer den at du har angivet en SQL Parameter. Den skal du så tilføje til dit Adapter objekt, før det vil virke.

da = new OleDbDataAdapter("SELECT FakuraID FROM Faktura WHERE
FakturaID=@fakid", cn);

da.SelectCommand.Parameters.Add("@fakid", SqlDbType.Int);
da.SelectCommand.Parameters["@fakid"].Value = fakid;

da.TableMappings.Add("Table", "Ordre");

da.Fill(ds);

// The DataViewManager returned by the DefaultViewManager  property allows
you to create custom settings for each  DataTable in the DataSet.

dsView = ds.DefaultViewManager;

// Databinding for the Grid's

dgrOrdre.DataSource = dsView;

dgrOrdre.DataMember = "Ordre";
Avatar billede simsen Mester
25. juli 2006 - 09:37 #2
Jeg har tilføjet følgende linier:

            da.SelectCommand.Parameters.Add("@FakturaID", OleDbType.Integer);
            da.SelectCommand.Parameters.Add("@fakid", OleDbType.Integer);

            da.SelectCommand.Parameters["@FakturaID"].Value = txtFakturaNr.Text;
            da.SelectCommand.Parameters["@fakid"].Value = fakid;

samt ændret følgende linie fra
this.fakid = Convert.ToInt16(id);
til
this.fakid = Convert.ToInt32(id);


Nu fremkommer den så med følgende fejl:
Failed to convert parameter value from a String to a Int32
Avatar billede the_party_dog Nybegynder
25. juli 2006 - 09:43 #3
Prøv at lave en try catch som laver en int.Parse på din txtFakturaNr.Text. Det lyder for mig som om den ikke kan oversætte det som står i din textbox til en Int.....
Avatar billede simsen Mester
25. juli 2006 - 09:58 #4
Jeg har lavet følgende:

try
            {
            da.SelectCommand.Parameters["@FakturaID"].Value = int.Parse(txtFakturaNr.Text);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Exception" + ex);
            }

Og får følgende fejl:

"Input string was not in a correct format"

Nu skal jeg lige have afklaret noget....

Du skriver "det som står i din textbox til en Int"........Jamen lige nu står der jo intet i min textbox. Jeg vil jo netop hente data (i dette her tilfælde FakturaID) ud fra databasen, for at skrive det i min textbox. ER det så forkert af mig at skrive den i Selectcommand.Parameters? Det skal lige tilføjes, at gør jeg det ikke, så får jeg stadig no value given..... fejlen.

FakturaID er forøvrigt et autonummeringsfelt - hvis det har nogen betydning?
Avatar billede the_party_dog Nybegynder
25. juli 2006 - 10:07 #5
Ah.... Nu giver det hele lidt mere mening :-)

Nu skal jeg lige have styr på lidt.

Du vil vælge din "FakuraID"(Mangler der ikke et T i navnet??) kolonne i din tabel. Vil du kun vælge den, eller vil du vælge alle oplysninger / kolonner som passer til et FakturaID ?

Hvis du kun vil have et enkelt FakturaID pillet ud af din tabel, så er din dataAdapter lidt overkill.

da = new OleDbDataAdapter("SELECT FakuraID FROM Faktura WHERE
FakturaID = @fakid", cn); --- Denne linje undre mig lidt, du søger efter et fakturaId, som skal være lig(=) med det som du sender med som parameter. Hvad vil du gerne opnå?

Hvis du lige giver en kort beskrivelse omkring hvad du vil opnå, tror jeg vi finder en løsning til dig hurtigt.
Avatar billede simsen Mester
25. juli 2006 - 10:18 #6
Det eneste jeg vil med den select kommando, du har set, er at teste, jeg har forbindelse til databasen. Jeg har forsøgt (fordi jeg netop også var i vildrede om jeg kunne hente data ud på det, jeg spurgte på i min WHERE del) at hende Faktura.KundeID, men med samme fejl. Se længere nede, hvordan min "rigtige" select kommando ser ud.

Jeg vil hente alle linier fra Ordre, samt linien fra faktura, samt linien fra Kunder, der har med det fakId, som jeg henter ind i systemet. Det er slet og ret en faktura, jeg er igang med at udfylde, med data fra Kunder, Faktura og Ordre tabellerne.

De data jeg henter ind, skal så vises på formen, nogle som tekstfelter (så som KundeNavn, KundeAdresse osv) og selve ordrelinierne skal vises i et DataGridView på formen.

Den select, som jeg skal bruge i sidste ende er:

da = new OleDbDataAdapter("SELECT Faktura.FakturaID, Faktura.KundeID,
Faktura.Dato, Faktura.BetalingsDato, Faktura.Betalt, Kunder.KundeId,
Kunder.Navn, Kunder.Adresse, Kunder.Postnr, Kunder.Byen, Kunder.Telefonnr,
Kunder.Mobilnr, Ordre.OrdreID, Ordre.FakturaNr, Ordre.Antal,
Ordre.Ordre_VareNr, Ordre.Produkter_VareNr, Ordre.Varenavn,
Ordre.PrisExMoms, Ordre.SalgsPrisInclMoms FROM Kunder INNER JOIN (Faktura
INNER JOIN Ordre ON Faktura.FakturaID = Ordre.FakturaNr) ON Kunder.KundeId =
Faktura.KundeID WHERE FakturaID=@id", cn);
Avatar billede simsen Mester
25. juli 2006 - 10:25 #7
Hvis det er en hjælp for dig, vil jeg gerne zippe projektet ned, så du kan downloade det?
Avatar billede the_party_dog Nybegynder
25. juli 2006 - 10:27 #8
Bare som test, kan du så ikke ligge et tal ind i din sætning, istedet for din @id? Men ellers vil jeg mene at det skal se således ud:

da = new OleDbDataAdapter("SELECT Faktura.FakturaID, Faktura.KundeID,
Faktura.Dato, Faktura.BetalingsDato, Faktura.Betalt, Kunder.KundeId,
Kunder.Navn, Kunder.Adresse, Kunder.Postnr, Kunder.Byen, Kunder.Telefonnr,
Kunder.Mobilnr, Ordre.OrdreID, Ordre.FakturaNr, Ordre.Antal,
Ordre.Ordre_VareNr, Ordre.Produkter_VareNr, Ordre.Varenavn,
Ordre.PrisExMoms, Ordre.SalgsPrisInclMoms FROM Kunder INNER JOIN (Faktura
INNER JOIN Ordre ON Faktura.FakturaID = Ordre.FakturaNr) ON Kunder.KundeId =
Faktura.KundeID WHERE FakturaID=@id", cn);

da.SelectCommand.Parameters.Add("@id", OleDbType.Integer);
da.SelectCommand.Parameters["@id"].Value = [INDSÆT VARIABLE NAVN/BRUGER INDTASTNING];

[] viser at du skal indsætte en variabel med en gyldig int værdi. Start med at lave en int variabel til test.
Avatar billede the_party_dog Nybegynder
25. juli 2006 - 10:37 #9
Zip du det bare, så kan det være jeg kan se lidt mere ud af det... Men prøv lige mit seneste eksempel...
Avatar billede simsen Mester
25. juli 2006 - 10:41 #10
Nu fremkommer den igen med "No value given...."

med hensyn til din [], så er det ikke en indtastning brugeren foretager, det er et felt i et datagridview på form1, som brugeren står på, når han klikker på knappen, for at få vist fakturaen.

Du får lige her hele koden

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;

namespace ANSI
{
    public partial class FakturaVis : Form
    {
        int fakid;
        private DataViewManager dsView;
        private DataSet ds;
        private OleDbDataAdapter da;
        private OleDbCommandBuilder cBuilder;
        string myDB = "c:\\ANSI\\Fakturasystem.mdb";



        public FakturaVis(string id)
        {
            InitializeComponent();
            this.fakid = Convert.ToInt32(id);
        }
               
        private void FakturaVis_Load(object sender, EventArgs e)
        {
            txtID.Text = fakid.ToString();
            loadFakturaVis();
        }

        private void loadFakturaVis()
        {
            //create a connection string to the access database
            OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;
                                        User Id=;Password=;
                                        Data Source=" + myDB);

            // Create the DataSet     
            ds = new DataSet("FakturaOrdre");

            // Fill the Dataset with Kunder, map Default Tablename
            // "Table" to "Kunder".
            //da = new OleDbDataAdapter("SELECT FakturaID FROM Faktura WHERE FakturaID=@fakid", cn);

            da = new OleDbDataAdapter("SELECT Faktura.FakturaID, Faktura.KundeID, Faktura.Dato, Faktura.BetalingsDato, Faktura.Betalt, Kunder.KundeId, Kunder.Navn, Kunder.Adresse, Kunder.Postnr, Kunder.Byen, Kunder.Telefonnr, Kunder.Mobilnr, Ordre.OrdreID, Ordre.FakturaNr, Ordre.Antal, Ordre.Ordre_VareNr, Ordre.Produkter_VareNr, Ordre.Varenavn, Ordre.PrisExMoms, Ordre.SalgsPrisInclMoms FROM Kunder INNER JOIN (Faktura INNER JOIN Ordre ON Faktura.FakturaID = Ordre.FakturaNr) ON Kunder.KundeId = Faktura.KundeID WHERE FakturaID=@fakid", cn);

            da.SelectCommand.Parameters.Add("@fakid", OleDbType.Integer);

            da.SelectCommand.Parameters["@fakid"].Value = 5;


            da.TableMappings.Add("Table", "Ordre");
            da.Fill(ds);

            // The DataViewManager returned by the DefaultViewManager
            // property allows you to create custom settings for each
            // DataTable in the DataSet.
            dsView = ds.DefaultViewManager;

            // Databinding for the Grid's
            dgrOrdre.DataSource = dsView;
            dgrOrdre.DataMember = "Ordre";

        } 


    }
}
Avatar billede the_party_dog Nybegynder
25. juli 2006 - 10:44 #11
Kan du ikke lige smide et større udsnit af den exception du får? Der må står nogle linje nr og funktions kald...
Avatar billede simsen Mester
25. juli 2006 - 10:59 #12
ExceptionSystem.Data.OleDb.OleDbException: No value given for one or more required paramters.
at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPRAMS dbParams, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Obect& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
at ANSI.FakturaVis.loadFakturaVis() in c:\ANSI\ANSI\FakturaVis.cs:line 148

Linie 148 i koden siger således:

            da.Fill(ds);
Avatar billede the_party_dog Nybegynder
25. juli 2006 - 11:09 #13
Det virker meget meget mystisk.....

Nu prøver vi lige at ligge dit 5 tal ind som en del af sql sætningen til din dataAdapter.

da = new OleDbDataAdapter("SELECT Faktura.FakturaID, Faktura.KundeID, Faktura.Dato, Faktura.BetalingsDato, Faktura.Betalt, Kunder.KundeId, Kunder.Navn, Kunder.Adresse, Kunder.Postnr, Kunder.Byen, Kunder.Telefonnr, Kunder.Mobilnr, Ordre.OrdreID, Ordre.FakturaNr, Ordre.Antal, Ordre.Ordre_VareNr, Ordre.Produkter_VareNr, Ordre.Varenavn, Ordre.PrisExMoms, Ordre.SalgsPrisInclMoms FROM Kunder INNER JOIN (Faktura INNER JOIN Ordre ON Faktura.FakturaID = Ordre.FakturaNr) ON Kunder.KundeId = Faktura.KundeID WHERE FakturaID=5", cn);

Jeg har nærlæst msdn og andre sider, vi bruger parameters korrekt og skriver dem lige efter bogen... Så hvorfor vi får den fejl, det ander jeg ikke....
Avatar billede simsen Mester
25. juli 2006 - 11:13 #14
Jeg har forsøgt at indsætte 5 istedet for fakid, men med samme resultat. Dog hvis jeg kun tager den oprindelige select, så får jeg ingen fejl. Men hvordan får jeg nu skrevet FakturaID ud til eksemepelvis txtFakturanr.Text?

Hvis jeg kan få det til at fungere, så må jeg jo tage select kommandoen (den jeg skal bruge) - lidt efter lidt, og se, hvor den fejler.
Avatar billede simsen Mester
25. juli 2006 - 11:14 #15
Hov glemte lige at tilføje. Det undrer også mig, for jeg har haft den til at virke (altså den store select kommando), dog med en datareader, hvis det har nogen betydning.
Avatar billede the_party_dog Nybegynder
25. juli 2006 - 12:02 #16
OleDbDataAdapter da = new OleDbDataAdapter();

            da.SelectCommand.CommandText = "SELECT Faktura.FakturaID, Faktura.KundeID, Faktura.Dato, Faktura.BetalingsDato, Faktura.Betalt, Kunder.KundeId, Kunder.Navn, Kunder.Adresse, Kunder.Postnr, Kunder.Byen, Kunder.Telefonnr, Kunder.Mobilnr, Ordre.OrdreID, Ordre.FakturaNr, Ordre.Antal, Ordre.Ordre_VareNr, Ordre.Produkter_VareNr, Ordre.Varenavn, Ordre.PrisExMoms, Ordre.SalgsPrisInclMoms FROM Kunder INNER JOIN (Faktura INNER JOIN Ordre ON Faktura.FakturaID = Ordre.FakturaNr) ON Kunder.KundeId = Faktura.KundeID WHERE FakturaID=@fakid";
            da.SelectCommand.Connection = cn;

            da.SelectCommand.Parameters.Add("@fakis", OleDbType.Integer);
            da.SelectCommand.Parameters["@fakis"].Value = 5;


Netop fordi det har virker i din datareader, burde det bestemt også virker med din DataAdapter.

Jeg ville forsøg at lave en SELECT * på en eller anden tabel. Se om det virkede. Bagefter efter ville jeg lave noget mini test med at søge på en ting. Til sidst ville jeg udbygge det lille eksempel med at bruge parameter.
Avatar billede simsen Mester
26. juli 2006 - 08:33 #17
party dog

Tak for hjælpen igår. Jeg aner ikke hvordan og hvorledes men lige pludselig virker l.....

Smid et svar og du får dine velfortjente points

mvh
simsen :-)
Avatar billede the_party_dog Nybegynder
26. juli 2006 - 11:22 #18
Hey simsen.

Det glæder mig at du kom videre.... Noget værre noget når man gør tingene efter bogen og det så ikke vil virke...
Avatar billede simsen Mester
26. juli 2006 - 14:44 #19
party dog

Yeps - det ER frustrerende - specielt for en newbee som jeg. Men også en tilfredsstillelse, når det så endelig lykkes.

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