C# 从C调用Oracle存储过程#

C# 从C调用Oracle存储过程#,c#,oracle,stored-procedures,C#,Oracle,Stored Procedures,我有一个存储过程: 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 i

我有一个存储过程:

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;

如何从C#?

调用这样的过程,该过程将作为
DBMS_SQL.varChar2_表的输入,您需要包括适合您的系统的类型,然后使用
OracleConnection
OracleCommand
类型创建连接并执行存储过程。ODP.NET附带了丰富的文档和功能。

请尝试:

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();
    }
}
看起来MS仍然支持Oracle数据库

对于数据访问应用程序块,还需要以下内容:

运行由带有Service Pack 1的.NET Framework 3.5或.NET Framework 4.0数据提供程序支持的数据库的数据库服务器。这包括SQL Server®2000或更高版本、SQL Server 2005 Compact Edition和Oracle 9i或更高版本。数据库服务器还可以运行.NET Framework 3.5 with Service Pack 1或.NET Framework 4.0 OLE DB或ODBC数据提供程序支持的数据库

有关更多信息:

那么你一开始就完全没有C代码了?为什么不直接使用
System.Data.OracleClient
?因为。这是一个异常“错误的数据类型或参数不足”@Niraj:尝试通过
command.Parameters.Add()指定正确的数据类型
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;