Avatar billede jhoumann Nybegynder
20. marts 2007 - 21:37 Der er 15 kommentarer

Problemer med UPDATE command til ACCESS DB med C#

Har en applikation, hvor det kniber med at få mine @parametre til at virke. DVS min update SQL (SQLOpdater) genererer ingen fejl, men data i DB bliver ikke ændret.
Det virker, hvis jeg skriver værdier direkte i web.config, eksempelvis:
UPDATE KundeTabel SET Navn = 'Hans' WHERE Nr = @intNR

men ikke hvis jeg skriver:

UPDATE KundeTabel SET Navn = @strNavn WHERE Nr = @intNR


Min INSERT og SELECT med @parametre fungerer fint.

------------------------------------------------------------

Uddrag af min web.config:

<configuration>
 
  <appSettings>
    <add key="SQLInsertString"
        value = "INSERT INTO KundeTabel (Navn,Adresse,PostNr,Byen,TelefonNr,AktuelSaldo,KoebaarTilDato,Bemaerk) VALUES (@strNavn,@strAdresse,@strPostNr,@strByen,@strTelefonNr,@dblAktuelSaldo,@dblKoebAarTilDato,@strBemaerk)" />
    <add key="SQLFindKundeNr"
    value ="SELECT * FROM KundeTabel WHERE Nr = @intNr"/>
    <add key="SQLOpdater"
    value ="UPDATE KundeTabel SET Navn = @strNavn, Adresse = @strAdresse, PostNr = @strPostNr, Byen = @strByen, TelefonNr = @strTelefonNr, Bemaerk = @strBemaerk WHERE Nr = @intNr "/>
    </appSettings>
  <connectionStrings>

    <add name="KundeConnection"
      connectionString="Provider=Microsoft.Jet.OLEDB.4.0;
      Data Source=|DataDirectory|NavneDb.mdb"
      providerName="System.Data.OleDb" />

  </connectionStrings>
----------------------------------------------------------------
Min opdateringsmetode:

protected void OpDater(object sender, EventArgs e)
    {
        OleDbConnection MyConnection;
        OleDbCommand MyCommand;
        MyConnection = new OleDbConnection();
        MyConnection.ConnectionString = ConfigurationManager.ConnectionStrings["KundeConnection"].ConnectionString;

        string strSQL = System.Configuration.ConfigurationManager.AppSettings.Get("SQLOpdater1");
        MyCommand = new OleDbCommand(strSQL, MyConnection);
        try
        {
            MyConnection.Open();
            MyCommand.Parameters.Add("@intNr", OleDbType.BigInt);
                 
            MyCommand.Parameters["@intNr"].Value = Convert.ToInt64(lblKundeNr.Text);

            MyCommand.Parameters.Add("@strNavn", OleDbType.VarChar);
            MyCommand.Parameters.Add("@strAdresse", OleDbType.VarChar);
            MyCommand.Parameters.Add("@strPostNr", OleDbType.VarChar);
            MyCommand.Parameters.Add("@strByen", OleDbType.VarChar);
            MyCommand.Parameters.Add("@strTelefonNr", OleDbType.VarChar);
            MyCommand.Parameters.Add("@strBemaerk", OleDbType.VarChar);

            MyCommand.Parameters["@strNavn"].Value = tbNavn.Text;
            MyCommand.Parameters["@strAdresse"].Value = tbAdresse.Text;
            MyCommand.Parameters["@strPostNr"].Value = tbAdresse.Text;
            MyCommand.Parameters["@strByen"].Value = tbBy.Text;
            MyCommand.Parameters["@strTelefonNr"].Value = tbTelefon.Text;
            MyCommand.Parameters["@strBemaerk"].Value = tbBemaerk.Text;
           
            MyCommand.ExecuteNonQuery();
            tbMeddelelse.Text = "Kundedata er ændret!";

        }
        catch (Exception exept)
        {
            tbMeddelelse.Text = Convert.ToString(exept);
        }

        MyConnection.Close();
       
           
    }
Avatar billede jhoumann Nybegynder
20. marts 2007 - 21:40 #1
I linien: string strSQL = System.Configuration.ConfigurationManager.AppSettings.Get("SQLOpdater1");
står der naturligvis: "SQLOpdater" (ikke SQLOpdater1)
Avatar billede kalp Novice
20. marts 2007 - 23:50 #2
prøv at udskrive commandtext og se om der mangler noget i sql'en.


// MyCommand.ExecuteNonQuery();
            tbMeddelelse.Text = MyCommand.CommandText;
Avatar billede jhoumann Nybegynder
21. marts 2007 - 06:05 #3
Den viser:
UPDATE KundeTabel SET Navn = @strNavn, Adresse = @strAdresse, PostNr = @strPostNr, Byen = @strByen, TelefonNr = @strTelefonNr, Bemaerk = @strBemaerk WHERE Nr = @intNr
Avatar billede kalp Novice
21. marts 2007 - 08:25 #4
sæt et break point i starten af metoden og tjek hvad der sker linje for linje... måske finder den ikke noget ved kundeid'et..
Avatar billede jhoumann Nybegynder
21. marts 2007 - 09:20 #5
Ja, det vil jeg gøre, men det underlige er at når jeg sætter faste værdier ind: Navn = 'Hans' og beholder WHERE-sætningen så bliver data ajourført rigtigt. Altså på den pågældende post.
Avatar billede dr_chaos Nybegynder
21. marts 2007 - 09:54 #6
prøv evt at sætte en størrelse på
  MyCommand.Parameters.Add("@strNavn", OleDbType.VarChar,255);
flyt din MyConnection.Open(); ned til lige over
MyCommand.ExecuteNonQuery();
Avatar billede jhoumann Nybegynder
21. marts 2007 - 10:20 #7
Samme Resultat.
Nu har jeg ændret til:

MyCommand.Parameters.Add("@intNr", OleDbType.BigInt);
                 
            MyCommand.Parameters["@intNr"].Value = Convert.ToInt16(lblKundeNr.Text);
           

            MyCommand.Parameters.Add("@strNavn", OleDbType.VarChar,35);
            MyCommand.Parameters.Add("@strAdresse", OleDbType.VarChar,50);
            MyCommand.Parameters.Add("@strPostNr", OleDbType.VarChar,10);
            MyCommand.Parameters.Add("@strByen", OleDbType.VarChar,50);
            MyCommand.Parameters.Add("@strTelefonNr", OleDbType.VarChar,20);
            MyCommand.Parameters.Add("@strBemaerk", OleDbType.VarChar,50);

            MyCommand.Parameters["@strNavn"].Value = tbNavn.Text;
            MyCommand.Parameters["@strAdresse"].Value = tbAdresse.Text;
            MyCommand.Parameters["@strPostNr"].Value = tbAdresse.Text;
            MyCommand.Parameters["@strByen"].Value = tbBy.Text;
            MyCommand.Parameters["@strTelefonNr"].Value = tbTelefon.Text;
            MyCommand.Parameters["@strBemaerk"].Value = tbBemaerk.Text;

            MyConnection.Open();
            MyCommand.ExecuteNonQuery();
           
            // tbMeddelelse.Text = MyCommand.CommandText;
            tbMeddelelse.Text = "Kundedata er ændret!";
Avatar billede jhoumann Nybegynder
21. marts 2007 - 10:36 #8
Jeg tror faktisk.... efter nærmere overvejelse at den ikke får noget match på sidste del af SQL-sætningen: WHERE Nr = @intNr
Hvordan kan jeg få udskrevet strengen som bruges og indholdet af @intNr?
Avatar billede kalp Novice
21. marts 2007 - 11:40 #9
som jeg sagde ..debug..

hvis denne indeholder noget

lblKundeNr.Text

så prøv bare med

MyCommand.Parameters["@intNr"].Value = lblKundeNr.Text;
Avatar billede kalp Novice
21. marts 2007 - 11:45 #10
eller helt anderledes.. istedet for

MyCommand.Parameters.Add("@intNr", OleDbType.BigInt);
MyCommand.Parameters["@intNr"].Value = Convert.ToInt16(lblKundeNr.Text);

så nøjes med

MyCommand.Parameters.AddWithValue("@intNr",lblKundeNr.Text);
Avatar billede jhoumann Nybegynder
21. marts 2007 - 17:40 #11
Nej det hjælper ikke. Nå , men når jeg laver det sån' her:

string strSQL = "UPDATE KundeTabel SET Navn = '";
        strSQL += tbNavn.Text + "',Adresse = '";
        strSQL += tbAdresse.Text + "',PostNr = '";
        strSQL += tbPostNr.Text + "',Byen = '";
        strSQL += tbBy.Text + "',TelefonNr = '";
        strSQL += tbTelefon.Text + "',Bemaerk = '";
        strSQL += tbBemaerk.Text + "' WHERE Nr = ";
        strSQL += lblKundeNr.Text;

     
        MyCommand = new OleDbCommand(strSQL, MyConnection);


Så virker det.
Jeg er meget sikker på at det er @intNr der giver problemer. Altså at den ikke får match på WHERE-clausen. Ellers ville den caste en exception. Den siger at der ikke er opdateret poster.

Strengen i web.config kan da ikke have forkert format til en UPDATE?

<add key="SQLOpdater"
    value ="UPDATE KundeTabel SET Navn = @strNavn, Adresse = @strAdresse, PostNr = @strPostNr, Byen = @strByen, TelefonNr = @strTelefonNr, Bemaerk = @strBemaerk WHERE Nr = @intNr"/>

I databasen er Nr defineret som autonummerering, hvilket vel er en integer af en slags?
Avatar billede neoman Novice
23. marts 2007 - 12:14 #12
Mig bekendt så genkender OldeDbCommand ikke parameternavne, men kun deres rækkefølge..

Jeg har nogle SQL-statements magen til dine, hvor der i stedet for parameternavn står et ? og det fungerer fint. Dit KundeNr skulle så stå sidst i parameterlisten, og prøv også at erstatte parameternavnene med ? i selve SQl-sætningen.

En Automnummerering i Access er en Long Integer i Access-speak og fungerer som en Int32 i min VS, mens en Integer i Access funker som Int16 her i VS.
Avatar billede neoman Novice
23. marts 2007 - 12:36 #13
"The OLE DB .NET Provider does not support named parameters for passing parameters to an SQL statement or a stored procedure called by an OleDbCommand when CommandType is set to Text. In this case, the question mark (?) placeholder must be used. For example:

SELECT * FROM Customers WHERE CustomerID = ?

Therefore, the order in which OleDbParameter objects are added to the OleDbParameterCollection must directly correspond to the position of the question mark placeholder for the parameter in the command text.
"
Avatar billede jhoumann Nybegynder
23. marts 2007 - 18:33 #14
Hmm, jeg kan jo godt udføre en SELECT, INSERT og DELETE ved hjælp af @parametre. Det er bare UPDATE der ikke virker. Jeg synes netop det er CommandType Text??

Hvordan mener du jeg skal strikke min sætning om?
Den virker jo når jeg bruger en traditionel SQLstring.
Avatar billede neoman Novice
23. marts 2007 - 22:15 #15
Jeg tror den "æder" parameternavnene uanset, men prøv f.eks. at liste paremetrene i den rækkefølge de optræder i din UPDATE , så alt som refererer til din @intNr står sidst i listen af MyCommand.Parameters.add - statements

Du kan læse lidt om dem her :
http://msdn2.microsoft.com/en-us/library/system.data.oledb.oledbcommand.parameters.aspx
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