c# – 如何使用NLog Configuration API将NULL写入数据库中的列?

前端之家收集整理的这篇文章主要介绍了c# – 如何使用NLog Configuration API将NULL写入数据库中的列?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我看过这个问题,但是因为它使用了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,''))
原文链接:https://www.f2er.com/csharp/244667.html

猜你在找的C#相关文章