在我的查询中,我不使用主键字段,因为启用了身份设置。
string sql = @"
INSERT INTO [tblTemplates] (personID, hash, data)
VALUES (@personID, @hash, @data)";
cmd = new SqlCeCommand(sql, cn);
cmd.Parameters.AddWithValue("@personID", newTemplate.personID);
cmd.Parameters.AddWithValue("@hash", newTemplate.templateHash);
cmd.Parameters.AddWithValue("@data", newTemplate.templateData);
cmd.ExecuteNonQuery();
随机我可以或不可以插入记录然后抛出异常:
无法将重复值插入唯一索引中 [表名= tblTemplates,约束名称= PK_ tblTemplates _templateID ]
这是表架构:
-- Script Date: 26.08.2011 10:37 - Generated by ExportSqlCe version 3.5.1.5
CREATE TABLE [tblTemplates] (
[templateID] int NOT NULL IDENTITY (1,1)
, [hash] nvarchar(100) NOT NULL
, [data] image NOT NULL
, [personID] int NOT NULL
);
GO
ALTER TABLE [tblTemplates] ADD CONSTRAINT [PK__tblTemplates__templateID] PRIMARY KEY ([templateID]);
GO
CREATE INDEX [IDX_tblTemplates_personID] ON [tblTemplates] ([personID] ASC);
GO
CREATE UNIQUE INDEX [UQ__tblTemplates__templateID] ON [tblTemplates] ([templateID] ASC);
GO
为什么我会收到此错误?
答案 0 :(得分:4)
解决方法:将字段数据类型从int转换为uniqueidentifier。
我的解决方法尝试:
尝试#1: 相同的连接
bool executed = false;
int counter = 0;
while (!executed)
{
try
{
cmd.ExecuteNonQuery();
succes = true;
}
catch (Exception ex)
{
Console.WriteLine("SERVER> (Error) Exception in AddTemplate() {0},{1}", ex.Source, ex.Message);
System.Threading.Thread.Sleep(100);
}
counter++;
}
结果:这似乎是一个无限循环。
尝试#2: 新连接
try
{
cmd.ExecuteNonQuery();
succes = true;
}
catch (Exception ex)
{
Console.WriteLine("SERVER> (Error) Exception in AddTemplate() {0},{1}", ex.Source, ex.Message);
System.Threading.Thread.Sleep(100);
AddTemplate(newTemplate); //Warning: Recursive call!
}
结果:此次尝试在一些递归调用后有所帮助。
答案 1 :(得分:0)
我有类似的问题。我在桌子上使用了IDENTITY_INSERT
SET IDENTITY_INSERT MyTable ON;
-- some identity insert on MyTable
SET IDENTITY_INSERT MyTable OFF;
此后,MyTable
上的所有插入都会抛出“重复值”错误。
解决这个问题的方法是
var cmd = Connection.CreateCommand();
cmd.CommandText = "SELECT MAX([Id] ) + 1 from [MyTable]";
object i = cmd.ExecuteScalar();
if (i != null && i is int)
{
cmd.CommandText = "ALTER TABLE [MyTable] ALTER COLUMN [Id] IDENTITY (" + i + ",1)";
cmd.ExecuteNonQuery();
}