繼之前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[]判斷
且必須注意,透過DatatypeConverter.printHexBinary才可以有效的將該byte[]轉做字串數值
,否則輸出檔案會看到byte[]的reference address
輸出檔案後,該16進位的數值會變成
'0010AC7203CDD745E82FA639510389BD010000000250ED3C36BDF18EAA80AEBA9F03238DFF639CB3A1D5996CBA28C1CBD9624E6D'
但當你拿該insert into values ('OOXX')指令去執行後,該筆資料並不會變成0x0010...
由於此時為字串,因此您轉出的指令必須包含CONVERT函式
輸出檔案後
CONVERT(varbinary(8000), '0010AC7203CDD745E82FA639510389BD010000000250ED3C36BDF18EAA80AEBA9F03238DFF639CB3A1D5996CBA28C1CBD9624E6D' , 2),
當您在SQL Server上執行時,又將回復到16進制的數值資料
0x0010AC7203CDD745E82FA639510389BD010000000250ED3C36BDF18EAA80AEBA9F03238DFF639CB3A1D5996CBA28C1CBD9624E6D
PS. CONVERT(dataType, expression, style). 當expression為binary的型態時,搭配您的資料若沒
有0x,須使用style = 2,否則style = 1會轉換成二進制的數值!!
備份指令,而當時提到的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會轉換成二進制的數值!!
留言
張貼留言