Parameters 使用ODP.net将匿名参数传递到Oracle
不知何故,我了解到我可以简单地将参数传递到Oracle存储的进程中,它将能够将参数转换为适当的类型。我遇到了处理这些问题的问题。我收到一个“ORA-00900:无效SQL语句”返回给我。。。我猜这是因为我试图传递字符串。。。这就是我在某处读到的。。。 "http://www.dba-oracle.com/sf_ora_00900_invalid_sql_statement.htm" 将Oracle参数输入到存储过程中,然后使用.net变量执行该存储过程的技术是什么?我必须将.net字符串转换为ODP数据类型吗?我希望不是 下面是我的代码generall所做的Parameters 使用ODP.net将匿名参数传递到Oracle,parameters,odp.net,Parameters,Odp.net,不知何故,我了解到我可以简单地将参数传递到Oracle存储的进程中,它将能够将参数转换为适当的类型。我遇到了处理这些问题的问题。我收到一个“ORA-00900:无效SQL语句”返回给我。。。我猜这是因为我试图传递字符串。。。这就是我在某处读到的。。。 "http://www.dba-oracle.com/sf_ora_00900_invalid_sql_statement.htm" 将Oracle参数输入到存储过程中,然后使用.net变量执行该存储过程的技术是什么?我必须将.net字符串转换为O
XmlAttribute xAttribute;
using (OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["ACODBConnectionString"].ConnectionString))
{
using (OracleCommand cmd = new OracleCommand(sProc, conn))
{
int i = 0;
foreach (string path in paths)
{
string OracleParam;
xAttribute = AcoXMLDoc.SelectSingleNode(string.Format("//dataTemplateSpecification/templates/template/elements/element[@name='{0}']", path)).Attributes["value"];
if ((xAttribute.Value == null))
{
OracleParam = "";
cmd.Parameters.Add(colName[i], OracleParam);
}
else
{
OracleParam = xAttribute.Value;
cmd.Parameters.Add(colName[i], OracleParam);
}
i++;
}
conn.Open();
outcome = cmd.ExecuteNonQuery();
}
}
如您所见,我正在从XML文档中提取值,因此值自然将是字符串。。。如果我必须弄清楚如何将字符串更改为适当的数据类型,它将消耗大量的$$。cmd.Parameters.Add()需要一个作为参数的对象(而不是参数的值)
因此,这是可行的,有一些警告,但这里有一个测试用例:
设置Oracle位:
create table testParam(aa number, bb varchar2(50) , cc date)
/
create or replace procedure testProcParam(
p_aa IN TESTPARAM.AA%TYPE , --usage of tableName.ColumnName%Type has this "scoped" to the table.column AA (here it is number)
p_BB IN TESTPARAM.BB%TYPE , --The usage of TYPE here has it defined as VARCHAR2
p_CC IN TESTPARAM.CC%TYPE --this is DATE
) is
BEGIN
INSERT INTO testParam (AA, BB, CC) VALUES(P_AA, P_BB, P_CC);
END testProcParam ;
/
现在来看.net位:
OracleConnection con = Connect(constr);
// Set the command
OracleCommand cmd = new OracleCommand("testProcParam", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.BindByName = false; /*mark this false to bind by position*/
string AA = "123456" ;
OracleParameter oparamAA = new OracleParameter() ;
oparamAA.Value = AA;
cmd.Parameters.Add(oparamAA);
string BB = "abcdefghijklmnopqrst" ;
OracleParameter oparamBB = new OracleParameter() ;
oparamBB.Value = BB;
cmd.Parameters.Add(oparamBB);
string CC = "01-AUG-11" ; /*we rely on the nls date parameter to 'cast' this*/
OracleParameter oparamCC = new OracleParameter() ;
oparamCC.Value = CC;
cmd.Parameters.Add(oparamCC);
cmd.ExecuteNonQuery ();
con.Close();
con.Dispose();
现在需要注意的是:
然后您将获得您的数据:
SELECT * FROM testParam;
AA BB CC
---------------------- -------------------------------------------------- -------------------------
123456 abcdefghijklmnopqrst 01/08/11 00:00:00
/* --now to clean up
DROP procedure testProcParam ;
DROP table testParam ;
*/
编辑 根据您的评论;在PL/SQL中使用 tableName.ColumnName%类型 实际上,您只是将该数据类型绑定到表中列的数据类型(这允许更改列,并且不会破坏包) 对于我提供的示例:
p_aa IN TESTPARAM.AA%TYPE ,
p_BB IN TESTPARAM.BB%TYPE ,
p_CC IN TESTPARAM.CC%TYPE
与
p_aa IN NUMBER,
p_BB IN VARCHAR2 ,
p_CC IN DATE
不确定是否可以传入“匿名/通用数据类型”Wow。这是一个问题的完整答案。。。谢谢你的帮助。我想我缺少的是将bindbyname参数设置为false。。。我会测试一下。可能是今天下午的某个时候(今天有很多事情要做)。@DmainEvent太棒了,如果你遇到任何问题,请告诉我,我很难将日期时间转换成正确的格式。你会怎么推荐一个这样的。。。我将日期作为字符串和DateTime.Parse(字符串,“DD-MM-YYYY”)获取;然后将日期时间串起来……听起来对吗?如果您有任何建议,我将非常感谢。谢谢。@DmainEvent我认为日期会是一个棘手的问题。这取决于时间。我想将其格式化为nls_date_格式会行得通,但这会让您对更改和诸如此类的事情保持开放(或者,如果您知道这是一个日期,只需将参数构建为dbtype日期,并从那里开始避免这些陷阱!)我确实知道其中一些确实是日期…我将写一些东西并传入dbtype日期。。。