25. juli 2006 - 09:14Der 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"
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);
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.....
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?
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.
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);
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 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);
// 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";
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
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....
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.
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.
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.
Yeps - det ER frustrerende - specielt for en newbee som jeg. Men også en tilfredsstillelse, når det så endelig lykkes.
simsen :-)
Synes godt om
Ny brugerNybegynder
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.