Enterprise Library- Data Block使用oracle存储过程,字符串参数传入值为""时出现问题的解决

 在调用存储过程时,产生如下错误:

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:/inetpub/wwwroot/resource/datalay/dbresource.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:/inetpub/wwwroot/resource/datalay/dbresource.cs:69
   ReSource.BusLay.BusResource.Insert() in c:/inetpub/wwwroot/resource/buslay/busresource.cs:119
   ReSource.WebLay.MYRESOURCEAdd.Insert(Object sender, EventArgs e) in c:/inetpub/wwwroot/resource/weblay/tjzy/myresourceadd.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.

Microsoft.Practices.EnterpriseLibrary.Data是一个强大的.NET框架,用于开发企业级应用程序。连接字符串是用于连接到数据库的重要组成部分。在某些情况下,我们需要对连接字符串进行加密以增加安全性。 要对连接字符串进行加密,我们可以使用Microsoft提供的企业库(Enterprise Library)中的数据访问块(Data Access Block)。以下是一些步骤: 1. 首先,我们需要在项目中添加对Microsoft.Practices.EnterpriseLibrary.Data的引用。可以通过NuGet包管理器来安装。 2. 接下来,我们需要在config文件中定义连接字符串。可以使用app.config(用于Windows桌面应用程序)或web.config(用于Web应用程序)文件。例如: ``` <connectionStrings> <add name="MyDatabase" connectionString="[Your Connection String Here]" providerName="System.Data.SqlClient" /> </connectionStrings> ``` 3. 然后,我们需要在config文件中配置加密。可以在configSections中添加以下配置: ``` <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data" /> ``` 并在configuration节点下添加以下配置: ``` <dataConfiguration defaultDatabase="MyDatabase" /> ``` 4. 接下来,我们需要使用工具对连接字符串进行加密。可以使用命令行实用程序`encrypt.exe`,该程序位于Enterprise Library安装目录的bin文件夹中。 打开命令提示符,并导航到`encrypt.exe`所在的目录。然后使用以下命令对连接字符串进行加密: ``` encrypt.exe -section:connectionStrings -prov DataProtectionConfigurationProvider -appConfig "path\to\your\config\file" ``` 这将使用Windows数据保护API对连接字符串进行加密,并将结果存储在config文件中。 5. 最后,我们可以在代码中使用加密后的连接字符串使用DatabaseFactory类的CreateDatabase方法来获取数据库实例。例如: ```csharp Database db = DatabaseFactory.CreateDatabase(); ``` 通过以上步骤,我们可以使用Microsoft.Practices.EnterpriseLibrary.Data的加密功能对连接字符串进行加密。这将增加我们应用程序的安全性,并保护敏感的数据库连接信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值