to :marcoak 比如我的存储过程如下:我在c#里对输入参数进行初始化 string[] i_string = new string[3] { "First Element", "Second Element ", "Third Element " }; 然后怎么处理啊?还请指教,谢谢!create or replace package pack_test as type string_array is table of varchar2(20) index by binary_integer; procedure sp_test(i_string in string_array, o_string out string_array); end ; --------- create or replace package body pack_test as procedure sp_test(i_string in string_array, o_string out string_array) is i integer; begin if i_string.count != 0 then for i in 1 .. i_string.count loop o_string(i) := i_string(i)||'-'||i; end loop; end if; end sp_test; end pack_test;
//循环为参数赋值 //注意,参数与参数值在各自的序列中位置应当对应 for (int i = 0, j = commandParameters.Length; i < j; i++) { commandParameters[i].Value = parameterValues[i]; }这里是怎么赋值的呀?我的parameterValues[i]也是个数组
你把你的数组加进object就行了.string[] i_string = new string[3] { "First Element", "Second Element ", "Third Element " }; //无返回值 params object[] parameterValues = new parameterValues[]{ i_string, null}; 输出参数要留空.如果你的存储过程有返回值, 也要留空. string[] i_string = new string[3] { "First Element", "Second Element ", "Third Element " }; //有返回值 params object[] parameterValues = new parameterValues[]{ null, i_string, null};
还请marcoak 再详解。谢谢
{
OracleParameter parameter = new OracleParameter(name, type);
parameter.Direction = ParameterDirection.Output;
command.Parameters.Add(parameter);
} public void AddInOrOutPatameter(string name,DbType type,object value)
{
DbProviderFactory ProviderFactory = DbProviderFactories.GetFactory(accessDb.DbConnectCreater().GetType().Namespace);
DbParameter parameter = ProviderFactory.CreateParameter();
parameter.ParameterName = name;
parameter.Value = value;
parameter.Direction = ParameterDirection.InputOutput;
parameter.DbType = type;
parameter.Size = 1000;
command.Parameters.Add(parameter);
}
传递参数时要一个个对应的传进去的
每次都会创建一个parameter 对象
你讲这个对象加到你的Command里面去 : command.Parameters.Add(parameter);
你的SP 有多少个参数需要传递
就写几行
上面是我自己包装了的
不是蛮好 你可以参考一下
string spName;//存储过程名
params object[] parameterValues; //参数值序列 OracleParameter[] commandParameters = GetSpParameters(spName, true);
AssignParameterValues(commandParameters, parameterValues); /// <summary>
/// 获取存储过程参数
/// </summary>
/// <param name="spName">存储过程名</param>
/// <param name="hasReturn">是否包含返回值</param>
/// <returns>返回参数序列</returns>
public OracleParameter[] GetSpParameters (string spName, bool hasReturn) {
//缓存HashTable的主键
string cacheKey = spName + (hasReturn ? " :hasReturn" : null);
//从Hachtable中获取参数
OracleParameter[] cachedParameters = (OracleParameter[])myCache[cacheKey];
if (cachedParameters == null) {
//如果Hachtable中没有,调用获取存储过程参数数组方法
cachedParameters = (OracleParameter[])(myCache[cacheKey] =
GetSpParameterSet(spName, hasReturn));
}
return CloneParameters(cachedParameters);
}/// <summary>
/// 拷贝缓存中的参数序列
/// </summary>
/// <param name="originalParameters">源参数序列</param>
/// <returns>拷贝后的参数序列</returns>
private OracleParameter[] CloneParameters (OracleParameter[] originalParameters) {
//拷贝缓存中的参数序列
OracleParameter[] clonedParameters = new OracleParameter[originalParameters.Length]; for (int i = 0, j = originalParameters.Length; i < j; i++) {
clonedParameters[i] =
(OracleParameter)((ICloneable)originalParameters[i]).Clone();
}
return clonedParameters;
}/// <summary>
/// 将参数值序列赋值给对应的参数序列
/// </summary>
/// <param name="commandParameters">待赋值的参数序列</param>
/// <param name="parameterValues">参数值序列</param>
private bool AssignParameterValues (OracleParameter[] commandParameters,
object[] parameterValues) {
if ((commandParameters == null) || (parameterValues == null)) {
//若参数为null,返回
return true;
} // 参数数组长度与参数值数组长度需匹配
if (commandParameters.Length != parameterValues.Length) {
Trace.Write("AssignParameterValues", "Error", "参数个数和参数值个数不匹配。");
return false;
} //循环为参数赋值
//注意,参数与参数值在各自的序列中位置应当对应
for (int i = 0, j = commandParameters.Length; i < j; i++) {
commandParameters[i].Value = parameterValues[i];
} return true;
}再废话一句. 如果要想ORACLE存储过程返回数据集,就要到游标和包.
/// 获取存储过程参数数组
/// </summary>
/// <param name="spName">存储过程名</param>
/// <param name="hasReturn">是否包含返回类型的参数</param>
/// <returns>参数数组</returns>
private OracleParameter[] GetSpParameterSet (string spName, bool hasReturn) {
using (OracleCommand cmd = new OracleCommand()) {
//创建并打开数据连接
if (!ConnectDataBase()) {
//连接数据库失败
Trace.Write("Connection", "Error", "连接数据库失败。");
} //为命令指定连接
cmd.Connection = conDB; //指定CommandText为存储过程名
cmd.CommandText = spName;
cmd.CommandType = CommandType.StoredProcedure;
//从存储过程中检索参数,填充到Parameters集
try {
OracleCommandBuilder.DeriveParameters(cmd);
}
catch (Exception e) {
//执行失败
//从异常中获取失败信息
string msg = e.Message;
Console.WriteLine(e.Message);
//调用写日志方法
Trace.Write("DeriveParameters", "Error", spName + "|" + msg);
} try {
//如果有返回值
if (!hasReturn) {
cmd.Parameters.RemoveAt(0);
}
}
catch (Exception e) {
//执行失败
//从异常中获取失败信息
string msg = e.Message;
Console.WriteLine(e.Message);
} //将Parameters集中的参数复制到参数数组
OracleParameter[] para = new OracleParameter[cmd.Parameters.Count];
cmd.Parameters.CopyTo(para, 0); return para;
}
}
比如我的存储过程如下:我在c#里对输入参数进行初始化 string[] i_string = new string[3] { "First Element", "Second Element ", "Third Element " };
然后怎么处理啊?还请指教,谢谢!create or replace package pack_test
as
type string_array is table of varchar2(20) index by binary_integer;
procedure sp_test(i_string in string_array,
o_string out string_array);
end ;
---------
create or replace package body pack_test as
procedure sp_test(i_string in string_array, o_string out string_array) is
i integer;
begin
if i_string.count != 0 then
for i in 1 .. i_string.count loop
o_string(i) := i_string(i)||'-'||i;
end loop;
end if;
end sp_test;
end pack_test;
//循环为参数赋值
//注意,参数与参数值在各自的序列中位置应当对应
for (int i = 0, j = commandParameters.Length; i < j; i++) {
commandParameters[i].Value = parameterValues[i];
}这里是怎么赋值的呀?我的parameterValues[i]也是个数组
//无返回值
params object[] parameterValues = new parameterValues[]{ i_string, null};
输出参数要留空.如果你的存储过程有返回值, 也要留空.
string[] i_string = new string[3] { "First Element", "Second Element ", "Third Element " };
//有返回值
params object[] parameterValues = new parameterValues[]{ null, i_string, null};