La difficulté à l'insérer DateTime dans l'Accès avec OleDb
- Je obtenir le "type de données incompatible dans l'expression des critères" d'erreur lorsque vous essayez d'insérer une ligne de données dans Access. Après de déconner un peu, j'ai rétréci vers le bas à l'DateTime être le problème.
Voici mon code:
class ABGDA
{
private OleDbConnection dbConn;
private OleDbCommand dbCmd;
private OleDbDataReader dbReader;
private string sConnection;
private string sql;
private ABG abg;
public void insertProgressNotes(ABG ABG)
{
abg = ABG;
sConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" +
"Data Source=SimEMR.accdb";
dbConn = new OleDbConnection(sConnection);
dbConn.Open();
sql = "INSERT INTO ABG (AccountNo, LabDate, PAO2, PACO2, SAO2, Bicarbonate, BaseExcess, " +
"O2Setting, SetRate, SetPEEP, FiO2) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
dbCmd = new OleDbCommand();
dbCmd.CommandText = sql;
dbCmd.Connection = dbConn;
dbCmd.Parameters.Add("AccountNo", OleDbType.Integer).Value = abg.AccountNo;
dbCmd.Parameters.Add("LabDate", OleDbType.DBTimeStamp).Value = abg.LabDate;
dbCmd.Parameters.Add("PAO2", OleDbType.Double).Value = abg.PAO2;
dbCmd.Parameters.Add("PACO2", OleDbType.Double).Value = abg.PACO2;
dbCmd.Parameters.Add("SAO2", OleDbType.Double).Value = abg.SAO2;
dbCmd.Parameters.Add("Bicarbonate", OleDbType.Double).Value = abg.Bicarbonate;
dbCmd.Parameters.Add("BaseExcess", OleDbType.Double).Value = abg.BaseExcess;
dbCmd.Parameters.Add("O2Setting", OleDbType.Char).Value = abg.O2Setting;
dbCmd.Parameters.Add("SetRate", OleDbType.Double).Value = abg.SetRate;
dbCmd.Parameters.Add("SetPEEP", OleDbType.Double).Value = abg.SetPeep;
dbCmd.Parameters.Add("FiO2", OleDbType.Double).Value = abg.FiO2;
dbCmd.ExecuteNonQuery();
dbConn.Close();
}
}
abg.LabDate a été obtenue à l'aide de DateTime.Maintenant
La chose étrange est que j'ai utilisé DBTimeStamp dans une autre classe pour une instruction insert et que semblait très bien fonctionner. Quelqu'un aurait-il une idée sur ce que mon problème peut-être?
Mise à JOUR: Il semble que j'ai trouvé une solution, et je n'ai aucune idée de pourquoi ça a fonctionné. J'ai changé de dga.LabDate à une chaîne et sauvé la date/heure actuelle.
abg.LabDate = DateTime.Now.ToString();
Puis quand je vais pour l'insérer dans la base de données, j'ai analysé de nouveau à un DateTime et ça a fonctionné...
dbCmd.Parameters.Add("LabDate", OleDbType.DBTimeStamp).Value = DateTime.Parse(abg.LabDate);
comment dois-je faire? Quand j'ai passez la souris sur dbCmd.CommandText, il reste juste montre la chaîne initiale-je configurer
votre LabDate aurait millisecondes, ce qui je pense ne sera pas traitée par l'accès, essayez donc d'en tronquant la partie.
J'espère que vous n'allez pas courir dans les paramètres régionaux des problèmes, aussi souvent que vous allez vous retrouver avec les dates ambiguës, dont l'Accès décidera devrait être l'Amérique. Si LabDate est toujours Maintenant(), pourquoi ne pas définir la valeur par défaut dans la table de Maintenant() et de laisser de la date de la mise à jour?
stackoverflow.com/questions/1004698/...
OriginalL'auteur athom | 2012-03-02
Vous devez vous connecter pour publier un commentaire.
Je pense que l'erreur est due à l'millisecondes partie présent dans votre
DateTime
qui ne sont pas gérées par l'Accès de sorte que vous pourrait tronquer les millisecondes partie et essayez de l'insérer ou dans le cas où son seulDateTime.Now
ensuite utiliser l'équivalentNow()
fonction dans l'accès.je suppose que la chaîne résultante n'a pas l'ordre de la milliseconde partie, avez-vous essayer avec
Now()
fonction je pense que vous convient le plus.La fonction Now() ne fonctionne que dans le sql? Plusieurs choses par la suite sera connecté à cet objet avec la même DateTime
Il fonctionne en sql, ne pourrait-il pas suffire pour vous ?
J'ai eu le même problème. J'ai trouvé que si la milleseconds composant de l'objet DateTime est 0, il fonctionne. Si c'est autre chose que 0, il échoue comme vous l'avez décrit.
OriginalL'auteur V4Vendetta
Je sais que cette question est ancienne. Mais j'ai juste lié à cela lorsque l'on travaille avec deux Accès et de bases de données MS SQL. Champ de l'Accès est de type Date/Heure et en MSSQL de type Datetime.
Ma solution a été d'utiliser OleDbType.Date
OriginalL'auteur fiLLLipnet
OriginalL'auteur Javed Ali