当前位置: 首页 > 编程语言 > C#

C#LearningTutorial-ProblemsCallingStoredProceduresfromC#UsingLargeCLOBsSharing

时间:2023-04-10 21:45:16 C#

C#CallingStoredProceduresUsingLargeCLOBs问题我不是第一个遇到这些问题的人,我会在下面的文章中列出一些参考资料,但我仍在寻找以获得适当的解决方案。我需要从C#Web服务调用存储过程(Oracle10g数据库)。Web服务器安装了Oracle9i客户端,我使用的是MicrosoftsSystem.Data.OracleClient。该过程将XML作为CLOB。当XML超过4000字节(这可能是正常用例)时,我偶然发现了以下错误:ORA-01460-请求执行未实现或不合理的转换我发现了这个、这个和这个帖子。此外,我发现了一个很有前途的解决方法,它不直接从C#调用存储过程,而是定义了一段匿名PL/SQL代码。此代码作为OracleCommand运行。XML作为字符串文字嵌入,过程调用是从这段代码完成的:privateconststringLoadXml="DECLARE"+"MyXMLCLOB;"+"iStatusINTEGER;"+"sErrMessageVARCHAR2(2000);"+“开始”+“MyXML:=‘{0}’;”+“iStatus:=LoadXML(MyXML,sErrMessage);”+“DBMS_OUTPUT.ENABLE(buffer_size=>NULL);”+“DBMS_OUTPUT.PUT_LINE(iStatus||','||sErrMessage);"+"结束;";OracleCommandoraCommand=newOracleCommand(string.Format(LoadXml,xml),oraConnection);oraCommand.ExecuteNonQuery();不幸的是,一旦XML超过32KB左右,这种方法就会失败,这在我的应用程序中仍然很有可能。这次错误源自PL/SQL编译器,它说:ORA-06550:line1,column87:PLS-00172:stringliteraltoolong经过一番研究,我得出结论,使用我的第二种方法解决问题不是可行的。根据上面的帖子,我有以下两个选择。(第一篇文章说一些客户有问题,但我的(9i)不在上述10g/11g版本的范围内。)你能确认这是剩下的两个选项吗?或者有其他方法可以帮助我吗?澄清一下:XML最终并没有保存在任何表中,而是由一个存储过程处理的,该存储过程根据XML内容在某个表中插入一些记录。我对这两个选项的想法:我发现还有另一种方法可以解决问题!我的一位同事通过向我指出这篇博文来挽救我的一天:在DbConnection上调用BeginTransaction时设置参数值。能再简单点吗?该博客是关于Oracle.DataAccess的,但它是关于System.Data.OracleClient的。实际上这意味着:varcmd=newOracleCommand("LoadXML",_oracleConnection);cmd.CommandType=CommandType.StoredProcedure;varxmlParam=newOracleParameter("XMLFile",OracleType.Clob);cmd.Parameters.Add(xmlParam);//在此位置不要分配参数值cmd.Transaction=_oracleConnection.BeginTransaction();try{//在这里分配值,在启动TXxmlParam.Value=xmlWithWayMoreThan4000Characters;cmd.ExecuteNonQuery();命令。事务.提交();}catch(OracleException){cmd.Transaction.Rollback();Chiccodoro的解决方案在我的案例中不起作用。我正在使用ODP.NET(Oracle.DataAccess)。对我来说,解决方案是使用OracleClob对象。OracleCommandcmd=newOracleCommand("LoadXML",_oracleConnection);cmd.CommandType=CommandType.StoredProcedure;OracleParameterxmlParam=newOracleParameter("XMLFile",OracleType.Clob);cmd.Parameters.Add(xmlParam);//连接应该是打开的!OracleClobclob=newOracleClob(_oracleConnection);//xmlData:一个超过4000个字符的字符串clob.Write(xmlData.ToArray(),0,xmlData.Length);xmlParam.Value=clob;尝试{cmd.ExecuteNonQuery();}catch(OracleExceptione){}chiccodoro是对的。publicstaticintRunProcedure(stringstoredProcName,IDataParameter[]parameters){using(OracleConnectionconnection=newOracleConnection(connectionString)){introwsAffected;OracleCommandcommand=newOracleCommand(storedProcName,connection);command.CommandText=storedProcCommandType=命令。命令类型.StoredProcedure;foreach(OracleParameterparameterinparameters){command.Parameters.Add(parameter);}connection.Open();try{//开始事务command.Transaction=connection.BeginTransaction();rowsAffected=command.ExecuteNonQuery();命令.Transaction.Commit();}catch(System.Exceptionex){command.Transaction.Rollback();扔前;}connection.Close();返回受影响的行;我想我只是用谷歌搜索了这个便宜的学分,但这里有一个很好的解释:http://www.orafaq.com/forum/t/48485/0/基本上,你不能在一个字符串中使用超过4000个字符字面意思,如果你需要做更多的事情,你就不得不使用存储过程。然后你被限制为最大32KB,所以你必须“插入”插入。比利什。-Oisin以上是C#学习教程:使用大型CLOB从C#中调用存储过程。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: