Вставить BLOB в MS База данных SQL с использованием сценария Perl

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

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

Наш Perl-парень, похоже, столкнулся с проблемой: это самый большой BLOB, который он мог вставить в сервер MS-SQL (что нас раздражает. Использование NETers) было 64 КБ, но нам нужны сценарии Perl для вставки больших двоичных объектов размером от 2 до 6 МБ.

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

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

Заранее спасибо,

JD

1
задан Zaid 26 August 2010 в 12:13
поделиться

2 ответа

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

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

Из часто задаваемых вопросов DBI:

Что делать BLOB-данные с помощью DBI?

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

Например:

### $dbh — это дескриптор подключенной базы данных.
$sth = $dbh->prepare("ВЫБЕРИТЕ blob_column FROM blobby_table");
$sth->выполнить; потерпит неудачу.

### $dbh — дескриптор подключенной базы данных
### Установите максимальный размер BLOB...
$dbh->{LongReadLen} = 16384; ### 16Кб... Немного BLOB!
$sth = $dbh->prepare( "..." );

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

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

Это поведение регулируется Атрибут LongTruncOk, который по умолчанию установлено значение false (таким образом что приводит к сбою слишком длинных выборок BLOB).

### Настройте обработку BLOB таким образом, чтобы он имел размер 16 КБ и мог быть усечен.
$dbh->{LongReadLen} = 16384;
$dbh->{LongTruncOk} = 1;

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

2
ответ дан 2 September 2019 в 21:50
поделиться

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

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

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

$statement->execute();

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

0
ответ дан 2 September 2019 в 21:50
поделиться
Другие вопросы по тегам:

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