gpt4 book ai didi

c# - 如何使用 NLog 配置 API 将 NULL 写入数据库中的列?

转载 作者:太空狗 更新时间:2023-10-29 20:24:08 25 4
gpt4 key购买 nike

我看过这个问题,但由于它使用了 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, @level, @logger, @message, @type, @target, @trace, @data, @inner";

根据 SQL Server Profiler(为清楚起见,换行符)生成此内容:

exec sp_executesql N'
exec usp_InsertLog @time_stamp, @level, @logger, @message, @type, @target, @trace, @data, @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,
log_level,
logger,
[message],
exception_type,
target_site,
stack_trace,
data,
inner_exception)
values(
@time_stamp,
@level,
@logger,
@message,
@type,
@target,
@trace,
@data,
@inner)
END TRY

有没有我遗漏的东西,或者更好的方法?

非常感谢!

最佳答案

这是我也在 NLog - Write NULL to optional database column 上发布的解决方案,我希望它有用,因为我认为存储过程解决方案就像用大锤敲螺母一样。

您可以尝试使用 NULLIF 函数来编写 NULL,该函数比较 2 个表达式并在它们相等时返回 NULL,否则返回第一个表达式 (msdn NULLIF page)。

这样,您的 NLog 配置文件中的 commandText 将如下所示:

INSERT INTO [dbo].[log] ([message], [optional]) 
VALUES (@message, NULLIF(@optional, ''))

关于c# - 如何使用 NLog 配置 API 将 NULL 写入数据库中的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20908978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com