Почему при закрытии таблицы программа субд не предлагает выполнить сохранение внесенных данных

Я работаю над школьным проектом и столкнулся с проблемой. Когда я вставляю / обновляю / удаляю данные из базы данных, данные не отображаются до перезапуска приложения. Мне нужно закрыть приложение и открыть его снова, чтобы отобразить изменения.

Когда я изменяю строку OleDbConnection (когда я меняю источник), данные обновляются, но они отображаются только до тех пор, пока я не закрою приложение. Когда я закрываю приложение, я теряю все новые данные. Данные из базы данных показаны в dataGridView . Когда я выбираю источник данных для dataGridView , строка кода записывается автоматически в событии загрузки формы с этим кодом, я могу обновлять данные, когда источник изменяется на файл, который не сохраняет данные.

Мне интересно, есть ли другие способы автоматического обновления (или с помощью кнопки) dataGridView после добавления новых данных. Я использую экспресс-выпуск VS C # 2008 , потому что он используется в школе.

Вот код кнопки вставки:

private void buttonInsert_Click(object sender, EventArgs e) < konekcija.Open(); OleDbCommand komanda = konekcija.CreateCommand(); komanda.CommandType = CommandType.Text; komanda.CommandText = («Insert into Sobe(Broj_sobe,Tip_sobe,Telefon,Stanje)values(‘» + textBoxBrSobe.Text + «‘,'» + textBox2.Text +»‘,'» + textBoxTelefon.Text + «‘,'» + textBox1.Text + «‘)»); komanda.ExecuteNonQuery(); konekcija.Close(); MessageBox.Show(«Uspjeli ste»); //this is written automatically in form load event this.sobeTableAdapter1.Update(this.hotelDataSet1.Sobe); >

Вот строка подключения, так меня учили в школе.

Таблица не может быть заблокирована ядром базы данных Access


OleDbConnection konekcija = new OleDbConnection(«Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/Users/Pupo/Desktop/Hotel/Hotel/Hotel/Hotel.mdb;Persist Security Info=False»);

Когда я меняю строку подключения, чтобы перейти в папку bin / debug, она обновляется автоматически, но не сохраняет данные.

OleDbConnection konekcija = new OleDbConnection(«Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Hotel.mdb;Persist Security Info=False»);
Pupo 3 Май 2021 в 18:55

Адаптер имеет четыре команды 1) Выбрать 2) Удалить) 3) Обновить 4) Вставить. Для работы метода обновления нужны все найденные команды. CommandBuilder берет команду Select и автоматически создает остальные три. См. : learn.microsoft.com/en-us/dotnet/api/…

3 Май 2021 в 19:10
Когда у вас есть db-файл в bin / debug, он, вероятно, перезаписывается при каждой компиляции
Hans Kesting
3 Май 2021 в 19:38

И, кстати, включив пользовательский текст в свою командную строку, вы открыты для проблем с внедрением sql. Даже Access может использовать параметры (только позиционные, но все же . )

Hans Kesting
3 Май 2021 в 19:39

Также; VS 2008, как в .. 13 лет назад? Ваша школа намеренно пытается помешать вашему обучению ? Столько всего произошло за 13 лет, что, с точки зрения вычислений, это почти целую жизнь назад . Я не могу понять, какое оправдание может иметь ваша школа, чтобы придерживаться такой древней версии — есть бесплатные версии Visual Studio 2019 и Цены Microsoft для студентов действительно хороши, если есть вещи, которые вам нужны, которых в ней нет.

Самые популярные системы управления базами данных (СУБД) в мире

Caius Jard
3 Май 2021 в 20:38

Всем спасибо, кое-что удалось сделать. Мне удалось решить проблему, просто сделав одну кнопку, выполняющую команду SELECT. Не лучшее решение, но оно поможет.

3 Май 2021 в 22:27

1 ответ

Лучший ответ

Хорошо, причина, по которой вы сталкиваетесь с проблемами и различным поведением при изменении строки подключения, является одной из следующих:

  • На диске две базы данных, и вы ищите не ту
  • Вы неправильно используете доступ к данным

Вы попадаете в оба. Сначала я объясню первый.

Когда вы добавили базу данных доступа в свой проект (однако вы это сделали, есть несколько способов), это диалоговое окно (или подобное — это vs 2019), вероятно, появилось

x

Он длинный и скучный, и рассказывает людям много того, чего они, вероятно, не понимают, поэтому они просто нажимают «Да» и забывают об этом. Позже они будут очень запутаны при попытке сохранить данные

Это поле в основном говорит: «Я скопирую базу данных в папку вашего проекта, но помните, что каждый раз, когда вы нажимаете кнопку воспроизведения, она будет снова скопирована в папку BIN, и ваша запущенная программа изменит базу данных. в папке bin , а не в базе данных в папке проекта и не в базе данных с рабочего стола (или где-то еще) «

Позже разработчик запускает программу, сохраняет некоторые данные, смотрит в Access, но не находит. Или они снова запускают программу и задаются вопросом: «Куда пропали мои данные, которые я только что сохранил».

Читайте также:
Как показать скрытые программы

«Каждый раз, когда вы запускаете программу, база данных из папки проекта копируется в папку bin»

Это означает, что база данных, в которой ваша программа сохраняет свои данные, будет стираться и заменяться каждый раз, когда вы создаете свой проект в Visual Studio. Это не влияет на живое приложение (живые приложения не создают себя каждый раз, когда вы их запускаете), только одно, которое вы запускаете в VS

И если вы посмотрите в любой БД, кроме той, что находится в папке BIN, вы не найдете данные, потому что вы ищете не тот

Я предлагаю вам найти свою БД в обозревателе решений, щелкнуть ее правой кнопкой мыши, выбрать «Свойства» и изменить «Копировать в вывод» на «Копировать, если новее». Таким образом, VS заменит db в папке bin только тогда, когда вы внесли изменения в db в папке проекта (т.е. добавили новую таблицу) — это больше похоже на то, что вы хотите сделать, обычно

Теперь я прокомментировал, что вы неправильно делаете доступ к данным:

private void buttonInsert_Click(object sender, EventArgs e) < konekcija.Open(); OleDbCommand komanda = konekcija.CreateCommand(); komanda.CommandType = CommandType.Text; komanda.CommandText = («Insert into Sobe(Broj_sobe,Tip_sobe,Telefon,Stanje)values(‘» + textBoxBrSobe.Text + «‘,'» + textBox2.Text +»‘,'» + textBoxTelefon.Text + «‘,'» + textBox1.Text + «‘)»); komanda.ExecuteNonQuery(); konekcija.Close(); MessageBox.Show(«Uspjeli ste»); //this is written automatically in form load event this.sobeTableAdapter1.Update(this.hotelDataSet1.Sobe); >

Совершенно нет необходимости создавать OleDbCommand в вашем приложении. VS записывает весь этот код за вас в DataSet (HotelDataSet). TableAdapter содержит внутри себя OleDbCommand; на самом деле несколько. TableAdapter — это устройство, которое загружает данные из вашей базы данных в ваш набор данных, а также отвечает за сохранение их обратно в базу данных при изменениях (новые записи, измененные записи и удаленные записи).

Вся эта магия происходит в tableadapter.Update(..) — Update не просто запускает обновления. Он также выполняет операции вставки и удаления — когда вы загружаете данные в набор данных, они сохраняются внутри строки данных, внутри таблицы данных. Это очень похоже на базы данных.

DataRows отслеживает, что делает ваш пользователь — если есть новая строка, созданная и добавленная в таблицу данных, она имеет RowState of Added. Если вы измените данные в существующей строке, она будет изменена. Если вы удалите строку из таблицы данных, она будет помечена как удаленная.

Когда вы вызываете tableadapter.Update(theDatatable) , будет выполнен другой SQL INSERT / UPDATE / DELETE, чтобы сохранить все, что вы сделали, для добавленных / измененных / удаленных строк соответственно. После сохранения строка переходит в состояние «Не изменено». Если вы отредактируете его снова, он снова станет Modified, поэтому он будет снова сохранен при вызове Update.

Поэтому, если вы хотите вставить строку в базу данных, вы должны добавить ее в таблицу данных, а затем обновить, чтобы сохранить ее. Если таблица данных просматривается, например, DataGridView, то сетка автоматически увидит изменение и покажет его при добавлении

Вероятно, это выглядит так:

//put this in a button click hotelDataSet1.Sobe.AddSobeRow(textBoxBrSobe.Text, textBox2.Text, textBoxTelefon.Text, textBox1.Text);

Теперь эта строка появится в datagridview. Его еще нет в базе данных , он есть только в локальной таблице данных, которая похожа на кеш / временное хранилище данных только на клиенте. Вы должны сохранить его, чтобы он вошел в БД. Это сохраняет данные:

this.sobeTableAdapter1.Update(this.hotelDataSet1.Sobe);

Вы утверждали, что написано в Форме загрузки; это не так. Суть загрузки формы — это вызов Fill , а НЕ Update . Заливка предназначена для загрузки. Обновление для сохранения.

По умолчанию формы Windows, использующие наборы данных, при добавлении связанных сеток в формы вызывают вызов Fill при загрузке формы, чтобы загрузить все данные из базы данных, чтобы вам было на что посмотреть. Он не вызывает обновление в загрузке формы, потому что форма новая; обновлять нечего. Каждый раз, когда вы хотите загрузить данные из базы данных, вы вызываете Fill.

Вот почему вы столкнулись со второй проблемой, когда изменили строку подключения, чтобы указать на какую-то другую базу данных, не в папке BIN, а затем вы использовали OleDbCommand для вставки данных в базу данных — она ​​появилась только при перезагрузке программы, потому что ваш Form Load вызывает Fill, и именно так ваши новые данные поступают из базы данных в программу. Поскольку вы использовали OleDbCommand для выполнения прямой вставки, вы полностью вышли за пределы всей обработки данных, встроенной в вашу программу, и вставили непосредственно в БД. Ваша программа никогда не знала, что данные были записаны; вы никогда не хранили данные ни в чем в своей программе, которая была подключена к пользовательскому интерфейсу

Читайте также:
Развлекательно игровая программа что такое счастье

Конечно, если вы загружаете данные только один раз при загрузке формы, вам придется перезапустить программу, чтобы загрузить данные. Идея в том, что вы можете вызывать Fill и в другое время; не только при загрузке формы. Я расскажу об этом позже

Не используйте OleDbCommands для прямой вставки данных при работе с адаптерами таблиц; это вызовет путаницу и является плохим решением. Используйте адаптеры таблиц так, как они были задуманы; загрузите новые данные в таблицу данных (внутри набора данных) с помощью адаптера таблицы, а затем сохраните таблицу с помощью адаптера таблицы. Если tableadapter не загружается / не сохраняется, как вы хотите, вы можете это изменить:

Теперь вы на самом деле, вероятно, захотите избавиться от этой строки в загрузке формы, которая загружает всю таблицу db в локальный набор данных, потому что загрузка всех данных происходит редко, что мы делаем. Загружать в приложение все миллионы цен на акции — плохая идея; просто загрузите те, которые хотите

Чтобы привести пример этого, откройте файл HotelDataSet в своем проекте, найдите какой-нибудь табличный адаптер, например SobeTableAdapter, щелкните его правой кнопкой мыши и выберите Добавить >> Запрос. Выберите «выбрать, который возвращает строки», введите запрос типа SELECT * FROM Sobe WHERE Broj_Sobe LIKE ? , назовите его FillByBrojSobe, завершите работу мастера.

Теперь в вашем коде вы можете искать, например:

sobeTableAdapter1.FillByBrojSobe(this.HotelDataSet.Sobe, «ABC»); // fill only records with a Broj_Sobe = «ABC»
sobeTableAdapter1.FillByBrojSobe(this.HotelDataSet.Sobe, «DEF%»); // fill only records with a Broj_Sobe starting with «DEF»

Записи заполняются в HotelDataSet.Sobe . Любой datagridview, привязанный к этому (то есть такая строка кода привяжет сетку к данным: datagridViewSobe.DataSource = HotelDataSet.Sobe — это обычно делается в конструкторе форм, поэтому вы не увидите такую ​​строку кода в своем проекте *) автоматически обновится, чтобы отобразить введенные вами данные. Отредактируйте данные в сетке и сохраните их, подключив какую-либо другую кнопку, которая вызывает tableadapter.Update(..) . Вы даже обычно получаете симпатичный по умолчанию, когда помещаете сетку в форму (из окна Источники данных), встроенную в панель инструментов под названием BindingNavigator.

Помнить; держитесь подальше от OleDbCommand; вам это совершенно не нужно, никогда. Вы можете добавить все запросы, которые вам когда-либо понадобятся, в адаптер таблиц, используя мастер, как я показал выше. Это быстрее и безопаснее; запрос, который вы написали в команде oledb, был ужасно подвержен риску взлома SQL-инъекции, и написание таких SQL-запросов могло однажды привести к увольнению. Написание запросов в мастере tableadapter гарантирует, что они будут встроены в ваш tableadapter безопасным способом, без риска взлома.

Когда-нибудь вы, вероятно, перейдете от наборов данных и адаптеров таблиц и перейдете к структуре сущностей, но это хорошее вступление, лишь немного крутой кривой обучения.

Да, и установите VS2019, даже если только на свой персональный компьютер, если он есть; По сравнению с ним 2008 год — ужасный опыт (и я не думаю, что он может работать даже с .NET 4 ..)

* на самом деле то, что обычно делает дизайнер форм, — это привязка источника привязки к таблице данных, а затем привязка сетки к источнику привязки, но я пока проигнорирую это

Caius Jard 3 Май 2021 в 23:37

Большое спасибо. Я постараюсь полностью удалить OleDbCommands из своего кода и постараюсь сделать это таким образом. Я даже не заметил, что написал update в этой строке вместо fill, каждый раз, когда я вызываю эту строку кода, это команда fill. Установлю VS2019, как только закончу школу (10-15 дней). Мой компьютер буквально забит программами старше 10 лет.

Еще раз большое спасибо, это было большим подспорьем.

Источник: question-it.com

Ошибка «Сохранение изменений запрещено» в среде SSMS. Причины и способы устранения

Всем привет! Сегодня я расскажу об ошибке «Сохранение изменений запрещено», которая возникает в среде SQL Server Management Studio при работе с конструктором таблиц, будут рассмотрены причины ее возникновения и, конечно же, способы исправления данной ошибки.

Ошибка «Сохранение изменений запрещено» в среде SSMS. Причины и способы устранения

Ошибка «Сохранение изменений запрещено»

Итак, ситуация: Вы вносите изменения в таблицу с помощью конструктора в среде SQL Server Management Studio, однако при попытке сохранить изменения Вы получаете следующую ошибку

Сохранение изменений запрещено. Чтобы сохранить изменения, необходимо удалить и повторно создать следующие таблицы. Либо изменения вносятся в таблицу, которую невозможно создать повторно, либо включен параметр «Запретить сохранение изменений, требующих повторного создания таблицы».

Скриншот 1

Причины возникновения ошибки «Сохранение изменений запрещено»

Дело в том, что при изменении таблицы с помощью конструктора с изменением структуры ее метаданных, чтобы сохранить все изменения, необходимо пересоздать таблицу на основе этих изменений, т.е. создать ее заново. Вы этого не видите, но это будет делать сама среда Management Studio.

Читайте также:
Программа для того чтобы спрятать папку

Однако это действие может привести к потере метаданных и прямой потере данных во время повторного создания таблицы.

Поэтому по умолчанию в среде SQL Server Management Studio включен параметр «Запретить сохранение изменений, требующих повторного создания таблицы». И если Вы используете графический конструктор таблиц, чтобы внести изменения в таблицу, например, Вы выполняете следующие действия:

  • Меняете параметр «Разрешить значения NULL» для столбца;
  • Изменяете порядок столбцов в таблице;
  • Изменяете тип данных столбца;
  • Добавляете новый столбец.

то в этих случаях Вы будете получать именно такую ошибку.

Способы устранения ошибки «Сохранение изменений запрещено»

Вы можете спросить, «а как же тогда вносить изменения в таблицы, если существует прямой запрет на внесения изменений?».

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

Использовать T-SQL

Первый, и рекомендованный – это использовать инструкции T-SQL.

В качестве примера давайте представим, что у нас есть таблица Goods, и она имеет следующие данные.

CREATE TABLE Goods( ProductId INT IDENTITY(1,1) NOT NULL, Category INT NOT NULL, ProductName VARCHAR(100) NOT NULL, Price MONEY NULL ); INSERT INTO Goods (Category, ProductName, Price) VALUES (1, ‘Системный блок’, 50), (1, ‘Клавиатура’, 30), (1, ‘Монитор’, 100), (2, ‘Планшет’, 150), (2, ‘Смартфон’, 100); SELECT * FROM Goods;

Скриншот 2

Заметка! Если Вас интересует язык SQL, то рекомендую почитать книгу «SQL код» – это самоучитель по языку SQL для начинающих программистов. В ней очень подробно рассмотрены основные конструкции языка.

Изменяем параметр «Разрешить значения NULL»

Как видим, столбец Price на текущий момент у нас может принимать значения NULL, однако мы решили сделать этот столбец обязательным к заполнению и запретить хранение в нем значений NULL.

Курс по SQL для начинающих

Если мы будем использовать конструктор таблиц, то мы получим ошибку «Сохранение изменений запрещено».

Чтобы запретить хранение NULL значений, мы можем выполнить следующую инструкцию SQL

ALTER TABLE Goods ALTER COLUMN Price MONEY NOT NULL;

Однако помните о том, что в столбце на момент выполнения инструкции уже не должно быть значений NULL, Вы их должны устранить.

Изменяем тип данных столбца

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

ALTER TABLE Goods ALTER COLUMN Price NUMERIC(18,2) NOT NULL;

В данном случае мы изменили тип данных столбца Price с MONEY на NUMERIC.

Добавляем новый столбец

Если требуется добавить новый столбец, то Вы можете использовать следующую инструкцию.

ALTER TABLE Goods ADD ProductDescription VARCHAR(300) NULL;

В этом примере мы добавили столбец ProductDescription с типом данных VARCHAR.

К сожалению, изменение порядка столбцов в таблице на языке T-SQL не поддерживается, это возможно только путем пересоздания таблицы.

Отключить параметр «Запретить сохранение изменений, требующих повторного создания таблицы»

Если Вы не хотите вникать в SQL, то Вы можете просто отключить параметр «Запретить сохранение изменений, требующих повторного создания таблицы» и в таком случае Вы сможете вносить в таблицы все перечисленные выше изменения, которые ранее были недоступны, включая изменение порядка столбцов.

Однако Microsoft не рекомендует отключать этот параметр, ссылаясь на то, что при определенных обстоятельствах сохранение изменений, требующих повторного создания таблицы, может привести к потере метаданных и прямой потере данных. Например, если у таблицы включен функционал «Отслеживания изменений».

В большинстве случаев потери данных, конечно же, не будет происходить, поэтому данный параметр отключить можно, но лучше использовать SQL.

Чтобы отключить данный параметр, зайдите в SSMS в меню «Сервис -> Параметры» и на вкладке «Конструкторы» снимите галочку «Запретить сохранение изменений, требующих повторного создания таблицы» и нажмите «ОК».

Скриншот 3

После этого Вы сможете сохранять любые изменения в таблицах с помощью графического конструктора.

На сегодня это все, надеюсь, материал был Вам полезен, пока!

Источник: info-comp.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru