NLog数据库目标未找到表

时间:2010-06-25 14:08:03

标签: c# asp.net-mvc-2 nlog

我正在使用NLog 1.0并拥有以下配置文件:

<?xml version="1.0"?>
<nlog autoReload="true" throwExceptions="true">

<targets>
    <!--<target name="console" xsi:type="ColoredConsole"
        layout="${date:format=HH\:mm\:ss}|${level}|${stacktrace}|${message}" />

    <target name="file" xsi:type="File" fileName="${basedir}/Logs/Site.log"
        layout="${date}: ${message}" />

    <target name="eventlog" xsi:type="EventLog" source="My App" log="Application"
        layout="${date}: ${message} ${stacktrace}" />-->

    <target name="database" type="Database" connectionStringName="xxxxxxx">

        <dbprovider>mssql</dbprovider>

        <commandText>
            INSERT INTO Logs (Message, Level, CreatedOn) VALUES (@message, @level, @createdOn);
        </commandText>

        <parameter name="@message" layout="${message}" />
        <parameter name="@level" layout="${level}" />
        <parameter name="@createdOn" layout="${date}" />
    </target>
</targets>

<rules>
    <logger name="*" minlevel="Debug" appendTo="database" />

    <!--<logger name="*" minlevel="Info" writeTo="file" />
    <logger name="*" minlevel="Fatal" writeTo="eventlog" />-->
</rules>

这几乎是来自nlog提供的codeplex示例的复制粘贴。在我的global.ascx中,我记录了“Application Started!”只是为了测试日志记录正在运行,但这是问题开始的地方(通过文件目标的工作方式很好,它只是数据库目标):

System.Data.SqlClient.SqlException: Invalid object name 'Logs'.
似乎很直接给我,一定是个错字。我检查SQL事件探查器并获得以下内容:

exec sp_executesql N'
            INSERT INTO Logs (Message, Level, CreatedOn) VALUES (@message, @level, @createdOn);
        ',N'@message nvarchar(20),@level nvarchar(4),@createdOn nvarchar(19)',@message=N'Application Started!',@level=N'Info',@createdOn=N'06/25/2010 23:59:30'

我的表创建代码如下:

CREATE TABLE Logs (
Id INT IDENTITY(1, 1) NOT NULL,
[Level] VARCHAR(5) NOT NULL,
[Message] VARCHAR(4095) NOT NULL,
CreatedOn DATETIME NOT NULL,

CONSTRAINT PK_Logs PRIMARY KEY (Id)
)

任何想法,当然我错过了一些简单的东西?


我设法让这个工作,并感觉我的连接字符串是问题。当commandtext更改为:

USE xxxx INSERT INTO dbo.Logs (Message, Level, CreatedOn) VALUES (@message, @level, @createdOn);

一切正常,我会尝试一些连接字符串,如果你知道任何与NLog的合作,请告诉我!

2 个答案:

答案 0 :(得分:0)

检查数据库表的名称空间。您可以使用“dbo”(对于数据库所有者)为表名添加前缀,如下所示:

CREATE TABLE dbo.Logs (
[Id] INT IDENTITY(1, 1) NOT NULL,
[Level] VARCHAR(5) NOT NULL,
[Message] VARCHAR(4095) NOT NULL,
[CreatedOn] DATETIME NOT NULL,

CONSTRAINT PK_Logs PRIMARY KEY (Id)
)

创建表时,您的表可能具有someName.logs的命名空间。然后,您可以在XML文件中指定全名,如下所示:

INSERT INTO dbo.Logs (Message, Level, CreatedOn) VALUES (@message, @level, @createdOn);

答案 1 :(得分:0)

要解决此问题,我将“dbDatabase”参数添加到目标中,如下所示:

<target name="database" type="Database" connectionStringName="MediaLibrary" dbDatabase="MediaLibrary">
        <commandText>
            INSERT INTO dbo.Logs (Message, Level, CreatedOn) VALUES (@message, @level, @createdOn);
        </commandText>
        <parameter name="@message" layout="${message}" />
        <parameter name="@level" layout="${level}" />
        <parameter name="@createdOn" layout="${date}" />
    </target>