Таблица назначения базы данных NLog не найдена - PullRequest
0 голосов
/ 25 июня 2010

Я использую 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>

Это почти копия вставки из примера codeplex, поставляемого с nlog.В моем global.ascx у меня есть журнал "Приложение запущено!"только для проверки работы журналов, однако, здесь начинаются проблемы (кстати, цель файла работает хорошо, это всего лишь цель БД):

System.Data.SqlClient.SqlException: Invalid object name 'Logs'.

Кажется, довольно прямолинейно для меня, должно быть, опечатка.Я проверяю SQL Profiler и получаю следующее:

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)
)

Есть идеи, конечно, я упускаю что-то простое?


Мне удалось заставить это работать, и у меня возникло ощущение, что моя строка соединения - это проблема.Когда текст команды изменяется на:

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

Все работает, я попробую некоторые строки подключения, если вы знаете какие-либо, которые работают с NLog, дайте мне знать, пожалуйста!

Ответы [ 2 ]

0 голосов
/ 26 июня 2010

Чтобы решить проблему, я добавил параметр "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>
0 голосов
/ 26 июня 2010

Проверьте пространство имен таблицы базы данных. Вы можете добавить префикс имени таблицы к «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);
...