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
95.8k11 gold badges76 silver badges135 bronze badges
asked Dec 7, 2015 at 12:37
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
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)))
параметры также выдают ту же ошибку @Hursey5. Неиспользование параметров откроет шлюзы, вы этого не хотите. Я хочу сказать, что кто-то может создать удобный запрос во входных данных, который может быть выполнен, и с помощью параметров помогает предотвратить это.
Ответ №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 для
приложений можно вывести на экран
информацию, предупреждение или сообщение
об ошибках. -
Печать информации.Несмотря на то,
что для печати информации чаще всего
используются отчеты, можно распечатать
информацию, содержащуюся в форме.
Поскольку для вывода формы на экран
можно определить один набор параметров,
а для печати – другой, форма может
играть двойственную роль. Например,
можно задать два заголовка и два
примечания для формы – одну пару
(заголовок и примечание) для ввода
заказа, а другую – для печати счета
по заказу.
Соседние файлы в папке Лекции
- #
- #
- #
- #
- #
- #
- #
- #
|
|
|
Ошибка вставки записи в БД MS Access
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Full Member Рейтинг (т): 9 |
Вставка происходит следующим образом (TAccessWorker — мой класс работы с MS Access): при создании формы: ta := TAccessWorker.Create(‘db1.mdb’); вставка происходит так (TGood — произвольный класс): good := TGood.Create; good.SetId(ta.getLastGoodId + 1); ta.insertGood(good); TAccessWorker.insertGood(good);(SQLInsert взят из DRKB) 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 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; 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: … SQL.Text := ‘SELECT id from goods’; Open; Last; … . Также, если производить вставки в БД с меньгим интервалом, то программа падает с EOleException из-за того что я пытаюсь вставить запись с уже существующим Id. То есть видно getLastGoodId возращает ещё необновившийся id. Подскажите как бороться с этими 2-я проблемами… Сообщение отредактировано: SkyStar — 09.11.07, 04:19 |
dron-s |
|
а зачем ты сам себе жизни услажняешь со всем этим делом? |
![]() MIF |
|
Зарегистрируй ID поле как счётчик и убери код генерации следующего ID из своего кода. |
Игорь Акопян |
|
а он наверное бездырочную нумерацию хочет Сообщение отредактировано: Игорь Акопян — 09.11.07, 11:16 |
![]() MIF |
|
Цитата Игорь Акопян @ 09.11.07, 11:15 Он, судя по запросу, хватает первый попавшийся Не, там в коде есть Last. Если первичного ключа нет, то выбирает ID близкое к максимальному. |
Игорь Акопян |
|
Цитата MIF @ 09.11.07, 11:26 Не, там в коде есть Last.
упс.. проглядел |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Базы данных
- Следующая тема
[ Script execution time: 0,0308 ] [ 16 queries used ] [ Generated: 21.06.23, 14:01 GMT ]