Устранение неполадок «Несоответствие типов данных в выражении критериев». во время MS Access Insert.Into - PullRequest
0 голосов
/ 26 июня 2019

Я создаю базовое приложение для инвентаризации клиентов, и при преобразовании кода из SQL Server в MS Access (в котором я немного менее разбираюсь) я столкнулся с ошибкой «Несоответствие типов данных», когдапытаясь выполнить базовую вставку.

Я рассмотрел несколько подобных вопросов здесь и дважды проверил руководство по синтаксису msdn, но не могу найти причину, по которой написанный мной скрипт генерирует эту ошибку,Я несколько раз менял свой код, чтобы попытаться обеспечить правильный тип данных (в конце концов я получил явную типизацию и позже добавил значение).На самом деле я даже взял строку и вставил ее в MS Access (без пробелов и двойных кавычек), и она, кажется, прекрасно работает с заданными значениями.На данный момент, я действительно и действительно озадачен, и мне интересно, может ли это быть просто причуда с адаптером Oledb?Любая помощь будет оценена.Спасибо.

// SQL query defined elsewhere:
public static readonly string sqlAddCustomerNotes = "INSERT INTO CustomerNotes (Customer_ID, Notes, NotesDate) "
            + "VALUES(@Customer_ID, @Notes, @NotesDate);";
// end sql query

// data access function
public static void addNotes(int customerID, string notes, DateTime notesDate)
        {
            string query = Scripts.sqlAddCustomerNotes;
            using (
                OleDbCommand dbCommand = new OleDbCommand()
                {
                    Connection = new OleDbConnection(ConnectionAccess.connString),
                    CommandType = CommandType.Text,
                    CommandText = query,
                    Parameters =
                        {
                            new OleDbParameter("@Customer_ID", OleDbType.Integer),
                            new OleDbParameter("@Notes", OleDbType.LongVarChar),
                            new OleDbParameter("@NotesDate", OleDbType.DBTimeStamp)
                        }
                }) // end using parenthetical
            { // begin using scope
                dbCommand.Parameters[0].Value = customerID;
                dbCommand.Parameters[1].Value = notes;
                dbCommand.Parameters[2].Value = notesDate;
                foreach (OleDbParameter param in dbCommand.Parameters)
                { // replace ambiguous null values with explicit DBNulls.
                    if (param.Value == null)
                    {
                        param.Value = DBNull.Value;
                    }
                }
                dbCommand.Connection.Open();
                int rowsAffected = dbCommand.ExecuteNonQuery();
                dbCommand.Connection.Close();
                Console.WriteLine($"Rows affected: {rowsAffected}");
            }
        } // end addCustomerNotes
/*
table "CustomerNotes" has the following columns:datatypes
    CustomerNotes_ID: AutoNumber
    Customer_ID: Number
    Notes: Memo
    NotesDate: Date/Time
    CreateDate: Date/Time

test case (in code) was:
    @Customer_ID = 5
    @Notes = "customer might change last name to simpson."
    @NotesDate = {6/26/2019 12:05:39 PM}
*/

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Вероятно, это дата , а не отметка времени :

new OleDbParameter("@NotesDate", OleDbType.DBDate)
0 голосов
/ 27 июня 2019

Учитывая комментарий от 7 июня о разделителях, похоже, что проблема заключается в некоторой проблеме, присущей типу OleDbParameter.В терминах SQL Server я хочу DateTime (не Date), но представление его как DBTimeStamp, кажется, делает его неузнаваемым для Access.

В настоящее время я отправил дату как VarChar и разрешил Access преобразовать ее, как бы ее внутренний механизм не счел нужным.Кажется / кажется неправильным, но на самом деле это решает проблему.

Parameters =
                        {
                            new OleDbParameter("@Customer_ID", OleDbType.Integer),
                            new OleDbParameter("@Notes", OleDbType.LongVarChar),
                            new OleDbParameter("@NotesDate", OleDbType.VarChar)
                        }

РЕДАКТИРОВАТЬ : Только что видел последний комментарий 7 июня, и на самом деле был ответ в другая тема .OleDbType.DBDate не делает то, что я хочу, но OleDbType.Date делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...