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#.
Annonceindlæg fra Computerworld it-jobbank
29. februar 2008 - 14:45
#1
meget kort svar: brug parameters !
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
29. februar 2008 - 15:16
#3
29. februar 2008 - 15:17
#4
De er gode til at håndtere DateTime, tekster med quotes i etc..
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(); } }
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); }
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); ...
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
29. februar 2008 - 18:45
#9
Hej Arne Nu sker der ting og sager. Det er fuldt fortjente point. Smid et svar.
29. februar 2008 - 19:36
#10
kommer her
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.