C# ORA-00001:违反了唯一约束(SYSTEM.BROWSERS\u PK)

C# ORA-00001:违反了唯一约束(SYSTEM.BROWSERS\u PK),c#,sql,oracle,C#,Sql,Oracle,我正在从事一个C项目,在该项目中,我试图使用以下SQL对Oracle数据库插入一条记录: String Qry = INSERT INTO browsers (browsers.browser,browsers.engine,browsers.platform,browsers.version,browsers.grade) VALUES ('Alans browser','Gecko','every','1.0','U') RETURNING id INTO :ID 下面是示例代码: 我的代

我正在从事一个C项目,在该项目中,我试图使用以下SQL对Oracle数据库插入一条记录:

String Qry = INSERT INTO browsers (browsers.browser,browsers.engine,browsers.platform,browsers.version,browsers.grade) VALUES ('Alans browser','Gecko','every','1.0','U') RETURNING id INTO :ID
下面是示例代码:

我的代码如下:

OracleConnection conn = new OracleConnection(...);
OracleCommand cmd = null;
...
cmd = new OracleCommand(Qry, conn);
OracleParameter prm = new OracleParameter();
prm = new OracleParameter(":ID", OracleDbType.Int32, ParameterDirection.ReturnValue);
cmd.Parameters.Add(prm);
cmd.ExecuteNonQuery(); //this line throws error
query.setNewRecordID(cmd.Parameters[":ID"].Value.ToString());
...
 SCOTT@dev> CREATE TABLE "SCOTT"."EMP2"
  2    (
  3      "EMPNO"    NUMBER(4,0),
  4      "ENAME"    VARCHAR2(10 BYTE),
  5      "JOB"      VARCHAR2(9 BYTE),
  6      "MGR"      NUMBER(4,0),
  7      "HIREDATE" DATE,
  8      "SAL"      NUMBER(7,2),
  9      "COMM"     NUMBER(7,2),
 10      "DEPTNO"   NUMBER(2,0)
 11    )
 12    TABLESPACE "SYSTEM" ;

Table created.

SCOTT@dev> CREATE UNIQUE INDEX "SCOTT"."EMP2_EMPNO" ON "SCOTT"."EMP2"
  2    (
  3      "EMPNO"
  4    )
  5    TABLESPACE "SYSTEM" ;

Index created.

SCOTT@dev> set define off;
SCOTT@dev> ALTER TABLE "SCOTT"."EMP2" ADD PRIMARY KEY ("EMPNO");

Table altered.

SCOTT@dev>  CREATE SEQUENCE EMP2_SEQ MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 21 CACHE 20 NOORDER NOCYCLE  ;

Sequence created.

SCOTT@dev> CREATE OR REPLACE TRIGGER EMP2_TRG before
  2    INSERT ON SCOTT.EMP2 FOR EACH row BEGIN IF inserting THEN IF :NEW.EMPNO IS NULL THEN
  3    SELECT EMP2_SEQ.NEXTVAL INTO :NEW.EMPNO FROM dual;
  4  END IF;
  5  END IF;
  6  END;
  7  /

Trigger created.

SCOTT@dev> commit;

Commit complete.

SCOTT@dev> INSERT INTO EMP2
  2  (ENAME)
  3  VALUES
  4  ('FRED')
  5  /

1 row created.

SCOTT@dev> commit;

Commit complete.
当然,browsers表的id列被设置为在任何插入时自动递增的序列和触发器。我不明白为什么我没有尝试设置id列时会出现错误。我只是试图检索给新记录的id值

Uddate:以下是用于创建序列和触发器的SQL命令:

顺序:

创建序列SYSTEM.BROWSERS_SEQ MINVALUE 1 MAXVALUE 999999999999999999999增量1从21缓存开始20 NOORDER NOCYCLE NOPARTITION

触发:

create or replace trigger BROWSERS_TRG  
before insert on "SYSTEM"."BROWSERS" 
for each row 
begin  
   if inserting then 
      if :NEW."ID" is null then 
         select BROWSERS_SEQ.nextval into :NEW."ID" from dual; 
      end if; 
   end if; 
end;

您确定序列和触发器设置正确吗?通常我不使用触发器,只使用sequencer.nextval直接进入查询。如果您需要在代码的其他部分使用生成的id,您可以执行“select sequence.nextval from dual”并缓存结果

我认为您的序列存在问题,我无法按原样编译。我去掉了它的一部分,它成功了

我在SCOTT示例模式中创建了一个类似的场景,如下所示:

OracleConnection conn = new OracleConnection(...);
OracleCommand cmd = null;
...
cmd = new OracleCommand(Qry, conn);
OracleParameter prm = new OracleParameter();
prm = new OracleParameter(":ID", OracleDbType.Int32, ParameterDirection.ReturnValue);
cmd.Parameters.Add(prm);
cmd.ExecuteNonQuery(); //this line throws error
query.setNewRecordID(cmd.Parameters[":ID"].Value.ToString());
...
 SCOTT@dev> CREATE TABLE "SCOTT"."EMP2"
  2    (
  3      "EMPNO"    NUMBER(4,0),
  4      "ENAME"    VARCHAR2(10 BYTE),
  5      "JOB"      VARCHAR2(9 BYTE),
  6      "MGR"      NUMBER(4,0),
  7      "HIREDATE" DATE,
  8      "SAL"      NUMBER(7,2),
  9      "COMM"     NUMBER(7,2),
 10      "DEPTNO"   NUMBER(2,0)
 11    )
 12    TABLESPACE "SYSTEM" ;

Table created.

SCOTT@dev> CREATE UNIQUE INDEX "SCOTT"."EMP2_EMPNO" ON "SCOTT"."EMP2"
  2    (
  3      "EMPNO"
  4    )
  5    TABLESPACE "SYSTEM" ;

Index created.

SCOTT@dev> set define off;
SCOTT@dev> ALTER TABLE "SCOTT"."EMP2" ADD PRIMARY KEY ("EMPNO");

Table altered.

SCOTT@dev>  CREATE SEQUENCE EMP2_SEQ MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 21 CACHE 20 NOORDER NOCYCLE  ;

Sequence created.

SCOTT@dev> CREATE OR REPLACE TRIGGER EMP2_TRG before
  2    INSERT ON SCOTT.EMP2 FOR EACH row BEGIN IF inserting THEN IF :NEW.EMPNO IS NULL THEN
  3    SELECT EMP2_SEQ.NEXTVAL INTO :NEW.EMPNO FROM dual;
  4  END IF;
  5  END IF;
  6  END;
  7  /

Trigger created.

SCOTT@dev> commit;

Commit complete.

SCOTT@dev> INSERT INTO EMP2
  2  (ENAME)
  3  VALUES
  4  ('FRED')
  5  /

1 row created.

SCOTT@dev> commit;

Commit complete.

因此,顺序似乎是罪魁祸首。

OK,我将查询更改为:插入浏览器浏览器浏览器。ID,浏览器。浏览器,浏览器。引擎,浏览器。平台,浏览器。版本,浏览器。等级值浏览器\U SEQ.NEXTVAL,'Alans browser','Gecko','every','1.0','U';我正在SQLDeveloper中单独测试这个SQL语句,看看会发生什么。它本身就在产生错误。查询字符串中是否缺少某些内容?该序列的名称明确,表不为空。其中有59条记录,第一条记录的id=1。因此,您的序列可能是从表中已经存在的id开始的。为了增加序列,我运行了以下命令:alter sequence SYSTEM.BROWSERS_SEQ MINVALUE 1 MAXVALUE 9999999999999999999缓存20 NOORDER NOCYCLE increment 1;后面跟着一个INSERT语句,但没有帮助。相同的错误消息。您能否通过查询视图、用户\u触发器来确认触发器的状态已启用?我假设触发器是一个类似的before insert触发器,它插入了浏览器的下一个部分。我已经为上面的序列和触发器添加了代码。我很确定他们的设置是正确的。我不知道如何查询您所说的视图。你能告诉我查询是什么样子的吗?我会运行这样的查询,从user\u triggers中选择*FROM,table\u name='BROWSERS'和trigger\u name='BROWSERS\u TRG'OK。我运行了查询。这是成功的。“状态”列表示它已启用。只是想确保“状态”列表示它已“启用”。错误表明这似乎不起作用。谢谢Patrick。今天早上,我重新讨论了这个问题,并认为必须有一种方法来查询序列本身,并找出它当前的价值。通过从dual运行select browsers_seq.currval,我可以看到最后一个值,即48。我从表中删除了所有大于48条的记录,因为只有少数记录,所以一次只重新插入一条记录,没有错误。所以问题就解决了。谢谢你的帮助。