C#: Цикличное выполнение через строки многострочной строки

Триггеры не могут изменить измененные данные (Inserted, или Deleted) иначе Вы могли получить бесконечную рекурсию, поскольку изменения вызвали триггер снова. Одна опция была бы для триггера для отката транзакции.

Редактирование: причина этого состоит в том, что стандарт для SQL - то, что вставленные и удаленные строки не могут быть изменены триггером. Базовая причина состоит в том, что модификации могли вызвать бесконечную рекурсию. В общем случае эта оценка могла вовлечь несколько триггеров во взаимно рекурсивный каскад. Наличие системы разумно решает, позволить ли такие обновления, в вычислительном отношении тяжело, по существу изменение на проблема остановки.

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

create table Foo (
       FooID int
      ,SomeField varchar (10)
)
go

create trigger FooInsert
    on Foo after insert as
    begin
        delete inserted
         where isnumeric (SomeField) = 1
    end
go


Msg 286, Level 16, State 1, Procedure FooInsert, Line 5
The logical tables INSERTED and DELETED cannot be updated.

Что-то вроде этого будет откатывать транзакцию.

create table Foo (
       FooID int
      ,SomeField varchar (10)
)
go

create trigger FooInsert
    on Foo for insert as
    if exists (
       select 1
         from inserted 
        where isnumeric (SomeField) = 1) begin
              rollback transaction
    end
go

insert Foo values (1, '1')

Msg 3609, Level 16, State 1, Line 1
The transaction ended in the trigger. The batch has been aborted.

87
задан Austin Salonen 30 September 2009 в 19:35
поделиться

3 ответа

Я предлагаю использовать комбинацию StringReader и моего класса LineReader , который является частью ] MiscUtil , но также доступен в в этом ответе StackOverflow - вы можете легко скопировать только этот класс в свой собственный служебный проект. Вы бы использовали его так:

string text = @"First line
second line
third line";

foreach (string line in new LineReader(() => new StringReader(text)))
{
    Console.WriteLine(line);
}

Цикл по всем строкам в теле строковых данных (будь то файл или что-то еще) настолько распространен, что не требуется, чтобы вызывающий код проверял наличие null и т. Д. :) Сказав это, если вы действительно хотите выполнить цикл вручную, это форма, которую я обычно предпочитаю, чем форму Фредрика:

using (StringReader reader = new StringReader(input))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        // Do something with the line
    }
}

Таким образом, вам нужно только один раз проверить на аннулирование, и вы этого не сделаете.

144
ответ дан 24 November 2019 в 07:43
поделиться

Вы можете использовать StringReader для чтения строки за раз:

using (StringReader reader = new StringReader(input))
{
    string line = string.Empty;
    do
    {
        line = reader.ReadLine();
        if (line != null)
        {
            // do something with the line
        }

    } while (line != null);
}
70
ответ дан 24 November 2019 в 07:43
поделиться

из MSDN для StringReader

    string textReaderText = "TextReader is the abstract base " +
        "class of StreamReader and StringReader, which read " +
        "characters from streams and strings, respectively.\n\n" +

        "Create an instance of TextReader to open a text file " +
        "for reading a specified range of characters, or to " +
        "create a reader based on an existing stream.\n\n" +

        "You can also use an instance of TextReader to read " +
        "text from a custom backing store using the same " +
        "APIs you would use for a string or a stream.\n\n";

    Console.WriteLine("Original text:\n\n{0}", textReaderText);

    // From textReaderText, create a continuous paragraph 
    // with two spaces between each sentence.
    string aLine, aParagraph = null;
    StringReader strReader = new StringReader(textReaderText);
    while(true)
    {
        aLine = strReader.ReadLine();
        if(aLine != null)
        {
            aParagraph = aParagraph + aLine + " ";
        }
        else
        {
            aParagraph = aParagraph + "\n";
            break;
        }
    }
    Console.WriteLine("Modified text:\n\n{0}", aParagraph);
7
ответ дан 24 November 2019 в 07:43
поделиться
Другие вопросы по тегам:

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