我看过这个问题,但是因为它使用了NLog.config文件,所以我无法将答案转化为我需要的内容.
NLog – Write NULL to optional database column
我刚刚开始使用NLog,因为它被建议作为我问的另一个问题的答案.由于我在类库中使用它,并且我不想在每个使用该库的应用程序中放置NLog.config文件,因此我使用的是配置API.
我想要做的是在我的日志表中将一些列设置为NULL,当它们不是必需/指定时.我可以让NLog写一个空字符串,但不是NULL.
我试图配置NLog来执行存储过程,但它似乎不起作用.
目前我正在设置一个包含用户名,密码等的数据库目标,以及以下命令文本:
target.CommandText = "insert into Log(time_stamp,log_level,logger,message,exception_type,target_site,stack_trace,data,inner_exception) values(@time_stamp,@level,@logger,@message,@type,@target,@trace,@data,@inner);";
然后向目标添加参数,例如
var param = new DatabaseParameterInfo(); param.Name = "@time_stamp"; param.Layout = "${date}"; target.Parameters.Add(param);
所以这只会添加一个空字符串:
var param = new DatabaseParameterInfo(); param.Name = "@type"; param.Layout = ""; target.Parameters.Add(param);
但这不起作用,因为需要布局:
var param = new DatabaseParameterInfo(); param.Name = "@time_stamp"; param.Layout = null; target.Parameters.Add(param);
我已经尝试执行存储过程,更改命令文本如下(并在之后添加上面的参数,包括空字符串而不是空值):
target.CommandText = "exec usp_InsertLog @time_stamp,@inner";
根据sql Server Profiler(为清晰起见,换行符)生成此内容:
exec sp_executesql N' exec usp_InsertLog @time_stamp,@inner',N'@time_stamp nvarchar(19),@level nvarchar(5),@logger nvarchar(62),@message nvarchar(8),@type nvarchar(4000),@target nvarchar(4000),@trace nvarchar(4000),@data nvarchar(4000),@inner nvarchar(4000)',@time_stamp=N'01/03/2014 17:00:38',@level=N'Debug',@logger=N'Testbed,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null',@message=N'an error',@type=N'',@target=N'',@trace=N'',@data=N'',@inner=N''
如果我可以让存储过程工作,那么我可以让它插入NULL而不是空字符串,如果那是NLog传入的.
这是当前的存储过程,无论值是否为空,它都不起作用:
ALTER PROCEDURE [dbo].[usp_InsertLog] @time_stamp datetime,@level nvarchar(100),@logger nvarchar(100),@message nvarchar(MAX),@type nvarchar(150) = NULL,@target nvarchar(100) = NULL,@trace nvarchar(MAX) = NULL,@data nvarchar(MAX) = NULL,@inner nvarchar(MAX) = NULL AS SET NOCOUNT ON BEGIN TRY insert into Log( time_stamp,[message],inner_exception) values( @time_stamp,@inner) END TRY
有没有我错过的东西,或者更好的方法呢?
非常感谢!
解决方法
这是我在
NLog – Write NULL to optional database column上发布的一个解决方案,我希望它有用,因为我认为存储过程解决方案就像用大锤破解螺母一样.
您可以尝试使用比较2个表达式的NULLIF函数编写NULL,如果它们相等则返回NULL,否则返回第一个表达式(msdn NULLIF page).
这样,NLog配置文件中的commandText看起来像:
INSERT INTO [dbo].[log] ([message],[optional]) VALUES (@message,NULLIF(@optional,''))