2010-08-26 3 views
1

Пожалуйста, простите мое невежество Perl, как я являюсь разработчиком .NET (я могу услышать вас все плеваться и ругаться уже; ¬))Вставка BLOB в MS SQL DB с помощью Perl скрипт

У нас есть Requirment к вставьте BLOB (+ некоторые другие данные) в базу данных MS-SQL с использованием Perl-скрипта (наши бэкэнд-системы работают в AIX с использованием Perl-скриптов, чтобы заниматься повседневной работой).

Наш пользователь Perl, казалось бы, столкнулся с проблемой: самый большой BLOB, который он мог вставить на сервер MS-SQL (что нам надоедливые .NET-разработчики), был 64k, но нам нужны скрипты Perl для вставки BLOB-файлов в 2 МБ - 6MB.

Если возможно вставить BLOB свыше 64k; может ли кто-нибудь посоветовать на проспекте расследования, что наш парень Перла мог бы продержаться, чтобы добиться этого?

Извините, что задал вопрос «через прокси», но наш гуру Perl в отпуске.

Спасибо заранее,

JD

+0

Какой модуль Perl используется для вставки капли? – Zaid

+0

Я думаю, что это DBX (хотя, не являясь разработчиком Perl, я мог ошибаться) – jdoig

+0

У вас есть жалость за то, что вы парень .net. :) – Ether

ответ

2

Если это DBI, вы можете установить максимальный буфер вашей ручки базы данных до нужного предела:

$dbh->{LongReadLen} = 10485760; # 10 MB 

От DBI Часто задаваемые вопросы:

Как обрабатывать данные BLOB с помощью DBI?

Обработка данных BLOB с помощью DBI очень проста. Строки BLOB указаны в инструкции SELECT как для обычных столбцов. Тем не менее, вы также должны указать максимальный размер BLOB , который обрабатывает дескриптор базы данных может извлечь с использованием атрибута LongReadLen.

Например:

### $dbh is a connected database handle 
$sth = $dbh->prepare("SELECT blob_column FROM blobby_table"); 
$sth->execute; would fail. 

### $dbh is a connected database handle 
### Set the maximum BLOB size... 
$dbh->{LongReadLen} = 16384;  ### 16Kb...Not much of a BLOB! 
$sth = $dbh->prepare("..."); 

удастся не представили столбец значения были больше, чем указанное значение .

Если данные BLOB длиннее, чем значение значения LongReadLen, тогда произойдет ошибка . Однако DBI предоставляет дополнительную функциональность , которая автоматически усекает извлеченный BLOB до размера LongReadLen, если он длиннее. Это означает, что не вызывает ошибку, но может сделать ваши данные BLOB бесполезными.

Такое поведение регулируется LongTruncOk атрибута, который defaultly устанавливается на ложное значение (таким образом, что делает сверхдолгим BLOB Fetches неудачу).

### Set BLOB handling such that it's 16Kb and can be truncated 
$dbh->{LongReadLen} = 16384; 
$dbh->{LongTruncOk} = 1; 

усечение данных BLOB не может быть большим дела в тех случаях, когда BLOB содержит по длине прогона кодированных данных, но данные, содержащий контрольные суммы в конце концов, например, ZIP-файл, будет бесполезно.

+0

Thank's Zaid. Влияет ли тот же процесс (настройка LongReadLen) на размер вставки BLOB для вставки? – jdoig

+0

@jdoig: Хорошая точка. 'LongReadLen' не будет влиять на вставки. Только выборы. Чтобы процитировать документацию: «... часто существуют ограничения на максимальный размер оператора INSERT, и метод котировки вообще не может справиться с двоичными данными». Я бы сказал, что лучше всего вручную изменить настройки базы данных, если возможное. – Zaid

+0

Спасибо Zaid, DB может обрабатывать BLOB, когда мы читаем и записываем их в наш код .NET. Проблема может быть связана с методом подключения (я понятия не имею о DBI api) или просто некоторая ошибка в скрипте. – jdoig

0

Для установки BLOB обычно необходимо использовать заполнители. Подготовьте свой оператор с помощью заполнителя, затем привяжите значение, которое хотите вставить, следующим образом:

$ statement-> bind_param (??, $ myvalue, DBI :: SQL_BLOB);

Где? является позицией заполнителя, начиная с 1. Затем вы выполняете инструкцию, как обычно, например:

$ statement-> execute();

Как всегда, обработка ошибок - хороший план. Мы используем это регулярно с SQLite, но я уверен, что это также верно для MSSQL и MySQL.

Смежные вопросы