zoukankan      html  css  js  c++  java
  • Enterprise Library Data Block运用oracle存储历程

    Enterprise Library- Data Block运用oracle存储历程,字符串参数传入值为时出现后果的处置惩罚

     前导发轫:culturenet的 Blog 作者:culturenet的 Blog  




    ">

     在挪用存储历程时,发作如下错误:

    Parameter ''''p_R_URL'''': No size set for variable length data type: String.

    剖析');: 实行当前 Web 苦求时期,出现未处置惩罚的十分。请反省货仓跟踪信息,以认识有关该错误以及代码中招致错误的来由的具体信息。

    十分具体信息: System.Exception: Parameter ''''p_R_URL'''': No size set for variable length data type: String.

    源错误:

    行 67: 			catch(Exception ex)
    行 68: 			{
    行 69: 				throw new Exception(ex.Message);
    行 70: 				//return false;
    行 71: 			}


    源文件: c:inetpubwwwrootresourcedatalaydbresource.cs    行: 69

    货仓跟踪:

    [Exception: Parameter ''''p_R_URL'''': No size set for variable length data type: String.]
       ReSource.DataLay.DbResource.Insert(String R_TITLE, String R_USE, String R_XKML, String R_GRLB, String R_WJLB, DateTime R_ADDTIME, String R_URL, String R_PRIVATE, String R_COMMONT) in c:inetpubwwwrootresourcedatalaydbresource.cs:69
       ReSource.BusLay.BusResource.Insert() in c:inetpubwwwrootresourcebuslaybusresource.cs:119
       ReSource.WebLay.MYRESOURCEAdd.Insert(Object sender, EventArgs e) in c:inetpubwwwrootresourceweblaytjzymyresourceadd.aspx.cs:80
       System.EventHandler.Invoke(Object sender, EventArgs e)  0
       System.Web.UI.WebControls.LinkButton.OnClick(EventArgs e)  108
       System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)  57
       System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)  18
       System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)  138
       System.Web.UI.Page.ProcessRequestMain()  1292
    



    版本信息: Microsoft .NET Framework 版本:1.1.4322.2300; ASP.NET 版本:1.1.4322.2300

    十分担忧,于是就翻开Enterprise Library的源代码终了调试。发现后果正本出今朝 OracleCommandWrapper.cs文件中的 如下函数:(从345 行入手动手)

    private OracleParameter CreateParameter(string name, DbType dbType, int size, ParameterDirection direction, bool nullable, byte precision, byte scale, string sourceColumn, DataRowVersion sourceVersion, object value)
            {
                OracleParameter param = this.command.CreateParameter();
                param.ParameterName = name;
                param.DbType = dbType;
                param.Size = size;
                param.Value = (value == null) ? DBNull.Value : value;
                // modify parameter type and value for special cases
                switch (dbType)
                {
                        // for Guid, change to value to byte array
                    case DbType.Guid:
                        guidParameters.Add(param.ParameterName, "System.Guid");
                        param.OracleType = OracleType.Raw;
                        param.Size = 16;
                        // convert Guid value to byte array only if not null
                        if ((value is DBNull) || (value == null))
                        {
                            param.Value = Convert.DBNull;
                        }
                        else
                        {
                            param.Value = ((Guid)value).ToByteArray();
                        }
                        break;
                        //                case DbType.AnsiString:
                        //                case DbType.AnsiStringFixedLength:
                        //                case DbType.String:
                        //                case DbType.StringFixedLength:                
                        //                    // for empty string, set it to DBNull
                        //                    if ((value == null) || (!(value is DBNull)) && ((string)value).Length == 0) 
                        //                    {
                        //                        param.Value = Convert.DBNull;
                        //                    }
                        //                    break;
                    default:
                        break;
                }
                param.Direction = direction;
                param.IsNullable = nullable;
                param.Precision = precision;
                param.Scale = scale;
                param.SourceColumn = sourceColumn;
                param.SourceVersion = sourceVersion;
                return param;
            }

     

    可以看到,代码中处置惩罚了传入值为 NULL的环境。但是不知道为什么把处置惩罚字符串参数即是 "" 的时分得语句给解释失了。于是乎,就更动源代码,如下:


    private OracleParameter CreateParameter(string name, DbType dbType, int size, ParameterDirection direction, bool nullable, byte precision, byte scale, string sourceColumn, DataRowVersion sourceVersion, object value)
            {
                OracleParameter param = this.command.CreateParameter();
                param.ParameterName = name;
                param.DbType = dbType;
                param.Size = size;
                param.Value = (value == null) ? DBNull.Value : value;
                // modify parameter type and value for special cases
                switch (dbType)
                {
                        // for Guid, change to value to byte array
                    case DbType.Guid:
                        guidParameters.Add(param.ParameterName, "System.Guid");
                        param.OracleType = OracleType.Raw;
                        param.Size = 16;
                        // convert Guid value to byte array only if not null
                        if ((value is DBNull) || (value == null))
                        {
                            param.Value = Convert.DBNull;
                        }
                        else
                        {
                            param.Value = ((Guid)value).ToByteArray();
                        }
                        break;
                        case DbType.AnsiString:
                        case DbType.AnsiStringFixedLength:
                        case DbType.String:
                        case DbType.StringFixedLength:                
                            // for empty string, set it to DBNull
                            if ((value == null) || (!(value is DBNull)) && ((string)value).Length == 0) 
                            {
                                param.Value = Convert.DBNull;
                            }
                            break;
                    default:
                        break;
                }
                param.Direction = direction;
                param.IsNullable = nullable;
                param.Precision = precision;
                param.Scale = scale;
                param.SourceColumn = sourceColumn;
                param.SourceVersion = sourceVersion;
                return param;
            }

    后果的到认识决。但是不知道微软的代码为什么把这个给解释失了。

    其后,上网上看到Oracle 的一个论坛上的帖子上有如下的描摹:


    Oracle will treat '''''''' (empty string) as
    NULL, and store as NULL anyway - better be prepared for it, and
    treat it as such.





    版本信息: Microsoft .NET Framework 版本:1.1.4322.2300; ASP.NET 版本:1.1.4322.2300

    十分担忧,于是就翻开Enterprise Library的源代码终了调试。发现后果正本出今朝 OracleCommandWrapper.cs文件中的 如下函数:(从345 行入手动手)

    private OracleParameter CreateParameter(string name, DbType dbType, int size, ParameterDirection direction, bool nullable, byte precision, byte scale, string sourceColumn, DataRowVersion sourceVersion, object value)
            {
                OracleParameter param = this.command.CreateParameter();
                param.ParameterName = name;
                param.DbType = dbType;
                param.Size = size;
                param.Value = (value == null) ? DBNull.Value : value;
                // modify parameter type and value for special cases
                switch (dbType)
                {
                        // for Guid, change to value to byte array
                    case DbType.Guid:
                        guidParameters.Add(param.ParameterName, "System.Guid");
                        param.OracleType = OracleType.Raw;
                        param.Size = 16;
                        // convert Guid value to byte array only if not null
                        if ((value is DBNull) || (value == null))
                        {
                            param.Value = Convert.DBNull;
                        }
                        else
                        {
                            param.Value = ((Guid)value).ToByteArray();
                        }
                        break;
                        //                case DbType.AnsiString:
                        //                case DbType.AnsiStringFixedLength:
                        //                case DbType.String:
                        //                case DbType.StringFixedLength:                
                        //                    // for empty string, set it to DBNull
                        //                    if ((value == null) || (!(value is DBNull)) && ((string)value).Length == 0) 
                        //                    {
                        //                        param.Value = Convert.DBNull;
                        //                    }
                        //                    break;
                    default:
                        break;
                }
                param.Direction = direction;
                param.IsNullable = nullable;
                param.Precision = precision;
                param.Scale = scale;
                param.SourceColumn = sourceColumn;
                param.SourceVersion = sourceVersion;
                return param;
            }

     

    可以看到,代码中处置惩罚了传入值为 NULL的环境。但是不知道为什么把处置惩罚字符串参数即是 "" 的时分得语句给解释失了。于是乎,就更动源代码,如下:


    private OracleParameter CreateParameter(string name, DbType dbType, int size, ParameterDirection direction, bool nullable, byte precision, byte scale, string sourceColumn, DataRowVersion sourceVersion, object value)
            {
                OracleParameter param = this.command.CreateParameter();
                param.ParameterName = name;
                param.DbType = dbType;
                param.Size = size;
                param.Value = (value == null) ? DBNull.Value : value;
                // modify parameter type and value for special cases
                switch (dbType)
                {
                        // for Guid, change to value to byte array
                    case DbType.Guid:
                        guidParameters.Add(param.ParameterName, "System.Guid");
                        param.OracleType = OracleType.Raw;
                        param.Size = 16;
                        // convert Guid value to byte array only if not null
                        if ((value is DBNull) || (value == null))
                        {
                            param.Value = Convert.DBNull;
                        }
                        else
                        {
                            param.Value = ((Guid)value).ToByteArray();
                        }
                        break;
                        case DbType.AnsiString:
                        case DbType.AnsiStringFixedLength:
                        case DbType.String:
                        case DbType.StringFixedLength:                
                            // for empty string, set it to DBNull
                            if ((value == null) || (!(value is DBNull)) && ((string)value).Length == 0) 
                            {
                                param.Value = Convert.DBNull;
                            }
                            break;
                    default:
                        break;
                }
                param.Direction = direction;
                param.IsNullable = nullable;
                param.Precision = precision;
                param.Scale = scale;
                param.SourceColumn = sourceColumn;
                param.SourceVersion = sourceVersion;
                return param;
            }

    后果的到认识决。但是不知道微软的代码为什么把这个给解释失了。

    其后,上网上看到Oracle 的一个论坛上的帖子上有如下的描摹:


    Oracle will treat '''''''' (empty string) as
    NULL, and store as NULL anyway - better be prepared for it, and
    treat it as such.





    版权声明: 原创作品,容许转载,转载时请务必以超链接形式标明文章 原始来由 、作者信息和本声明。否则将深究法律责任。

  • 相关阅读:
    10000000000
    vue生命周期
    react基础
    第一个react
    vuex状态管理2
    vue配合UI组件
    vuex
    vue-router配合vue-cli的实例
    vue-router2.0
    父子组件2.0
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1976078.html
Copyright © 2011-2022 走看看