Avatar billede simsen Mester
05. juli 2006 - 19:47 Der er 30 kommentarer og
1 løsning

Syntax fejl i update statement

Hej

Jeg får en sytax error in update statement, men kan ikke se, hvor jeg har en fejl. Kan én af jer?

OleDbConnection minCon = new OleDbConnection();
            minCon.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\ANSI\\fakturasystem.mdb";

            OleDbCommand minCommand = new OleDbCommand("UPDATE Firmanavn = @Firmanavn" + "WHERE FirmaID = @FirmaID", minCon);

            minCommand.Parameters.Add(new OleDbParameter("@FirmaID", OleDbType.Integer, 5, firmaIDTextBox1.Text));

            minCommand.Parameters.Add(new OleDbParameter("@Firmanavn", txtFirmanavn.Text));
           
            minCon.Open();

            try
            {
                minCommand.ExecuteNonQuery();
            }
            catch (OleDbException ex)
            {
                MessageBox.Show("OleDbException" + ex);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Exception" + ex);
            }
            finally
            {
                    minCon.Close();
            }

mvh
simsen :-)
Avatar billede arne_v Ekspert
05. juli 2006 - 19:54 #1
syntaxen for UPDATE er:

UPDATE tabelnavn SET feltnavn = @xxx WHERE andetfeltnavn = @yyy

der mangler noget i din SQL
Avatar billede erikjacobsen Ekspert
05. juli 2006 - 19:55 #2
Syntaxen er vist "UPDATE tabelnavn SET Firmanavn = @Firmanavn WHERE FirmaID = @FirmaID"
Avatar billede simsen Mester
05. juli 2006 - 20:05 #3
I har selvfølgelig ret........ jeg har været SÅ fokuseret på de parametre (som er første gang jeg for mig selv prøver dem), jeg har glemt alt andet....

Nu får jeg dog en anden fejl i samme sætning;

@Firmanavn has no default value

Kan I fortælle mig hvad og hvordan og hvorledes?

mvh
simsen
Avatar billede arne_v Ekspert
05. juli 2006 - 20:08 #4
du mangler

minCommand.Parameters["@firmanavn"].Value = "en vaerdi";
Avatar billede arne_v Ekspert
05. juli 2006 - 20:08 #5
du kan selvfoelgelig ogsaa tilfoeje vaerdien i din Add ligesom du goer for den
anden parameter
Avatar billede simsen Mester
05. juli 2006 - 20:14 #6
Ok - var ikke klar over, at når værdien er text, der skulle en med.

minCommand.Parameters.Add(new OleDbParameter("@Firmanavn", OleDbType.Char, 255, txtFirmanavn.Text));

Nu forsøger jeg at sætte en værdi ind, men jeg får samme fejl?

Det er en type Tekst i databasen, og den nærmeste jeg mener at kunne komme er vel char?
Avatar billede arne_v Ekspert
05. juli 2006 - 20:28 #7
umiddelbart lyder OleDbType.LongVarChar mere passende
Avatar billede arne_v Ekspert
05. juli 2006 - 20:30 #8
og jeg tror at du skal satse paa .Value= maaden at goere det paa
Avatar billede simsen Mester
05. juli 2006 - 20:41 #9
Det der skal stå imellem "en vaerdi" er det så eksempelvis txtFirmanavn.Text?
Avatar billede arne_v Ekspert
05. juli 2006 - 20:50 #10
minCommand.Parameters["@firmanavn"].Value = txtFirmanavn.Text;
Avatar billede simsen Mester
05. juli 2006 - 21:02 #11
Bruger jeg de følgende to linier

minCommand.Parameters["@FirmaID"].Value = firmaIDTextBox1.Text;
minCommand.Parameters["@Firmanavn"].Value = txtFirmanavn.Text;

får jeg følgende fejl:
An OleDbParameter with ParameterName '@FirmaID' is not contained by this OleDbParameterCollection?

Er det fordi, jeg også skal bruge Add men uden OleDbType?
Avatar billede simsen Mester
05. juli 2006 - 21:11 #12
Hmmmmmm - det var det - nu fremkommer den da ikke længere med fejl, men gemmer heller intet i databasen?
Avatar billede arne_v Ekspert
05. juli 2006 - 21:13 #13
hvis ikke der er noget osm matcher WHERE betingelsen saa goer den UPDATE jo ingenting

(hvis du vil indsaette en ny raekke skal du bruge INSERT)
Avatar billede morhan Novice
05. juli 2006 - 21:15 #14
Prøv om det hjælper at indsætte et mellemrum mellem @Firmanavn og WHERE
Avatar billede simsen Mester
05. juli 2006 - 21:25 #15
arne

Jamen jeg har en FirmaID i databasen der hedder 1 - men det er et autonumerisk felt - har det noget at sige?

morhan
Jeg har ændret det, så der er mellemrum - det gjorde jeg i første hug, da jeg satte tabel og SET ind
Avatar billede arne_v Ekspert
05. juli 2006 - 21:33 #16
det burde vaere OK

proev lige at erstatte

minCommand.ExecuteNonQuery();

med

MessageBox.Show("UPDATE rettede i " + minCommand.ExecuteNonQuery() + " raekker");
Avatar billede simsen Mester
05. juli 2006 - 21:39 #17
Den skriver den rettede i 0 rækker.

Men jeg er altså sikker på at ID er 1 - jeg selecter dem (ved brug af datagridview) og der ser jeg at FirmaID står med "1"
Avatar billede simsen Mester
05. juli 2006 - 21:41 #18
Bruger jeg istedet denne her:

OleDbCommand minCommand = new OleDbCommand("UPDATE Firmaoplysninger SET Firmanavn = @Firmanavn" + " WHERE FirmaID = 1", minCon);

Så gemmer den i databasen - men som sagt, jeg kan læse mig frem til at FirmaID = 1 - så jeg fatter nada?
Avatar billede arne_v Ekspert
05. juli 2006 - 21:44 #19
proev lige med:

minCommand.Parameters["@FirmaID"].Value = int.Parse(firmaIDTextBox1.Text);
Avatar billede simsen Mester
05. juli 2006 - 21:50 #20
Det hjalp heller ikke - stadig opdatering i 0 rækker

Du får lige min kode her, som den ser ud nu:

OleDbConnection minCon = new OleDbConnection();
            minCon.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\ANSI\\fakturasystem.mdb";

            OleDbCommand minCommand = new OleDbCommand("UPDATE Firmaoplysninger SET Firmanavn = @Firmanavn" + " WHERE FirmaID = @FirmaID", minCon);
            //OleDbCommand minCommand = new OleDbCommand("UPDATE Firmaoplysninger SET Firmanavn = @Firmanavn" + " WHERE FirmaID = 1", minCon);
                   
            minCommand.Parameters.Add(new OleDbParameter("@FirmaID", firmaIDTextBox1.Text));
            minCommand.Parameters.Add(new OleDbParameter("@Firmanavn", txtFirmanavn.Text));

            minCommand.Parameters["@FirmaID"].Value = int.Parse(firmaIDTextBox1.Text);
            //minCommand.Parameters["@FirmaID"].Value = firmaIDTextBox1.Text;
            minCommand.Parameters["@Firmanavn"].Value = txtFirmanavn.Text;
            minCon.Open();

            try
            {
                MessageBox.Show("UPDATE rettede i " + minCommand.ExecuteNonQuery() + " raekker");
                //minCommand.ExecuteNonQuery();
            }
            catch (OleDbException ex)
            {
                MessageBox.Show("OleDbException" + ex);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Exception" + ex);
            }
            finally
            {
                    minCon.Close();
            }
Avatar billede arne_v Ekspert
05. juli 2006 - 21:59 #21
minCommand.Parameters.Add(new OleDbParameter("@FirmaID", firmaIDTextBox1.Text));
            minCommand.Parameters.Add(new OleDbParameter("@Firmanavn", txtFirmanavn.Text));

->

            minCommand.Parameters.Add("@FirmaID", OleDbType.Integer);
            minCommand.Parameters.Add("@Firmanavn", OleDbType.VarChar, 50);
Avatar billede simsen Mester
05. juli 2006 - 22:03 #22
Det hjalp heller ikke - stadig 0 rækker
Avatar billede simsen Mester
05. juli 2006 - 22:11 #23
Kopierer lige database rækken for dig:

FirmaID    Firmanavn    Adresse    Postnr    Bynavn    CVRNummer    Bank    BankRegnr    Bankkontonummer    Telefonnr    Mobilnr
1    sadf    Firmaadresse    7100    Vejle    11111111    Sydbank    8888    4444444    75999999    20202020

Som du kan se - så ER der altså et FirmaID med 1 :-)
Avatar billede simsen Mester
05. juli 2006 - 22:34 #24
Jeg har lige kigget i databasen - den gemmer ikke, det jeg skriver i txtFirmanavn men skriver istedet "1", når jeg gemmer med

OleDbCommand minCommand = new OleDbCommand("UPDATE Firmaoplysninger SET Firmanavn = @Firmanavn" + " WHERE FirmaID = 1", minCon);

Jeg har altså lige checket i Design - ID står som firmaIDTextBox1 og Firnavn står som txtFirmanavn.....

Jeg bliver altså mere og mere rundforvirret :-/
Avatar billede arne_v Ekspert
06. juli 2006 - 04:13 #25
prøv lige og hav parameterne i samme rækkefølge som du har dem i SQL sætningen
Avatar billede arne_v Ekspert
06. juli 2006 - 04:14 #26
OleDbCommand minCommand = new OleDbCommand("UPDATE Firmaoplysninger SET Firmanavn = @Firmanavn" + " WHERE FirmaID = @FirmaID", minCon);

minCommand.Parameters.Add("@Firmanavn", OleDbType.VarChar, 50);
minCommand.Parameters.Add("@FirmaID", OleDbType.Integer);

minCommand.Parameters["@Firmanavn"].Value = txtFirmanavn.Text;
minCommand.Parameters["@FirmaID"].Value = int.Parse(firmaIDTextBox1.Text);
Avatar billede simsen Mester
06. juli 2006 - 06:07 #27
Det her virker :-)

Men nu vil jeg også gerne lære noget.......

Så når du lige smidet et svar, for at få dine velfortjente points, gider du så svare på følgende:

Jeg har sammenlignet og sammenlignet og det eneste forskel, jeg kan se, du har gjort, er rækkefølgen af minCommand.Parameters - var det der fejlen var, at de skal stå i samme rækkefølge som hvordan du skriver dem ind i din update statement?

Er int.Parse det samme som en convert - hvis ikke - hvad laver den?

mvh
en meget glad

simsen :-)
Avatar billede simsen Mester
06. juli 2006 - 06:57 #28
hov så ikke lige din kommentar fra 06/07-2006 04:13:10 - så svaret med rækkefølgen har jo givet sig selv ved det...

Så det er kun følgende, jeg mangler at vide:

Er int.Parse det samme som en convert - hvis ikke - hvad laver den?

Husk at ligge et svar, så du kan få dine points.

Og tak for din store tålmodighed, jeg er bestemt én af dem, der værdsætter, at I er nogle "hajer", der gider hjælpe sådan én som mig, der er i fuld gang med at lære og lære :-)

mvh
simsen :-)
Avatar billede arne_v Ekspert
06. juli 2006 - 13:50 #29
int.Parse og Convert.ToInt32 gør det samme

fra docs af den sidste:

[C#]
public static int ToInt32(
  string value
);

Parameters
value
A String containing a number to convert.
Return Value
A 32-bit signed integer equivalent to the value of value.

-or-

Zero if value is a null reference (Nothing in Visual Basic).

Remarks
The return value is the result of invoking the Int32.Parse method on value.
Avatar billede arne_v Ekspert
06. juli 2006 - 13:50 #30
og svar
Avatar billede arne_v Ekspert
06. juli 2006 - 13:51 #31
det med rækkefølgen er et problem i nogle ældre drivere (OLE DB og ODBC)

SQLServer, Oracle, MySQL .NET providere har ikke det problem
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