2010-10-23 5 views
-1

J'ai une procédure stockée:appel Oracle procédure stockée à partir de C#

CREATE OR REPLACE PROCEDURE UpdateFileMapping(field in number, original_Field_Names in DBMS_SQL.varChar2_table, mapped_Field_Ids in DBMS_SQL.number_table) 
IS 
C NUMBER := DBMS_SQL.OPEN_CURSOR; 
N NUMBER; 
BEGIN 
DBMS_SQL.PARSE(C,'INSERT INTO input_file_mapping VALUES(input_file_mapping_id.NextVal, 3, field, :fieldName, :mappedFieldId)', DBMS_SQL.NATIVE); 

DBMS_SQL.BIND_ARRAY(C,':fieldName', original_Field_Names); 
DBMS_SQL.BIND_ARRAY(C,':mappedFieldId', mapped_Field_Ids); 
N := DBMS_SQL.EXECUTE(C); 
DBMS_SQL.CLOSE_CURSOR(C); 
END; 

Comment appeler cette procédure qui prend en entrée de type DBMS_SQL.varChar2_table de C#?

+1

Vous avez donc tout à fait pas du code C# pour commencer? – BoltClock

Répondre

0
create or replace procedure UpdateFileMapping(m in Number,y in DBMS_SQL.varChar2_table,z in DBMS_SQL.number_table) 
IS 
C NUMBER; 
N NUMBER; 

BEGIN 

C := DBMS_SQL.OPEN_CURSOR; 
DBMS_SQL.PARSE(C,'INSERT INTO tablename VALUES(:x ,:fieldName,:mappedFieldId)',DBMS_SQL.NATIVE); 
DBMS_SQL.BIND_ARRAY(C,':fieldName',original_Field_Names); 
DBMS_SQL.BIND_ARRAY(C,':mappedFieldId',mapped_Field_Ids); 
DBMS_SQL.BIND_VARIABLE(C,':x',file_Id); 
N := DBMS_SQL.EXECUTE(C); 
DBMS_SQL.CLOSE_CURSOR(C); 

END; 

Pour plus d'informations: http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28419/d_sql.htm

0

Vous devez inclure le bon ODP.NET provider pour votre système, puis utiliser les types OracleConnection et OracleCommand pour créer une connexion et exécuter la procédure stockée. ODP.NET est livré avec une documentation complète et many examples.

+0

Pourquoi n'utiliser pas simplement 'System.Data.OracleClient'? – abatishchev

+2

Parce que [c'est obsolète] (http://blogs.msdn.com/b/adonet/archive/2009/06/15/system-data-oracleclient-update.aspx). –

+0

OMG. Merci pour l'information! – abatishchev

0

Essayez:

void ExecOracleStoredProcedure(int field, string[] original_Field_Names, int[] mapped_Field_Ids) 
{ 
    using (OracleConnection connection = new OracleConnection(connectionString)) 
    using (OracleCommand command = connection.CreateCommand()) 
    { 
     command.CommandText = "UpdateFileMapping"; 
     command.CommandType = CommandType.StoredProcedure; 

     command.Parameters.AddWithValue(":field").Value = field; 
     command.Parameters.AddWithValue(":original_Field_Names").Value = original_Field_Names; 
     command.Parameters.AddWithValue(":mapped_Field_Ids").Value = mapped_Field_Ids; 

     connection.Open(); 
     command.ExecuteNonQuery(); 
    } 
} 
+0

c'est exception exceptionelle "mauvais type de données ou argument pas suffisant"; –

+0

@Niraj: Essayez de spécifier les types de données corrects via 'command.Parameters.Add()' – abatishchev

0

Ressemble Enterprise Library de MS soutenir encore Oracle Database

Pour l'accès aux données Application Block, ce qui suit est également nécessaire:

Un serveur de base de données en cours d'exécution d'un base de données prise en charge par un fournisseur de données .NET Framework 3.5 avec Service Pack 1 ou .NET Framework 4.0. Cela inclut SQL Server® 2000 ou version ultérieure, SQL Server 2005 Compact Edition et Oracle 9i ou version ultérieure. Le serveur de base de données peut également exécuter une base de données prise en charge par .NET Framework 3.5 avec Service Pack 1 ou les fournisseurs de données .NET Framework 4.0 pour OLE DB ou ODBC.

Questions connexes