惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - culturenet

jQuery Mobile 小问题解决一例 flash的传值问题 Oracle 升级以后 HTTP Server 一则小错误解决 installshield安装文件的制作小技巧--附加数据库 使用installshild解决某些安装文件无法在win2003上安装的问题 vsta下vs2005产生错误,解决之 Test Windows Live Write (Bate) Gridview中当设置自动生成列时对列中字段使用 html代码显示 修改ppt另存为网页的mht文件内容,更改其显示方式 修改OleDB provider 移植 Data Application Blocks项目中使用存储过程的应用(Oracle or MsSqlServer)到Microsoft Access Enterprise Library- Data Block 使用MS Access的问题的解决 Oracle Services For Microsoft Transaction Server的问题的发现与解决 LinkButton 的提交两次问题的解决 Enterprise Library - Data Block oracle返回 cursor 问题的解决 web.config中的pageBaseType问题 修改客户端Script,解决r.a.d.controls Q2 2005中TreeView 控件遮挡问题 [导入]汉字区位码查询 [导入]c#取得汉字的拼音的首字母。 [导入]url传递中文的解决方案总结 [导入]转:url传递中文的解决方案总结
Enterprise Library- Data Block使用oracle存储过程,字符串参数传入值为""时出现问题的解决
culturenet · 2005-09-22 · via 博客园 - culturenet

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

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.