Расположение streamreader закрывают поток?

Вот полное решение с обработкой исключений / ошибок для автоматического приращения, это решение обратно совместимо и будет работать на 11g & amp; 12c, в частности, если заявка находится в производстве.

Пожалуйста, замените 'TABLE_NAME' на соответствующее имя таблицы

--checking if table already exisits
BEGIN
    EXECUTE IMMEDIATE 'DROP TABLE TABLE_NAME';
    EXCEPTION WHEN OTHERS THEN NULL;
END;
/

--creating table
CREATE TABLE TABLE_NAME (
       ID NUMBER(10) PRIMARY KEY NOT NULL,
       .
       .
       .
);

--checking if sequence already exists
BEGIN
    EXECUTE IMMEDIATE 'DROP SEQUENCE TABLE_NAME_SEQ';
    EXCEPTION WHEN OTHERS THEN NULL;
END;

--creating sequence
/
CREATE SEQUENCE TABLE_NAME_SEQ START WITH 1 INCREMENT BY 1 MINVALUE 1 NOMAXVALUE NOCYCLE CACHE 2;

--granting rights as per required user group
/
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE_NAME TO USER_GROUP;

-- creating trigger
/
CREATE OR REPLACE TRIGGER TABLE_NAME_TS BEFORE INSERT OR UPDATE ON TABLE_NAME FOR EACH ROW
BEGIN    
    -- auto increment column
    SELECT TABLE_NAME_SEQ.NextVal INTO :New.ID FROM dual;

    -- You can also put some other required default data as per need of your columns, for example
    SELECT SYS_CONTEXT('USERENV', 'SESSIONID') INTO :New.SessionID FROM dual;
    SELECT SYS_CONTEXT('USERENV','SERVER_HOST') INTO :New.HostName FROM dual;
    SELECT SYS_CONTEXT('USERENV','OS_USER') INTO :New.LoginID FROM dual;    
    .
    .
    .
END;
/
.
159
задан Chris Cudmore 30 June 2009 в 18:34
поделиться

4 ответа

Да, StreamReader , StreamWriter , BinaryReader и BinaryWriter все закрывают / удаляют свои базовые потоки когда вы вызываете для них Dispose . Они не удаляют поток, если считывающее / записывающее устройство является просто сборщиком мусора - вы всегда должны избавляться от считывающего / записывающего устройства, предпочтительно с помощью оператора using . (На самом деле ни у одного из этих классов нет финализаторов, да и не должно быть.)

Лично я предпочитаю также иметь оператор using для потока. Вы можете легко вложить с помощью операторов без фигурных скобок:

198
ответ дан 23 November 2019 в 21:36
поделиться

поток, удаляемый либо с помощью ключевого слова using, либо явным вызовом dispose

-3
ответ дан 23 November 2019 в 21:36
поделиться

Yes, it does. You can verify this by looking at the implementation with Reflector.

protected override void Dispose(bool disposing)
{
    try
    {
        if ((this.Closable && disposing) && (this.stream != null))
        {
            this.stream.Close();
        }
    }
    finally
    {
        if (this.Closable && (this.stream != null))
        {    
            this.stream = null;    
            this.encoding = null;
            this.decoder = null;
            this.byteBuffer = null;
            this.charBuffer = null;
            this.charPos = 0;
            this.charLen = 0;
            base.Dispose(disposing);
        }
    }
}
29
ответ дан 23 November 2019 в 21:36
поделиться

Yes. Calling Dispose() on and IDisposable (which "using" does) should make an object clean up all of its resources. This includes streams flushing and closing their file descriptors.

If, in your case, you want to pass it in to other methods, then you need to make sure that those methods do not do their reading/writing in a using block.

2
ответ дан 23 November 2019 в 21:36
поделиться
Другие вопросы по тегам:

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