Gentle.Net学习笔记四:修改代码,使用Oracle数据库

    开始使用Gentle.Net的时候,我使用编译好的类库,可是不久就发现,如果要更好的利用Gentle.Net,你就不得不做一些修改,所以,还是使用源代码的方式为好.
   使用源代码,Gentle.Net作为三个项目添加的解决方案中, Gentle.Common;Gentle.FrameWork;Gentle.Provider.Oracle (根据项目的需要选择使用那个Provider), 有一个注意事项就是要引入Gentle的密钥对,否则不能编辑,这个在文档中右说明,我不在赘言.但是你已可以去掉这个签名,或者换成自己的签名,我就是去掉了签名使用的,这样方便些,不用每台机器都引入签名!就是修改那个AssemblyInfo.cs的文档中
[assembly: AssemblyKeyName( "Gentle" )]
去掉引号中的内容即可,要注意的是三个项目都有这个文件的.
[assembly: AssemblyKeyName( "" )]

好了,说了这么多,其实是为了引入这次的主角,Oracle!真不知道Oracle的Provider是怎么想的,字符串类型的数据字段竟然不能保存空字符串(就是引号之间甚麽都没有,可不是Null哟),害得我折腾了半天儿,终于在网上找到了原因! 下面就是我的解决方案,修改了一个函数,把空字符串替换为Null.希望对您有所帮助.
修改函数所在位置:Client\SqlStatement.cs
private void SetParameter( IDataParameter param, object val, FieldMap fm )
  {
   Check.Verify( param.Direction == ParameterDirection.Input ||
    param.Direction == ParameterDirection.InputOutput, "Cannot set value of output parameters!" );
   // do additional checking for known types
   if( map != null && fm != null )
   {
    param.Value = GetParameterValue( val, map, fm );

    //// 下面这几行语句添加自 Gu Zhigang
    /// 解决问题:因为oracle代理驱动的原因 ,字符型数据不能插入空字符串
    //if(this.Command.Connection.GetType().Name.IndexOf("Oracle",0)>=0)
    {
     if(param.DbType==DbType.AnsiString && param.Value.ToString()=="")
      param.Value=DBNull.Value;
    }
    //// 添加语句结束
   }
   else // unknown type - no clipping or fancy checks, just do it
   {
    param.Value = val != null ? val : DBNull.Value;
   }
  }
虽然不是真正的解决问题,但是能用就好了,要注意的就是程序中要注意这个变化.

原文地址:https://www.cnblogs.com/dajianshi/p/240423.html