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 tema
Cloud & AI
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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.