Странное исключение с вставкой параметров OLEDB

Получение странной ошибки при попытке вставки данных в базу данных Access с использованием параметров. строка, в которой у меня возникает проблема: -

                thisCommand.CommandText = "INSERT INTO Events (Venue_ID, Date_Start, Date_End, Time_Start, Time_End, Name, Description, Event_Type, Buy_Tickets_URL) VALUES (@VenID, @DStart, @DEnd, @evTime, @evTime, @Name, @Des, @EvType, @SysUrl);";

                //Other Parameters already inserted here
                string desc = GetDesc(rec.EvName);
                thisCommand.Parameters.AddWithValue("@Des", desc);
                thisCommand.ExecuteNonQuery();

Ни один из других параметров не вызывает проблем, но при попытке вставить данные в поле описания я получаю исключение базы данных, говорящее, что поле слишком маленькое, чтобы принять объем данных. Проблема в том, что моя программа пытается вставить только 3 символа, когда выдает ошибку, а поле «Описание» представляет собой памятку, поэтому оно должно содержать до 65000+ символов. При вставке значения вручную в CommandText все работает нормально, поэтому это должно быть как-то связано со свойствами параметра.


person Seamus MacKenzie    schedule 01.07.2012    source источник
comment
Нет проблем со вставкой трех символов, однако параметры должны быть перечислены в правильном порядке. В вашем примере вы показываете только один параметр, остальные упорядочены так, как они появляются в тексте вашей команды?   -  person Fionnuala    schedule 02.07.2012
comment
Имя отлично вставляется в базу данных, только при попытке вставить в поле описания я получаю исключение   -  person Seamus MacKenzie    schedule 02.07.2012
comment
Я запустил пример кода, который я разместил ниже, и он сработал для меня. Я не понимаю, почему вы не можете вставить в описание, если только один из параметров не вышел из строя.   -  person Fionnuala    schedule 02.07.2012
comment
Только что увидел, что порядок немного сбился, понятия не имел, что параметры нужно устанавливать по порядку. Спасибо!   -  person Seamus MacKenzie    schedule 02.07.2012
comment
Имена параметров не имеют значения и не используются с MS Access в вашем сценарии, вы могли бы так же легко использовать ? как @VenID. Все, что важно, это порядок.   -  person Fionnuala    schedule 02.07.2012


Ответы (2)


Названия параметров — это просто руководство для вас, например, это работает, обратите внимание, что все параметры имеют одинаковые имена! Обратите также внимание на то, что зарезервированное слово Name заключено в квадратные скобки.

    thisCommand.CommandText = "INSERT INTO Events (Venue_ID, Date_Start, " +
    "Date_End, [Name], Description, Event_Type, Buy_Tickets_URL) " +
    "VALUES (@VenID, @DStart, @DEnd, @Name, @Des, @EvType, @SysUrl);";


    thisCommand.Parameters.AddWithValue("@Des", 1);
    thisCommand.Parameters.AddWithValue("@Des", DateTime.Now.Date);
    thisCommand.Parameters.AddWithValue("@Des", DateTime.Now.Date);
    thisCommand.Parameters.AddWithValue("@Des", "abc");
    thisCommand.Parameters.AddWithValue("@Des", "abc");
    thisCommand.Parameters.AddWithValue("@Des", 1);
    thisCommand.Parameters.AddWithValue("@Des", "abc");

Зарезервированные слова

person Fionnuala    schedule 02.07.2012
comment
Нет проблем с тем, что имя является зарезервированным словом (имена - зарезервированное слово), но указал, что параметры должны быть добавлены по порядку (в комментариях к моему исходному вопросу). Итак, лучший ответ. - person Seamus MacKenzie; 02.07.2012

Возможно, вам нужно добавить фигурные скобки в Description. [Description]

и измените свои параметры примерно так:

 thisCommand.CommandText = "INSERT INTO Events (Venue_ID, Date_Start, Date_End, Time_Start, Time_End, Name, [Description], Event_Type, Buy_Tickets_URL) VALUES (@VenID, @DStart, @DEnd, @evTime, @evTime, @Name, @Des, @EvType, @SysUrl);

            //Other Parameters already inserted here
            string desc = GetDesc(rec.EvName);
           // thisCommand.Parameters.AddWithValue("@Des", desc);
            thisCommand.Parameters.Add("@Des", OleDbType.VarChar, 6000).Value = desc;
            thisCommand.ExecuteNonQuery();

С Уважением

person BizApps    schedule 02.07.2012
comment
Описание не является зарезервированным словом в Jet или ACE, но имя есть. Я считаю, что вы должны изменить этот ответ. - person Fionnuala; 02.07.2012