Java - Export SQL Backup Commands for Delete, Insert (II)

繼之前Java - Export SQL Backup Commands for Delete, Insert的文章有提到利用Java來產生SQL

備份指令,而當時提到的bean欄位皆為基本的型態處理,如String, Integer等。假設bean的欄位

型態有byte[],相對應SQL內table的欄位可能為varbinary,此時又要怎麼將資料給轉出來? 而轉

出來的資料在貼回SQL Server上執行時,又要注意哪些地方才可以順利處理正確?

通常table內有開varbinary的欄位可能為儲存媒體檔或SQL Server加密的資料等!

如下16進位數值
0x0010AC7203CDD745E82FA639510389BD010000000250ED3C36BDF18EAA80AEBA9F03238DFF639CB3A1D5996CBA28C1CBD9624E6D

要將他轉出來做備份指令,在第一篇文章內須多加上instanceof byte[]判斷
import javax.xml.bind.DatatypeConverter;

...
else if(m.invoke(bean) instanceof byte[]){
    //byte[] to Hex String
    values.append("'"+DatatypeConverter.printHexBinary((byte[])m.invoke(bean))+"', ");
}
...

且必須注意,透過DatatypeConverter.printHexBinary才可以有效的將該byte[]轉做字串數值

,否則輸出檔案會看到byte[]的reference address

輸出檔案後,該16進位的數值會變成

'0010AC7203CDD745E82FA639510389BD010000000250ED3C36BDF18EAA80AEBA9F03238DFF639CB3A1D5996CBA28C1CBD9624E6D'

但當你拿該insert into values ('OOXX')指令去執行後,該筆資料並不會變成0x0010...

由於此時為字串,因此您轉出的指令必須包含CONVERT函式

import javax.xml.bind.DatatypeConverter;

...
else if(m.invoke(bean) instanceof byte[]){
    //byte[] to Hex String
    values.append("CONVERT(varbinary(8000), '"+DatatypeConverter.
                        printHexBinary((byte[])m.invoke(bean))+"',2),");
}
...

輸出檔案後
CONVERT(varbinary(8000),  '0010AC7203CDD745E82FA639510389BD010000000250ED3C36BDF18EAA80AEBA9F03238DFF639CB3A1D5996CBA28C1CBD9624E6D' , 2),

當您在SQL Server上執行時,又將回復到16進制的數值資料
0x0010AC7203CDD745E82FA639510389BD010000000250ED3C36BDF18EAA80AEBA9F03238DFF639CB3A1D5996CBA28C1CBD9624E6D

PS. CONVERT(dataType, expression, style). 當expression為binary的型態時,搭配您的資料若沒

有0x,須使用style = 2,否則style = 1會轉換成二進制的數值!!

留言