powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / запись потока в blob (Oracle)
5 сообщений из 5, страница 1 из 1
запись потока в blob (Oracle)
    #37925602
FsShoman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть задача сохранить файл в blob-поле (База Oracle).
делаю примерно так.

взято с форума:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
OracleConnection cnn = new OracleConnection("...");
cnnOIC.Open();
cmd = new OracleCommand("update table set image=:image where kod='01'", cnn);
FileStream img = new FileStream(@"C:\...\image.bmp", FileMode.Open);
int nByte = (int)img.Length;
byte[] ByteArray = new byte[nByte];
img.Read(ByteArray, 0, nByte);
cmd.Parameters.Add("image", OracleType.Blob).Value = ByteArray;
cmd.ExecuteNonQuery();
cnn.Close();
img.Close();



собственно все хорошо. но когда размер файла становиться больше (300-500мб) (не будем затрагивать в рамках данного топика вопрос целесообразности такого хранения), то все тоже работает но возникает проблема, все 500мб считываются в память, что есть нехорошо.

для mssql - видел примеры где blob загружается прямо из потока., например из файла, без промежуточного хранения в памяти, как сделать аналогичное для Oracle.
...
Рейтинг: 0 / 0
запись потока в blob (Oracle)
    #37926010
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
примерно так (под рукой кода нет, пишу по памяти)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
OracleConnection conn = new OracleConnection("...");
conn.Open();

OracleTransaction tx = conn.BeginTransaction();

OracleCommand cmd = conn.CreateCommand();
cmd.Transaction = tx;
cmd.CommandText = "update table set image=EMPTY_BLOB() where kod='01' RETURNING image INTO :tempblob";
cmd.Parameters.Add(new OracleParameter("tempblob", OracleType.Blob)).Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
OracleLob tempLob = (OracleLob)cmd.Parameters[0].Value;
tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);

/* здесь все действия по записи данных */
tempLob.Write(tempbuff,0,tempbuff.Length);

tempLob.EndBatch();
tx.Commit();



действия по выполнению запроса и последующей записи в блоб должны быть в рамках одной транзакции.
...
Рейтинг: 0 / 0
запись потока в blob (Oracle)
    #37927134
FsShoman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
OracleLob tempLob = (OracleLob)cmd.Parameters[0].Value;
тут ругается
так как cmd.Parameters[0].Value - тип byte[]
...
Рейтинг: 0 / 0
запись потока в blob (Oracle)
    #37929947
FsShoman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так ничего и не получатся.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
запись потока в blob (Oracle)
    #38611068
Фотография Macks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FsShomanOracleLob tempLob = (OracleLob)cmd.Parameters[0].Value;
тут ругается
так как cmd.Parameters[0].Value - тип byte[]

OracleLob tempLob = (OracleLob)cmd.Parameters[0].OracleValue;
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / запись потока в blob (Oracle)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]