Ale*_*lex 3 .net c# sql dynamic-sql primary-key
总之,C#抛出我的"动态SQL生成的更新命令不支持针对不返回任何键列信息的SelectCommand",而问题的表是否有一个主键(身份,因为它是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);
}
}
Run Code Online (Sandbox Code Playgroud)
数据加载等工作正常,添加新行也可以工作,并保存它.但每当我更新或删除一行时,它都会抛出错误.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]
Run Code Online (Sandbox Code Playgroud)
您需要实际将您的primkey列作为主键:
ALTER TABLE [dbo].[laptopregistratieDB_laptops]
ADD CONSTRAINT PK_laptopregistratieDB_laptops PRIMARY KEY (primkey)
Run Code Online (Sandbox Code Playgroud)
您还可以在创建表时指定此类约束:
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]
Run Code Online (Sandbox Code Playgroud)
或者,如果您希望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]
Run Code Online (Sandbox Code Playgroud)
如果使用表设计器应用主键约束,SQL Server也将随机命名约束(右键单击要作为主键的列旁边的,选择"设置主键")
所有这些选项也可用于指定多列主键,但[primkey] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY变量除外.(在设计器方案中,您必须在右键单击之前突出显示多行).
| 归档时间: |
|
| 查看次数: |
13957 次 |
| 最近记录: |