Проблема вставки DateTime в Access с OleDb - PullRequest
4 голосов
/ 02 марта 2012

При попытке вставить строку данных в Access появляется ошибка «Несоответствие типов данных в выражении критерия».Немного покопавшись, я сузил его до проблемы DateTime.

Вот мой код:

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.* Странная вещь в том, что я использовал DBTimeStamp в другом классе для оператора вставки, и это, похоже, работало просто отлично.Кто-нибудь имеет представление о том, что моя проблема может быть?

ОБНОВЛЕНИЕ: Кажется, я нашел решение, и я понятия не имею, почему это сработало.Я изменил abg.LabDate на строку и сохранил текущую дату / время.

abg.LabDate = DateTime.Now.ToString();

Затем, когда я собираюсь вставить его в базу данных, я проанализировал его обратно в DateTime, и это сработало ...

dbCmd.Parameters.Add("LabDate", OleDbType.DBTimeStamp).Value = DateTime.Parse(abg.LabDate);

Ответы [ 3 ]

7 голосов
/ 02 марта 2012

Я думаю, что ошибка связана с миллисекундной частью, присутствующей в вашем DateTime, которая не будет обработана Access, так что вы либо можете обрезать миллисекундную часть и попробовать вставить, либо, если она только DateTime.Now, использовать эквивалентную Now() функция доступа.

insert into table1 (datecolumn) values (Now()) // Date() if not interested in the time part
3 голосов
/ 04 июня 2013

Я знаю, что этот вопрос старый.Но я просто относился к этому при работе с базами данных Access и MS SQL.Поле в Access было типа Дата / Время и в MSSQL типа Datetime.

Мое решение было использовать OleDbType.Date

    dbCmd.Parameters.Add("LabDate", OleDbType.Date).Value = DateTime.Now;
0 голосов
/ 05 июля 2016
OleDbConnection con = new OleDbConnection();
con.ConnectionString = "provider = microsoft.ace.oledb.12.0;data source = E:\\Sohkidatabase\\Sohki.accdb";
OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = @"INSERT INTO Challan_No(challan,goods,quantity,nwlm,rate,total,ident,taaff,dateissue,nature,factory,expected,palce,date)VALUES
                (" + labelchallan.Text + ",'" + textGood.Text + "'," + combQuit.Text + "," + combNwlm.Text + "," + textRate.Text + "," + textvalu.Text + ",'" + textIdent.Text + "','" + texttfclass.Text + "','" + dateTimeIssue.Text + "','" + textNatup.Text + "','" + textFact.Text + "','" + textExpDu.Text + "','" + textPlace.Text + "','" + dateTimeDate.Text + "')";
cmd.Connection = con;
con.Open();
cmd.ExecuteNonQuery();
System.Windows.Forms.MessageBox.Show("Recrod Succefully Created");
con.Close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...