2010-08-26 89 views
1

請原諒我的Perl的無知,因爲我是一個.NET開發(我能聽到你所有隨地吐痰和咒罵了;¬))插入BLOB到MS SQL數據庫使用Perl腳本

我們有需求量的到使用Perl腳本將一個BLOB(+一些其他數據)插入到MS-SQL DB中(我們的後端系統使用Perl腳本在AIX上運行以處理日常業務)。

我們的Perl似乎遇到了一個問題:他可以插入到MS-SQL服務器(我們討厭的.NET服務器使用)中的最大BLOB是64k,但我們需要Perl腳本來插入2MB的BLOB - 6MB。

如果可以通過64k插入BLOB;任何人都可以在調查的大道上建議我們的Perl人員爲了實現這個目標而可能存在?

對不起,提問'通過代理',但我們的Perl大師的假期。

由於提前,

JD

+0

哪個Perl模塊被用來插入blob? – Zaid 2010-08-26 12:11:36

+0

我認爲這是DBX(儘管不是一個Perl開發人員,我可能是錯的) – jdoig 2010-08-26 12:22:27

+0

對於成爲一個.net人而言,可惜已經很可惜了。 :) – Ether 2010-08-26 23:37:04

回答

2

如果這是DBI,您可以在數據庫手柄的最大緩衝區設置爲你想要的限制:

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

DBI常見問題:

如何使用DBI處理BLOB數據?

用DBI處理BLOB數據是非常簡單的 。在SELECT語句中將BLOB列 指定爲每個普通列爲 。但是,您還需要指定最大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提供 一個額外的功能 ,如果LongReadLen更長,它將自動截取 取回的BLOB大小爲 。這不是 不會導致錯誤發生,但可能 使您提取的BLOB數據無用。

此行爲由 LongTruncOk屬性,是 defaultly設置爲假值(從而使 過長BLOB取失敗)調節。

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

BLOB數據的截斷可以不是在將BLOB 含有運行長度編碼數據的情況下一個 大問題,但 數據包含校驗和底, 例如,ZIP文件,將 呈現無用。

+0

謝謝你的Zaid。同樣的過程(LongReadLen的設置)是否也影響插入的BLOB的插入大小? – jdoig 2010-08-26 12:38:37

+0

@jdoig:好點。 'LongReadLen'不會影響插入。只有選擇。引用文檔:'...... INSERT語句的最大大小通常是有限的,並且引用方法通常不能處理二進制數據。「我想說你最好的選擇是手動更改數據庫設置if可能。 – Zaid 2010-08-26 13:37:18

+0

謝謝Zaid,當我們從我們的.NET代碼中讀取和寫入它時,DB可以處理BLOB。問題可能出在連接方法上(??我不知道DBI API)還是隻是腳本中的一些錯誤。 – jdoig 2010-08-26 14:57:32

0

要插入BLOB,通常需要使用佔位符。使用佔位符準備語句,然後綁定要插入的值,如下所示:

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

哪裏?是佔位符的位置,從1開始。然後像往常一樣執行語句,例如:

$ statement-> execute();

一如既往,錯誤處理是一個很好的計劃。我們經常使用SQLite,但我很肯定這對MSSQL和MySQL也是正確的。