使用SQLAdapter.Update(数据集)引发错误“select命令中没有主键”

时间:2011-03-10 14:12:58

标签: c# .net sql primary-key dynamic-sql

简而言之,C#抛弃了我“对于不返回任何键列信息的SelectCommand,不支持UpdateCommand的动态SQL生成”,而有问题的表具有主键(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语句如下:

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 个答案:

答案 0 :(得分:7)

您需要将您的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变体之外,所有这些选项也可用于指定多列主键。 (在设计器方案中,您必须在右键单击之前突出显示多行。)

答案 1 :(得分:4)

你真的在表中有一个主键吗?如果是,请检查是否设置了主键?检查属性DS.DataTables[0].PrimaryKey

DataTable内的DataSet内设置主键。你可以这样做:

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

这将设置更新的主键。

答案 2 :(得分:0)

行中出错:" sqladapt = new SqlDataAdapter("SELECT servicetag,name,defect,primkey FROM ...,因为在您的选择查询中不包含主键或唯一字段。

您需要通过在表格中添加主要字段来修复您的选择SQL。例如:

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

希望这有帮助!!!

相关问题