ASP.NET y Oracle, como recuperar PK

adlorenzo
05 de Enero del 2006
hola a todos,

Tengo desarrollada una aplicacion aspx con SQL SERVER, una vez terminada el cliente me ha pedido que la pase a ORacle.

PAra poder insertar una clave primaria autonumerica en oracle he hecho lo siguiente.

PRIMERO: despues de crear la tabla TBACCESO creo el índice PK_TBACCESO

SEGUNDO: defino una secuencia

CREATE SEQUENCE S_824_1_TBACCESO INCREMENT BY 1
START WITH 62 MAXVALUE 1.0E27 MINVALUE 1 NOCYCLE
CACHE 20 NOORDER

TERCERO: he añadido un package

CREATE OR REPLACE PACKAGE IDENTITYPKG as
LastIdentity number := -1000;
end IdentityPkg;

y por ultimo forcé la asignación de un valor secuencial en un trigger asociado a la tabla de ACCESOS

CREATE OR REPLACE TRIGGER TR_S_824_1_TBACCESO
BEFORE
INSERT ON TBACCESO FOR EACH ROW begin
select S_824_1_TBACCESO.NextVal
into :new.IDACCESO
from DUAL;
IdentityPkg.LastIdentity := :new.IDACCESO;
end;

lo he probado en el SQL*Plus WorkSheet y funciona correctamete

con la siguiente consulta me devuelve el valor correcto del idAccion

insert into TBACCESO(unidades) values ('12');
Select S_824_1_TBACCESO.CurrVal from DUAL;

Pero cuando trato de hacerlo desde la aplicacion .net, es decir desde la pagina .aspx correpondiente me da error

te copio el trozo de código:

Sql="insert into TBACCESO (unidades) values ('12');";

Comando.CommandText=Sql;

Comando.ExecuteNonQuery();

Sql="Select S_824_1_TBACCESO.CurrVal from DUAL;";

Comando.CommandText=Sql;

rstAux=Comando.ExecuteReader();

rstAux.Read();

Id=rstAux[0].ToString();

rstAux.Close();

la insert me la hace bien pero luego siempre me devuelve el valor "0" al ID.

y si trato de ejecutar las dos sentencias dentro del mismo ExecuteReader, me da un Error , como que la sentencia esta mal terminada.... (no se pueden ejecutar dos sentias..)

y no se que hacer para recuperar el valor de la claver primaria una vez hecha la insert...

cualquier genero de ayuda será bienvenida, gracias


LordFlies
05 de Enero del 2006
La solución más sencilla es que uses procedimientos almacenados para las inserciones. Este artículo puede servirte de ayuda:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnadonet/html/msdnorsps.asp

cashier
05 de Enero del 2006
Tengo funcionado un campo como autonumerico con un esquema semejante al que mencionas:

Primero la secuencia (es el mismo ejemplo que nos mencionas):
CREATE SEQUENCE S_824_1_TBACCESO INCREMENT BY 1
START WITH 62 MAXVALUE 1.0E27 MINVALUE 1 NOCYCLE
CACHE 20 NOORDER

Pero no es necesario package alguno

Creas la asignación de la secuencia al campo:

CREATE OR REPLACE TRIGGER TR_S_824_1_TBACCESO
BEFORE
INSERT ON TBACCESO FOR EACH ROW begin
select S_824_1_TBACCESO.NextVal
into :new.IDACCESO
from DUAL;
end;

Al insertar solo ejecutas el query de inserción y eso es todo:
Sql="insert into TBACCESO (unidades) values (\'12\')";
Comando.CommandText=Sql;
Comando.ExecuteNonQuery();