Primero que nada debes bajarte el conector de Oracle para .net desde :
http://www.oracle.com/technetwork/topics/dotnet/index-085163.htmlYa que el de Windows ya esta algo viejo mirar:
http://msdn.microsoft.com/es-es/library/77d8yct7%28v=vs.110%29.aspxsegún eso dice:
The types in System.Data.OracleClient are deprecated. The types are supported in version 4 of the .NET Framework but will be removed in a future release. Microsoft recommends that you use a third-party Oracle provider.
Ahora el motivo de tu error es que en lugar de "@" para los parametros se usa los ":"
ejemplo:
String commandString = "INSERT INTO Users (Name, Desk, UpdateTime) VALUES (:Name, :Desk, :UpdateTime)";
USING (OracleCommand command = NEW OracleCommand(commandString, _connection, _transaction))
{
command.Parameters.ADD("Name", OracleType.VARCHAR, 50).VALUE = strategy;
command.Parameters.ADD("Desk", OracleType.VARCHAR, 50).VALUE = deskName ?? OracleString.NULL;
command.Parameters.ADD("UpdateTime", OracleType.DateTime).VALUE = updated;
command.ExecuteNonQuery();
}
El ejemplo fue sacado de
http://stackoverflow.com/questions/343299/bulk-insert-to-oracle-using-netAhora la forma que recomiendo seria que crees un packete y dentro pongas los procedimientos almacenados un ejemplo con un pequeña tabla que hice.
-- Creamos la tabla
CREATE TABLE clientes
(
idcliente INTEGER NOT NULL,
nombre VARCHAR2(100)NOT NULL,
fecha_registro DATE NOT NULL,
CONSTRAINT pk_departamentos PRIMARY KEY(idcliente)
);
/
-- Creamos el packete y definimos los procedimientos-funciones etc.
CREATE OR REPLACE PACKAGE pk_clientes IS
TYPE t_cursor IS REF CURSOR;
PROCEDURE sp_registra(
p_nombre VARCHAR2,
p_fecha_registro DATE
);
PROCEDURE sp_actualiza(
p_idcliente INTEGER,
p_nombre VARCHAR2,
p_fecha_registro DATE
);
PROCEDURE sp_get_lista(
p_resul OUT t_cursor
);
PROCEDURE sp_get_info_cliente(
p_idcliente INTEGER,
p_resul OUT t_cursor
);
END pk_clientes;
/
-- Creamos el cuerpo del packete aqui se implementa los procedimientos-funciones etc.
CREATE OR REPLACE PACKAGE BODY pk_clientes IS
--Procedimiento para Registrar
PROCEDURE sp_registra(
p_nombre VARCHAR2,
p_fecha_registro DATE
)
IS
BEGIN
INSERT INTO clientes(
nombre,
fecha_registro
)VALUES(
p_nombre,
p_fecha_registro
);
COMMIT;
END;
--Procedimiento para Actualizar
PROCEDURE sp_actualiza(
p_idcliente INTEGER,
p_nombre VARCHAR2,
p_fecha_registro DATE
)
IS
BEGIN
UPDATE clientes SET
nombre=p_nombre,
fecha_registro=p_fecha_registro
WHERE
idcliente=p_idcliente;
COMMIT;
END;
--Procedimiento para Listar
PROCEDURE sp_get_lista(
p_resul OUT t_cursor
) IS
BEGIN
OPEN p_resul FOR
SELECT
idcliente,
nombre,
fecha_registro
FROM
clientes;
END;
--Procedimiento para Informacion de un cliente
PROCEDURE sp_get_info_cliente(
p_idcliente INTEGER,
p_resul OUT t_cursor
) IS
BEGIN
OPEN p_resul FOR
SELECT
idcliente,
nombre,
fecha_registro
FROM
clientes
WHERE
idcliente=p_idcliente;
END;
END pk_clientes;
/
-- Secuencia para hacer el campo idcliente autonumerico
CREATE SEQUENCE seq_cliente;
/
CREATE OR REPLACE TRIGGER tr_seq_cliente BEFORE INSERT ON clientes
FOR EACH ROW
BEGIN
SELECT seq_cliente.NEXTVAL INTO :NEW.idcliente FROM dual;
END;
Como podras fijarte eh creado un packete con todas las funciones que necesito para hacer mantenimiento a la tabla clientes. bueno para llamarlo desde .net asumiento que tengo una clase oCliente con propiedades idcliente,nombre,fecha_registro y quiero invocar al procedimiento sp_registra seria asi:
public static void RegistrarCliente(oCliente info)
{
using (OracleConnection oCn = new OracleConnection(App.GetStrConnection()))
{
string proc = string.Empty;
proc = "pk_clientes.sp_registra";
OracleCommand oCmd = new OracleCommand(proc, oCn);
oCmd.CommandType = CommandType.StoredProcedure;
oCmd.Parameters.Add(new OracleParameter("p_nombre", OracleDbType.Varchar2)).Value = info.nombre;
oCmd.Parameters.Add(new OracleParameter("p_fecha_registro", OracleDbType.Date)).Value = info.fecha_registro;
oCn.Open();
try
{
oCmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw new Exception(ex.Message, ex);
}
}
}
Bueno para no hacerlo mas largo te adjunto un pequeño proyecto que hice donde muestro mas detallado la invocacion de cada procedimiento del packete creado.
https://rapidshare.com/files/907284720/TestOracle.zipPara correrlo pues debes editar la cadena de conexion de App.config y claro ejecutar el script SQL de lineas arriba!!