SeriLog 使用经典 .net 框架从 sql server 读取属性值

Posted

技术标签:

【中文标题】SeriLog 使用经典 .net 框架从 sql server 读取属性值【英文标题】:SeriLog read property value from sql server with classic .net framework 【发布时间】:2021-12-06 10:29:12 【问题描述】:

我正在使用 serilog 和 ms 服务器来记录数据。在Properties 列中,我有这个:

<root><prop key="Meassage">Person is createrd</prop><prop key="FirstName">John</prop><prop key="LastName">Rami</prop><prop key="BirthDate">10/19/1996 1:10:27 PM</prop></root>

这以nvarchar(max) 数据类型存储在数据库中。

我想获取每个属性的值并尝试使用它

using (SqlConnection con = new SqlConnection(connectionString))

    con.Open();

    SqlCommand comm = new SqlCommand("SELECT Properties.value(\"/properties/property[@key='FirstName'])[1]\", 'nvarchar(max)') AS FName from EventLog", con);

    SqlDataReader srd = comm.ExecuteReader();

    while (srd.Read())
    
        string s = srd["FName"].ToString();
    

    con.Close();

但我得到一个错误:

System.Data.SqlClient.SqlException: '关键字'from'附近的语法不正确

有什么解决办法吗?

【问题讨论】:

not working 是什么意思? SqlDataReader 异常 System.Data.SqlClient.SqlException: '关键字'from'附近的语法不正确。' From 关键字前有一个逗号。删除它,然后重试。最好的方法是获取准确的查询并在您的数据库上进行尝试,以便于调试 【参考方案1】:

这是正确的解决方案

SELECT 
    CAST(Properties as XML).value(
        '(/properties/property)[1]'
        , 'nvarchar(max)'
    ) 
AS FName 
FROM EventLog
WHERE 
    CAST(Properties as XML).value(
        '(/properties/property/@key)[1]=''FirstName'''
        , 'bit'
    ) = 1

【讨论】:

以上是关于SeriLog 使用经典 .net 框架从 sql server 读取属性值的主要内容,如果未能解决你的问题,请参考以下文章

扩展.net日志框架Serilog的WriteTo

Serilog简介

如何在 .Net Framework 中使用 Serilog 为每个 API 创建日志文件?

Serilog 记录日志

译Serilog 配置基础知识

无法从Windows服务中托管的Asp.net核心网站启动多个Serilog接收器