SQL Server: помочь с простой хранимой процедурой?

В основном проблема заключается в том, что связующее устройство по умолчанию не может правильно привязать элементы коллекции в цикле foreach. Другими словами, он неправильно называет элемент, и поэтому коллекция отображается как нуль в параметрах.

Я уверен, что есть разные способы обхода, помощники и прочее, но я не знаком с этими , поэтому я просто использую for loop вместо foreach, таким образом, элементы называются правильно.

Попробуйте это:

    @for (int i = 0; i < Model.Contributor.Count(); i++)
    {

        @Html.HiddenFor(model => Model.Contributor[i].Id)

        <div class="formrow">
            @Html.ValidationSummary(true)
        </div>

        <h2>@Html.TextRaw("AuthorInfo", "Author")</h2>
        <div class="formrow">

            @Html.EditorFor(model => Model.Contributor[i].FirstName)
            <div class="formvalidation">
                @Html.ValidationMessageFor(model => Model.Contributor[i].FirstName)
            </div>
        </div>


        <div class="formrow right">
            <input type="hidden" name="formsubmitted" value="true" />
            <input type="submit"  class="button" value="@Html.Text("ButtonText", "Save")" />
        </div>
    }

Я предлагаю вам использовать инструмент отладки, чтобы узнать, элементы имеют правильный атрибут имени, в вашем случае они должны выглядеть как Contributor [0] .Id, Contributor [0] .FirstName и т. д.

1
задан atricapilla 13 August 2010 в 09:55
поделиться

1 ответ

Это потому, что ваша программа toLog ожидает, что вы предоставите параметр @messageTime, чего вы не сделали, и он не имеет значения по умолчанию, как другие параметры.

Так как вы устанавливаете @messageTime всегда в GETDATE() внутри макроса, похоже, что вы просто хотите отбросить этот параметр:

CREATE PROCEDURE dbo.toLog
    @etlJobName NVARCHAR(60) = 'unknown',
    @whereTo NVARCHAR(20) = 'print',
    @messag NVARCHAR(255) = 'empty'
AS
BEGIN
IF @whereTo = 'log' OR @whereTo = 'logandprint'
    INSERT INTO logTable(messageTime, etlJobName, whereTo, messag)
    VALUES (GETDATE(), @etlJobName, @whereTo, @messag)
IF @whereTo = 'print' OR @whereTo = 'logandprint'
    PRINT CONVERT(VARCHAR, GETDATE(), 113) + ', ' + @etlJobName + ', ' + @whereTo + ', ' + ', ' + @messag
END

Или, если вы хотите иметь возможность передавать дату самостоятельно:

CREATE PROCEDURE dbo.toLog
        @messageTime DATETIME = null,
        @etlJobName NVARCHAR(60) = 'unknown',
        @whereTo NVARCHAR(20) = 'print',
        @messag NVARCHAR(255) = 'empty'
    AS
    BEGIN
    IF (@messagetime IS NULL) SET @messagetime = GETDATE()

    IF @whereTo = 'log' OR @whereTo = 'logandprint'
        INSERT INTO logTable(messageTime, etlJobName, whereTo, messag)
        VALUES (@messageTime, @etlJobName, @whereTo, @messag)
    IF @whereTo = 'print' OR @whereTo = 'logandprint'
        PRINT CONVERT(VARCHAR, @MessageTime, 113) + ', ' + @etlJobName + ', ' + @whereTo + ', ' + ', ' + @messag
    END
1
ответ дан 2 September 2019 в 22:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: