Использование SQLAdapter.Update (набор данных) выдает ошибку «Нет первичного ключа в команде выбора» - PullRequest
3 голосов
/ 10 марта 2011

Короче говоря, C # выдает мне сообщение «Генерация динамического SQL для UpdateCommand не поддерживается для SelectCommand, которая не возвращает никакой информации о столбце ключа», в то время как в рассматриваемой таблице есть первичный ключ (Identity, поскольку он MSSQL).

Мой код выглядит следующим образом:

       void loaddata()
    {
        try
        {
            DS = new DataSet();
            sqladapt = new SqlDataAdapter("SELECT servicetag,name,defect,primkey FROM " + Properties.Settings.Default.DBtableLaptops + "", sqlcon);
            sqladapt.FillSchema(DS, SchemaType.Source);
            sqladapt.Fill(DS);
            commandBuilder = new SqlCommandBuilder(sqladapt);
            DT = DS.Tables[0];
            Laptops_datagridview.DataSource = DT; //I'm using a datagridview to edit the data.
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

    }
    void savedata()
    {
        //Doesn't work yet.
        try
        {
            sqladapt.Update(DS); // <-- Throws the aforementioned error.
            sqladapt.Dispose();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

Загрузка данных и т. Д. Работает нормально, добавление новых строк также работает и сохраняет его.Но всякий раз, когда я обновляю или удаляю строку, выдается ошибка.Primkey - это мой первичный ключ, это целочисленное значение с автоинкрементом.

Я весь день гуглюл, но безрезультатно, что обычная проблема заключается в том, что первичный ключ не определен в первую очередь,но это не тот случай.

Любая информация будет принята с благодарностью, я уже 6 часов отлаживаю дробовик.

РЕДАКТИРОВАТЬ: операторы создания для рассматриваемой таблицы выглядят следующим образом:

CREATE TABLE [dbo].[laptopregistratieDB_laptops](
    [Servicetag] [text] NOT NULL,
    [Name] [text] NOT NULL,
    [Defect] [bit] NOT NULL,
    [primkey] [int] IDENTITY(1,1) NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Ответы [ 3 ]

7 голосов
/ 10 марта 2011

Вам необходимо сделать столбец primkey первичным ключом:

ALTER TABLE [dbo].[laptopregistratieDB_laptops]
   ADD CONSTRAINT PK_laptopregistratieDB_laptops PRIMARY KEY (primkey)

Вы также можете указать такое ограничение при создании таблицы:

CREATE TABLE [dbo].[laptopregistratieDB_laptops](
    [Servicetag] [text] NOT NULL,
    [Name] [text] NOT NULL,
    [Defect] [bit] NOT NULL,
    [primkey] [int] IDENTITY(1,1) NOT NULL,
    constraint PK_laptopregistratieDB_laptops PRIMARY KEY (primkey)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

или, если хотитеSQL Server для случайного создания имени ограничения (не рекомендуется, но некоторые люди делают это):

CREATE TABLE [dbo].[laptopregistratieDB_laptops](
    [Servicetag] [text] NOT NULL,
    [Name] [text] NOT NULL,
    [Defect] [bit] NOT NULL,
    [primkey] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

SQL Server также будет случайным образом называть ограничение, если вы применяете ограничение первичного ключа с помощью конструктора таблиц (справа)щелкните рядом со столбцом, для которого вы хотите использовать первичный ключ, выберите «Установить первичный ключ»)

Все эти параметры также можно использовать для указания первичных ключей из нескольких столбцов, за исключением варианта [primkey] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,(В сценарии конструктора необходимо выделить несколько строк перед щелчком правой кнопки мыши.)

4 голосов
/ 10 марта 2011

У вас есть первичный ключ в таблице?Если да, проверьте, установлен ли первичный ключ или нет?Проверьте свойство DS.DataTables[0].PrimaryKey

Установите первичный ключ в DataTable внутри DataSet.Вы можете сделать что-то вроде:

DS.DataTables[0].PrimaryKey  = DS.DataTables[0].DataColumns[3];

Это установит первичный ключ для обновления.

0 голосов
/ 05 января 2017

Ошибка в строке: " sqladapt = new SqlDataAdapter("SELECT servicetag,name,defect,primkey FROM ..., поскольку в ваш запрос на выборку не включается поле, являющееся первичным ключом или уникальным.

Вам необходимо исправить выбранный SQL, добавив первичное поле в таблицу.Например:

sqladapt = new SqlDataAdapter("SELECT ID, servicetag,name,defect,primkey FROM "

Надеюсь, что это поможет !!!

...