.net,ADO.NET,oracle,DBHELPERORA 我们知道.NET中调用ORACLE 的过程没有调用MS-SQLSERVER中的存储过程那么方便,尤其用到参数输出的时候,但是ORACLE的功能强大不会这个不能处理,这个你懂得,呵呵。 2个解决方案,一个是ORACLE中的函数可以带参数输出的,这
.net,ADO.NET,oracle,DBHELPERORA
我们知道.NET中调用ORACLE 的过程没有调用MS-SQLSERVER中的存储过程那么方便,尤其用到参数输出的时候,但是ORACLE的功能强大不会这个不能处理,这个你懂得,呵呵。
2个解决方案,一个是ORACLE中的函数可以带参数输出的,这个比较吻合SQLSERVER中的存储过程(个人比较意见用 ORACLE中的函数应对SQLSERVER中的存储过
程。
二就是用PROCEDURE 的OUT参数带出结果来解决这个问题。
下面来做个程序测试
qiantian" runat="server">
Button1" runat="server" OnClick="Button1_Click" Text="测试FUNCTION输出" />
button2" runat="server" OnClick="button2_Click" Text="测试PROCEDUCE输出" />
Button3" runat="server" Text="测试FUNCTION三层" OnClick="Button3_Click" />
Button4" runat="server" Text="测试PROCEDURE三层" OnClick="Button4_Click" />
后台代码 针对测试FUNCTION输出(直接写在代码里面)
protected void Button1_Click(object sender, EventArgs e)
{
OracleConnection conn = new OracleConnection("Data Source=yu;Persist Security Info=True;User ID=$$$$$$;Password=$$$$$$$$;Unicode=True;");
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "F_ACC_CREATEPERMISSION";
cmd.CommandType = CommandType.StoredProcedure;
// add the parameters, including the return parameter to retrieve
cmd.Parameters.Add("CategoryID", OracleType.Number).Value = 555;
cmd.Parameters.Add("Description", OracleType.VarChar, 50).Value = "zzz1";
// the return value
cmd.Parameters.Add("Result", OracleType.Number).Direction = ParameterDirection.ReturnValue;
// execute the function
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
// output the result
Response.Write("Resultis:" + cmd.Parameters["Result"].Value);
}
后台代码 针对测试FUNCATION (通过参数 数据库类的 三层模式输出)
protected void Button3_Click(object sender, EventArgs e)
{
// Accounts.Bus.Permissions myperm = new Accounts.Bus.Permissions();
Accounts.Data.Permission myperm = new Accounts.Data.Permission();
int i = myperm.Create(555, "zzz3");
Response.Write(i.ToString());
}
PERMISSION 类中代码
///
/// 创建一个权限
///
public int Create(int categoryID, string description)
{
int rowsAffected;
OracleParameter[] parameters =
{
new OracleParameter("CategoryID", OracleType.Number),
new OracleParameter("Description", OracleType.VarChar,50)
};
parameters[0].Value = categoryID;
parameters[1].Value = description;
return DbHelperOra.RunProcedure("F_ACC_CREATEPERMISSION", parameters, out rowsAffected);
}
DbHelperOra中的代码
///
/// 执行存储过程,返回影响的行数对应ORACLE 的FUNCTION 的RETURN用的
///
/// 存储过程名
/// 存储过程参数
/// 影响的行数
///
public static int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected)
{
using (OracleConnection connection = new OracleConnection(connectionString))
{
int result;
connection.Open();
OracleCommand command = BuildIntCommand(connection, storedProcName, parameters);
rowsAffected = command.ExecuteNonQuery();
result = int.Parse(command.Parameters["ReturnValue"].Value.ToString());
//Connection.Close();
return result;
}
}
BuildIntCommand调用的代码段
///
/// 创建OracleCommand 对象实例(用来返回一个整数值)
///
/// 存储过程名
/// 存储过程参数
/// OracleCommand 对象实例
private static OracleCommand BuildIntCommand(OracleConnection connection, string storedProcName, IDataParameter[] parameters)
{
OracleCommand command = BuildQueryCommand(connection, storedProcName, parameters);
//command.Parameters.Add(new OracleParameter("ReturnValue", OracleType.Int32, 4, ParameterDirection.ReturnValue,false, 0, 0, string.Empty, DataRowVersion.Default, null));
command.Parameters.Add("ReturnValue", OracleType.Number).Direction = ParameterDirection.ReturnValue;
return command;
}
BuildQueryCommand调用的代码段
///
/// 构建OracleCommand 对象(用来返回一个结果集,而不是一个整数值)
///
/// 数据库连接
/// 存储过程名
/// 存储过程参数
/// OracleCommand
private static OracleCommand BuildQueryCommand(OracleConnection connection, string storedProcName, IDataParameter[] parameters)
{
OracleCommand command = new OracleCommand(storedProcName, connection);
command.CommandType = CommandType.StoredProcedure;
foreach (OracleParameter parameter in parameters)
{
command.Parameters.Add(parameter);
}
return command;
}
本文原创发布php中文网,转载请注明出处,感谢您的尊重!