Avatar billede sandrasmurf Nybegynder
29. februar 2008 - 14:38 Der er 9 kommentarer og
1 løsning

Update dato felt i access med OleDBAdapter

Hej eksperter

Jeg forsøger at lave en update på et dato felt i en tabel i access gennem C# og ved brug af OleDbConnection og OleDbCommand.

Jeg får samme fejl, hvad enten jeg eksekverer følgende SQL statement fra Access eller C#. Så jeg har en formodning om at der skal benyttes tricks for at tilgå/skrive til datofelter.

"Datatyperne stemmer ikke overens i kriterieudtrykket"

SQL:
UPDATE ORDERS
SET ORDERS.SHIPDATE = '09-12-2007 12:00'
WHERE ORDERS.ORDER_ID='49';

Order_ID er et autonummerfelt og SHIPDATE er et dato og klokkeslæt felt, der er sat til standard.

Et eksempel på datoer fra tabellen i Access er "01-01-2009 12:00:00".

Når jeg fra koden kalder

OpenConnection();
string cmd = "UPDATE ORDERS SET ORDERS.START_TIME = '" + launchDate + "' WHERE LINEVARIANT_ID = '" + (int)lv.ID + "';";

Console.WriteLine(cmd);
updateCommand = new OleDbCommand(cmd, myAccessConn);
updateCommand.ExecuteNonQuery();

Så skriver den min sql streng ud som jeg forventer, men dør med samme fejlbesked som access også giver mig. Launchtime er en DateTime i ovenstående.

Hvordan skal jeg ændre min sql update statement og hvordan kalder jeg den fra c#.
Avatar billede arne_v Ekspert
29. februar 2008 - 14:45 #1
meget kort svar: brug parameters !
Avatar billede sandrasmurf Nybegynder
29. februar 2008 - 14:49 #2
Ja det er kort :-)

Har du et lille eksempel liggende på parameters. Dem kender jeg ikke. Er de generelt gode eller er de specielt velegnede til DateTimes
Avatar billede arne_v Ekspert
29. februar 2008 - 15:16 #3
Du kan starte med at læse:
  http://www.eksperten.dk/artikler/831
Avatar billede arne_v Ekspert
29. februar 2008 - 15:17 #4
De er gode til at håndtere DateTime, tekster med quotes i etc..
Avatar billede arne_v Ekspert
29. februar 2008 - 15:19 #5
Mit klassiske eksempel i C# & Access udgave (artiklen bruger SQLServer):

using System;
using System.Threading;
using System.Data.OleDb;

class MainClass
{
    public static void Main(string[] args)
    {
        OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb");
        con.Open();
        OleDbCommand cre = new OleDbCommand("CREATE TABLE dtest (i INTEGER PRIMARY KEY, d DATETIME)", con);
        cre.ExecuteNonQuery();
        OleDbCommand ins = new OleDbCommand("INSERT INTO dtest VALUES (?, ?)", con);
        ins.Parameters.Add("@i", OleDbType.Integer);
        ins.Parameters.Add("@d", OleDbType.Date);
        for(int i = 0; i < 10; i++)
        {
            ins.Parameters["@i"].Value = i;
            ins.Parameters["@d"].Value = DateTime.Now;
            ins.ExecuteNonQuery();
            Thread.Sleep(1000);
        }
        Console.WriteLine("All rows :");
        OleDbCommand sel = new OleDbCommand("SELECT * FROM dtest", con);
        OleDbDataReader rdr = sel.ExecuteReader();
        while(rdr.Read())
        {
            int i = (int)rdr[0];
            DateTime d = (DateTime)rdr[1];
            Console.WriteLine(i + " " + d);
        }
        rdr.Close();
        Console.WriteLine("Rows last 5 seconds since " + DateTime.Now + " :");
        OleDbCommand sel2 = new OleDbCommand("SELECT * FROM dtest WHERE d > ?", con);
        sel2.Parameters.Add("@d", OleDbType.Date);
        sel2.Parameters["@d"].Value = DateTime.Now.AddSeconds(-5);
        OleDbDataReader rdr2 = sel2.ExecuteReader();
        while(rdr2.Read())
        {
            int i = (int)rdr2[0];
            DateTime d = (DateTime)rdr2[1];
            Console.WriteLine(i + " " + d);
        }
        rdr2.Close();
        OleDbCommand drp = new OleDbCommand("DROP TABLE dtest", con);
        drp.ExecuteNonQuery();
        con.Close();
    }
}
Avatar billede sandrasmurf Nybegynder
29. februar 2008 - 18:15 #6
Jeg kan ikke få den til at opdatere. Der sker ingenting, når jeg kører følgende. Hvad kan der være galt?

************************************

string dbName = @"..\..\..\DB\MyDB.mdb";
dbName = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}", dbName);

System.Data.OleDb.OleDbConnection myAccessConn = new System.Data.OleDb.OleDbConnection(dbName);
myAccessConn.Open();

try
{
  string cmd = "UPDATE ORDERS SET ORDERS.START_TIME = @d WHERE ORDER_ID = @i";
  System.Data.OleDb.OleDbCommand updateCommand = new System.Data.OleDb.OleDbCommand(cmd, myAccessConn);
  updateCommand.Parameters.Add("@i", System.Data.OleDb.OleDbType.Integer);
  updateCommand.Parameters.Add("@d", System.Data.OleDb.OleDbType.DBDate);

  updateCommand.Parameters["@i"].Value = 51;
  updateCommand.Parameters["@d"].Value = new DateTime(2012, 12, 1, 0, 0, 0);

  updateCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
    Console.WriteLine(ex.StackTrace);
    Console.WriteLine(ex.InnerException.Message);
}
Avatar billede arne_v Ekspert
29. februar 2008 - 18:23 #7
Prøv:

...
string cmd = "UPDATE ORDERS SET ORDERS.START_TIME = ? WHERE ORDER_ID = ?";
...
updateCommand.Parameters.Add("@d", System.Data.OleDb.OleDbType.Date);
updateCommand.Parameters.Add("@i", System.Data.OleDb.OleDbType.Integer);
...
Avatar billede arne_v Ekspert
29. februar 2008 - 18:23 #8
- spørgsmåls tegn ikke @xx (OLE DB er ikke helt så smart som SqlClient)
- rækkefølge
- Date ikke DBDate
Avatar billede sandrasmurf Nybegynder
29. februar 2008 - 18:45 #9
Hej Arne

Nu sker der ting og sager. Det er fuldt fortjente point. Smid et svar.
Avatar billede arne_v Ekspert
29. februar 2008 - 19:36 #10
kommer her
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