简而言之,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]
答案 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 "
希望这有帮助!!!