Вставьте BLOB в MS SQL DB, используя скрипт Perl - PullRequest
1 голос
/ 26 августа 2010

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

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

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

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

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

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

JD

Ответы [ 2 ]

2 голосов
/ 26 августа 2010

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

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

Из DBI FAQ:

Как обрабатывать 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, для которого по умолчанию установлено ложное значение (что приводит к сбою слишком длинных выборок BLOB).1027 *

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

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

0 голосов
/ 27 августа 2010

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

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

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

$ Statement-> execute ();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...