Krishna Veni Ответов: 1

Таблица не имеет первичного ключа.


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

Таблица не имеет первичного ключа.
Описание: необработанное исключение возникло во время выполнения текущего веб-запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.Data.MissingPrimaryKeyException: таблица не имеет первичного ключа.

Ошибка Источника:


Строка 78: {
Строка 79: DataTable dt = ds.Tables[0];
Строка 80: DataRow dr = dt.Rows.Find(0);
Строка 81: dr.Delete();
Строка 82: dt.AcceptChanges();

Доктор строкаданных = ДТ.Строк.Найти(0);-----&это заявление сделать ошибку.

вставка,обновление работали правильно, но удаление не работало

Mycode:

protected void Button4_Click(object sender, EventArgs e)
 {

  SqlConnection con = new SqlConnection("Data Source=AMMA-PC\\SQLEXPRESS;Initial 
  Catalog=E_learn;Integrated Security=True");
  string query="select * from Student where sid="+TextBox1.Text;
  SqlDataAdapter da = new SqlDataAdapter(query, con);
  SqlCommandBuilder br = new SqlCommandBuilder(da);
  DataSet ds = new DataSet();
  da.Fill(ds, "Student");
  if (ds.Tables[0].Rows.Count > 0)
  {
  DataTable dt = ds.Tables[0];
  DataRow dr = dt.Rows.Find(0);
  dr.Delete();
  dt.AcceptChanges();
  da.Update(ds, "Student");
  Response.Write("deleted successfully");
}

 }



пожалуйста, помогите мне.
спасибо тебе.

Что я уже пробовал:

Таблица не имеет первичного ключа.
Описание: необработанное исключение возникло во время выполнения текущего веб-запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.Data.MissingPrimaryKeyException: таблица не имеет первичного ключа.

Ошибка Источника:


Строка 78: {
Строка 79: DataTable dt = ds.Tables[0];
Строка 80: DataRow dr = dt.Rows.Find(0);
Строка 81: dr.Delete();
Строка 82: dt.AcceptChanges();

Доктор строкаданных = ДТ.Строк.Найти(0);-----&это заявление сделать ошибку.

Patrice T

sid-это цифра или альфа ?

1 Ответов

Рейтинг:
1

Wendelius

Вы просто заполняете таблицу данных из базы данных, но не определяете какой-либо столбец первичного ключа для таблицы данных. Прежде чем вы сможете использовать метод Find для поиска ro на основе первичного ключа, вам нужно сказать, что такое ключевой столбец.

Для определения ключевого столбца he можно использовать например объект DataTable.Свойство PrimaryKey (System.Data)[^]

Другое дело-запрос. Вы объединяете текст непосредственно из текстового поля в запрос. Это оставляет вас широко открытыми для SQL-инъекций. Вы должны использовать Объект sqlparameter[^] со значениями, поступающими из пользовательского интерфейса.

Взгляните на это Правильное выполнение операций с базой данных[^]


Krishna Veni

Объект sqlconnection кон = новое sqlconnection("источник данных=Амма-ПК\\именем sqlexpress;начальный каталог=E_learn;Комплексная безопасность=истина");
строка запроса="выбрать * из студенческих где Sid="+текстовое поле textbox1.Текст;
SqlDataAdapter da = новый SqlDataAdapter(запрос, con);
SqlCommandBuilder br = новый SqlCommandBuilder(da);
DataSet ds = новый набор данных();
da.Fill(ds, "студент");
if (ds.Tables[0].Rows.Count > 0)
{
DataTable dt = ds.Tables[0];
DataColumn[] столбцы;
столбцы = ДТ.Свойства primarykey;
DataRow dr = dt.Rows.Find(0);
др.Удалить();
ДТ.Метод acceptchanges();
da.Update(ds, "студент");
Ответ.Write("удалено успешно");

}

я установил первичный ключ в коде, но получил ту же самую таблицу ошибок, в которой нет первичного ключа.
ошибка произошла в этой строке----> DataRow dr = dt.Rows.Find(0);

пожалуйста, помогите мне.
спасибо тебе

Wendelius

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

Я так понимаю, что столбец SID является первичным ключом в таблице Student. Если это так, попробуйте определить ключ следующим образом:

DataColumn[] keyColumns = новый столбец данных[1];
keyColumns[0] = dt.Columns["sid"];
ДТ.Свойства primarykey = свойства keycolumns;

Krishna Veni

Мой код работал правильно, но строка не может быть удалена из таблицы базы данных.в datatable row deleted.after вызовите .da.update(ds,"student") нужно создать таблицу базы данных, но строка не может быть удалена в таблице базы данных
мой код:
Объект sqlconnection кон = новое sqlconnection("источник данных=Амма-ПК\\именем sqlexpress;начальный каталог=E_learn;Комплексная безопасность=истина");
строка запроса="выбрать * из студенческих где Sid="+текстовое поле textbox1.Текст;
SqlDataAdapter da = новый SqlDataAdapter(запрос, con);
SqlCommandBuilder br = новый SqlCommandBuilder(da);
DataSet ds = новый набор данных();
da.Fill(ds, "студент");
if (ds.Tables[0].Rows.Count > 0)
{
DataTable dt = ds.Tables[0];
DataColumn[] keyColumns = новый столбец данных[1];
keyColumns[0] = dt.Columns["sid"];
ДТ.Свойства primarykey = свойства keycolumns;
DataRow dr = dt.Rows[0];
ДТ.Строк.Снять(д-р);
da.Update(ds, "студент");
Ответ.Write("удалено успешно");
}

Я думаю, что у вас есть сомнения по поводу удаления строки. как следует знать строку, удаленную из datatable в dataset. я проверил через клавиши breaking points, такие как F10,F11.at время в визуализаторе набора данных показывает, что перед вызовом da.update(ds,"студент") у меня есть строка. после вызова da.update(ds,"Student").визуализатор набора данных показывает удаленную строку, но база данных не выполняется.строка не может быть удалена из базы данных . в чем же проблема
я не знаю. пожалуйста, помогите мне.
Спасибо тебе.

Wendelius

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

Взгляните на пример в разделе SqlDataAdapter.Свойство Deletecommand, Принадлежащие (Системы.Данных.Поставщики sqlclient)[^]

Krishna Veni

можно ли использовать da.update(ds,"студент");

Wendelius

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