Access таблица ошибка вставки

I have a user form that inserts data into «user» table and «organizer» table when I click a button, user data gets inserted with no problem, but it prompts me to enter the value (organization_name) again in a small dialogue box -which supposed to take from the text field and insert into organizer table- ,
then gives me an error saying «ms access set one row null due to validation rule violation»

NOTE: I didn’t put any validation rule for the «organization_name» anywhere

Private Sub InsertSqlIntoOrgTable()
   Dim orgName As String, SqlOrgNameInsert As String

   orgName = txtOrgName.Value  'takes the value from text field
   SqlOrgNameInsert = "INSERT INTO ORGANIZER (ORG_NAME)     VALUES (" & orgName & ") "

   DoCmd.RunSQL SqlOrgNameInsert

End Sub

HansUp's user avatar

HansUp

95.8k11 gold badges76 silver badges135 bronze badges

asked Dec 7, 2015 at 12:37

user3713255's user avatar

3

SqlOrgNameInsert = "INSERT INTO ORGANIZER (ORG_NAME) VALUES ('" & orgName & "') "

if the field name in table ORGANIZER is really ORG_NAME. Show us your complete table definition in case that this doesn’t solve your problem. Because in your last question you posted:

sqlOrgInsertUsrId = "INSERT INTO ORGANIZER (USER_ID) VALUES (" & orgUserId & ")"

Both inserts run into the same table but try to create new independent rows. If USER_ID is primary key then your insert into ORG_NAME can’t work that way.

You should learn more about SQL.

answered Dec 7, 2015 at 13:22

cboden's user avatar

cbodencboden

8139 silver badges14 bronze badges

3

  • Remove From My Forums
  • Вопрос

  • DataSet Test = new DataSet();
    
                {
    
                    DataTable Hour = new DataTable("Hour");
    
    
    
                    
    
                    Hour.Columns.Add(new DataColumn("DateTime", typeof(DateTime)));
    
    
    
                    Test.Tables.Add(Hour);
    
                }
    
    
    
    
    
                Test.Tables["Hour"].Rows.Add();
    
                
    
                Test.Tables["Hour"].Rows[0]["DateTime"] = DateTime.Now;
    
                
    
    
    
    
    
                   myAccessConnect.Open();
    
    
    
                OdbcDataAdapter myDataAdapter = new OdbcDataAdapter();
    
                myDataAdapter.SelectCommand = new OdbcCommand("SELECT DateTime FROM Hour", myAccessConnect);
    
    
    
                myDataAdapter.InsertCommand = new OdbcCommand("INSERT INTO Hour (DateTime) VALUES (?)", myAccessConnect);
    
    
    
                 OdbcParameter argDateTime = myDataAdapter.InsertCommand.Parameters.Add("DateTime", OdbcType.DateTime); argDateTime.SourceColumn = "DateTime";
    
    
    
               
    
                myDataAdapter.Update(Test, "Hour");
    
    
    
    
    
                myAccessConnect.Close();
    
    
    
    

    Получаю ошибку:
    ERROR [42000] [Microsoft][ODBC Microsoft Access Driver] Ошибка синтаксиса в инструкции INSERT INTO.

    Для других аналогичных случаев (другие типы) конструкция работает. Полагаю, есть некоторые особенности использования типа данных DateTime, потому что для других типов все ок.


    В базе данных есть соответствующий столбец DateTime.
    Переименовываю столбец и правлю запрос на другое имя — все работает.
    С именем столбца DateTime не работает. В другой части кода работатет, здесь — нет.

    • Перемещено

      1 октября 2010 г. 21:13
      MSDN Forums Consolidation (От:Технологии .NET Framework: ADO.NET, WCF, WPF etc)

Ответы

  • Переименуйте свой столбец DateTime в как-то по-другому, например DateOfTime. И все заработает.
    DateTime — зарезервированное слово (наверно :))

    • Предложено в качестве ответа
      I.Vorontsov
      15 января 2010 г. 13:44
    • Помечено в качестве ответа
      GL88
      16 января 2010 г. 8:22

    • Помечено в качестве ответа
      GL88
      16 января 2010 г. 8:22

#asp.net #vb.net

#asp.net #vb.net

Вопрос:

Я делаю вставку имени пользователя и пароля в базу данных в vb.net но это дает такую ошибку:

изображение ошибки

может кто-нибудь взглянуть, в чем причина?

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    pro = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:UsersAminsourcereposNando'sNando'suser.accdb"

    connstring = pro
    myconnection.ConnectionString = connstring
    myconnection.Open()
    command = "insert into user ([USERNAME],[PASSWORD]) values ('" amp; USERNAMETextBox.Text amp; "','" amp; PASSWORDTextBox.Text amp; "')"
    Dim cmd As OleDbCommand = New OleDbCommand(command, myconnection)
    cmd.ExecuteNonQuery()
    cmd.Dispose()
    myconnection.Close()

    MsgBox("Record added", MsgBoxStyle.Information)
 

Завершение подзаголовка

Комментарии:

1. В PASSWORDTextBOX.Text enter: a'); DROP TABLE user;-- (серьезно, не делайте) используйте параметры, Using инструкции, чтобы гарантировать, что удаление действительно произойдет, и, наконец, никогда не храните пароли подобным образом.

2. Ну, совершенно ясно, что при чтении сообщения об ошибке что-то не так с инструкцией insert . Используйте параметры, а не конкатенации строк, вы обнаружите, что при правильном выполнении ваша проблема исчезнет

3. И прежде чем следовать совету Codexer, сделайте резервную копию своей базы данных

4. cmd.Parameters.Add(New OleDbParameter("USERNAME", CType(USERNAMETextBox.Text, String))) параметры также выдают ту же ошибку @Hursey

5. Неиспользование параметров откроет шлюзы, вы этого не хотите. Я хочу сказать, что кто-то может создать удобный запрос во входных данных, который может быть выполнен, и с помощью параметров помогает предотвратить это.

Ответ №1:

Я меняю это:

 command = "insert into user ([USERNAME],[PASSWORD]) values ('" amp; USERNAMETextBox.Text amp; "','" amp; PASSWORDTextBox.Text amp; "')"
 

к этому:

 command = "insert into [user] ([USERNAME],[PASSWORD]) values ('" amp; USERNAMETextBox.Text amp; "','" amp; PASSWORDTextBox.Text amp; "')"
 

Я просто поставил скобку, user и это решено.
Плохо то, что я ходил взад и вперед между учебниками в течение нескольких дней, но ни один из них не решил ее, потому что ошибка была в имени таблицы, но она, наконец, решена. Спасибо Hursey за упоминание зарезервированных слов.

Комментарии:

1. Возможно, вы решили свою непосредственную проблему, но, пожалуйста, научитесь использовать параметры, чтобы избежать внедрения sql и других проблем. Кроме того, ПОЖАЛУЙСТА , не храните пароли в виде обычного текста.

Типовые ошибки и проблемы, возникающие при выполнении запросов на изменение

Во время выполнения запроса на изменение
Access различает четыре категории ошибок:

1. Дубликаты первичного ключа.Эта
категория ошибок возникает при попытке
добавления или изменения некоторой
записи в таблице, приводя к появлению
дублирующего значения первичного ключа
или уникального индекса. Access не будет
обновлять или добавлять записи, создающие
такие значения. Во избежание конфликта
перед попыткой добавить такие записи
следует изменить значения первичного
ключа в исходной таблице.

2. Ошибки преобразования данных.Ошибки этой категории возникают в тех
случаях, когда вы вставляете данные в
существующую таблицу и при этом
оказывается, что тип данных полей-получателей
не совпадает с типом данных полей-источников
(и данные полей-источников не могут быть
преобразованы к типу данных
полей-получателей). Например, ошибка
возникает, если вы добавляете текстовые
значения к полю, содержащему целочисленные
данные, а текстовое поле содержит
буквенные символы или слишком длинную
строку цифровых символов. В запросе на
обновление ошибка преобразования может
возникнуть, если вы используете формулу, 
которая пытается произвести вычисления
над полем, содержащим буквы.

3. Заблокированные записи. Ошибки
этой категории возникают, когда при
выполнении запроса на удаление или на
обновление вы используете таблицу,
к которой имеют доступ другие пользователи
сети. Access не может произвести обновление
записей, которые в это время обновляются
другими пользователями. Вам следует
подождать некоторое время и попытаться
снова выполнить обновление или удаление
в тот момент, когда данные записи больше
никто не использует.

4. Нарушение условий на значение. Если
вставляемые или обновляемые записи
не удовлетворяют условию на значение
для некоторого поля для таблицы,
Access сообщает вам об ошибке и не производит
вставки или обновления подобных
записей.

7.7. Построение и применение форм

Формы являются основным средством
организации интерфейса пользователя
в приложениях Microsoft Access. Формы могут
применяться для различных целей:

  • Вывод и редактирование данных.Это
    наиболее распространенный способ
    использования форм. Формы обеспечивают
    вывод на экран данных в необходимом
    представлении. С их помощью значительно
    упрощается внесение изменений, добавление
    и удаление данных из базы. В форме можно
    сделать доступными только для чтения
    все данные или некоторую их часть,
    автоматически выбирать информацию из
    других связанных таблиц и помещать ее
    в форму, вычислять выводимые в форме
    значения, скрывать или, наоборот,
    выводить некоторые данные в зависимости
    от значений других полей записи либо
    от выбранных пользователем параметров.

  • Управление ходом выполнения приложения.
    Чтобы автоматизировать вывод
    определенных данных или выполнение
    некоторой последовательности действий,
    создаются формы для работы с макросами
    или процедурами Visual Basic для приложений.
    Для запуска макросов или процедур VBA
    обычно используются элементы управления,
    называемые командными кнопками. С
    помощью макросов и процедур можно
    открывать другие формы, выполнять
    запросы или команды меню, фильтровать
    выводимые на экран данные, устанавливать
    значения в записях и формах, выводить
    меню на экран, печатать отчеты и выполнять
    ряд других действий. Можно так
    спроектировать форму, чтобы макросы
    или функции Visual Basic для приложений
    запускались в ответ на определенные
    события – например, открытие формы,
    активизацию определенного элемента
    управления или изменение данных в
    форме.

  • Ввод данных.Формы, предназначенные
    только для ввода в базу новых данных
    или значений, помогающих автоматизировать
    выполнение приложения.

  • Вывод сообщений. Формы могут
    предоставлять вспомогательную информацию
    о работе приложения или о выполняемых
    действиях. С помощью макрокоманды
    Сообщение или функции MsgBox Visual Basic для
    приложений можно вывести на экран
    информацию, предупреждение или сообщение
    об ошибках.

  • Печать информации.Несмотря на то,
    что для печати информации чаще всего
    используются отчеты, можно распечатать
    информацию, содержащуюся в форме.
    Поскольку для вывода формы на экран
    можно определить один набор параметров,
    а для печати – другой, форма может
    играть двойственную роль. Например,
    можно задать два заголовка и два
    примечания для формы – одну пару
    (заголовок и примечание) для ввода
    заказа, а другую – для печати счета
    по заказу.

Соседние файлы в папке Лекции

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    >
    Ошибка вставки записи в БД MS Access

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    09.11.07, 04:18

      Full Member

      ***

      Рейтинг (т): 9

      Вставка происходит следующим образом (TAccessWorker — мой класс работы с MS Access):

      при создании формы:

      ExpandedWrap disabled

        ta := TAccessWorker.Create(‘db1.mdb’);

      вставка происходит так (TGood — произвольный класс):

      ExpandedWrap disabled

        good := TGood.Create;

        good.SetId(ta.getLastGoodId + 1);

        ta.insertGood(good);

      TAccessWorker.insertGood(good);(SQLInsert взят из DRKB)

      ExpandedWrap disabled

         procedure TAccessWorker.insertGood(good :TGood);

          var

            query :TADOQuery;

          begin

            query := TADOQuery.Create(nil);

            with query do begin

              ConnectionString := globalDbConnectionString;

              SQL.Text := SqlInsert(

                [good.GetId, good.GetParentId, good.GetName, good.GetDescription, CurrToStr(good.GetPrice), good.GetQuantity],

                ‘goods’

              );

              ExecSQL;

              Close;

            end;

          end;

      TAccessWorker.getLastGoodId — выясняет значение последнего id

      ExpandedWrap disabled

          function TAccessWorker.getLastGoodId : Integer;

          var

            query :TADOQuery;

            num :String;

          begin

            query := TADOQuery.Create(nil);

            with query do begin

              ConnectionString := globalDbConnectionString;

              SQL.Text := ‘SELECT id from goods’;

              Open;

              Last;

              num := FieldByName(‘id’).AsString;

              if(num <> ») then begin

                Result := StrToInt(num);

              end else begin

                Result := -1;

              end;

              Close;

            end;

          end;

      ExpandedWrap disabled

        globalDbConnectionString :=

                  ‘Provider=Microsoft.Jet.OLEDB.4.0;’ +

                  ‘Data Source=’ + fileName + ‘;’ +

                  ‘Persist Security Info=False;’ +

                  ‘Jet OLEDB:Database Password=’ + password;

      Когда я произвожу подряд 32 вставки (между вставками промеуток времени ~1 сек), то после 32-ой итерации, у меня программа падает и выкидывает такой exception (падает постоянно и ИМЕННО после 32-х вставок подряд): EOleException «Неопознанная ошибка»

      Падает он в методе getLastId в строке c Open:

      ExpandedWrap disabled

        SQL.Text := ‘SELECT id from goods’;

        Open;

        Last;

      .

      Также, если производить вставки в БД с меньгим интервалом, то программа падает с EOleException из-за того что я пытаюсь вставить запись с уже существующим Id. То есть видно getLastGoodId возращает ещё необновившийся id.

      Подскажите как бороться с этими 2-я проблемами…

      Сообщение отредактировано: SkyStar — 09.11.07, 04:19


      dron-s



      Сообщ.
      #2

      ,
      09.11.07, 04:30

        а зачем ты сам себе жизни услажняешь со всем этим делом?
        нафига ты писал все эти функции и процедуры, когда можно всё сделать намного короче и практичнее!
        возможно что у тебя где просто идёт очень большая утечка памяти…
        надо дебажить…

        Master

        MIF



        Сообщ.
        #3

        ,
        09.11.07, 04:33

          Зарегистрируй ID поле как счётчик и убери код генерации следующего ID из своего кода.


          Игорь Акопян



          Сообщ.
          #4

          ,
          09.11.07, 11:15

            а он наверное бездырочную нумерацию хочет :)
            Кроме того, откуда видно, что метод getLastId возвращает именно Last ID? Он, судя по запросу, хватает первый попавшийся, может там МАХ поставить?

            Сообщение отредактировано: Игорь Акопян — 09.11.07, 11:16

            Master

            MIF



            Сообщ.
            #5

            ,
            09.11.07, 11:26

              Цитата Игорь Акопян @ 09.11.07, 11:15

              Он, судя по запросу, хватает первый попавшийся

              Не, там в коде есть Last. Если первичного ключа нет, то выбирает ID близкое к максимальному.
              SkyStar, если всё таки хочешь сам генерировать ИД (хотя багов при таком подходе бывает немеряно) то измени запрос так, как советует Игорь Акопян.


              Игорь Акопян



              Сообщ.
              #6

              ,
              12.11.07, 09:19

                Цитата MIF @ 09.11.07, 11:26

                Не, там в коде есть Last.

                упс.. проглядел :)

                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                0 пользователей:

                • Предыдущая тема
                • Delphi: Базы данных
                • Следующая тема

                Рейтинг@Mail.ru

                [ Script execution time: 0,0308 ]   [ 16 queries used ]   [ Generated: 21.06.23, 14:01 GMT ]  

                Возможно, вам также будет интересно:

              • Access ошибка обнаружено возможное нарушение безопасности
              • Access denied почему такая ошибка при входе на сайт
              • Access ошибка ввода вывода при чтении диска
              • Access denied ошибка сбой аутентификации ошибка критическая ошибка невозможно подключиться к серверу
              • Access ошибка subscript out of range

              • Понравилась статья? Поделить с друзьями:
                0 0 голоса
                Рейтинг статьи
                Подписаться
                Уведомить о
                guest

                0 комментариев
                Старые
                Новые Популярные
                Межтекстовые Отзывы
                Посмотреть все комментарии