在使用log4net时,感觉最麻烦的就是配置文件了,为了使用方便,我不得不先准备好一个完整的配置文件方案,测试了输出到文本、控制台、windows事件、SQL Server数据库都没有问题,但输出到oracle就不那么顺利了。 感觉connectionType和connectionString都没有错,但Oracle中没有输出,它是config文件,又不能插入断点调试,真是纠结!
调试方法
其实,强大的log4net本有调试,只不过无知的我不知道怎么用,其实也很简单,在配置文件configuration节点内添加
代码如下:
<appSettings>
<add key="log4net.Internal.Debug" value="true "/>
</appSettings>
很快,我们在输出窗口看到了问题:
排错修改
错误一:ORA-01036: 非法的变量名/编号
解决:即然知道什么了,那就好修改了。经查,ORA-01036: 非法的变量名/编号原因很可能是存储过程的包体的参数定义与包头的定义不一样,很多时候修改了包体,却忘了修改包头。 另外,创建OracleParameter时,由于构造函数的版本众多,使用了某些版本时,可能会出现这个错误,建议创建OracleParameter时,一定要指定OracleType。
直接使用Sql 语句时,在Sql 语句中的 参数部分没有使用冒号作为前缀,或者错误使用了Sql Server 的"@"符号都会导致此错误。总之此错误出现在Parameter指定的ParameterName,与实际参数名称不匹配时。
SqlClient参数表达式:@ParameterName
OracleClient参数表达式::ParameterName
注意Version和 PublicKeyToken和判断方法:
错误二: ERROR [AdoNetAppender] ErrorCode: GenericFailure. Exception while writing to database
解决:缺少bufferSize value="1"
错误三:System.Data.OleDb.OleDbException (0x80040E07): 标准表达式中数据类型不匹配。
解决:输出到Access中时, datetime会转换失败,只设置Access的时间字段为string类型。官网示例中也是使用的string类型。
参考链接:
http://logging.apache.org/log4net/release/config-examples.html