2014-02-10 30 views
1

我們有一個古老的foxpro應用程序,其功能必須轉換爲C#。如何讀取TEXT列並將其視爲字節數組

基本上,它所做的只是從SQL Server數據庫表中讀取XLS文件並將其保存在本地光盤上。該文件充當Excel工作表模板。

二進制XLS文件信息被存儲在一個TEXT柱(這使我緊張),並通過FoxPro中提取與該單線:

lnResult = SQLEXEC(THISFORM.Hconn, "select XExcell from MyTable", "xy") 
SELECT xy 
IF !EMPTY(xy.xExcell) AND !ISNULL(xy.xExcell) 
    COPY memo xy.xExcell to (SomeFile) 

的問題是,C#(或至少ADO命令)將該列視爲字符串。那麼這就是讀者在執行時遇到的問題

MyADOCommand.ExecuteScalar(); 

編輯:這是一個隱式字符串,不能被轉換爲字節數組。

所以,這裏是我的問題:數據是在SQL Server中的一些二進制形式,必須被拉和視爲一個原始字節數組(並最終寫入光盤,給它一個.XLS的延伸並祈禱Excel能夠讀取文件)。

任何想法如何實現這一目標?下面的代碼顯然是行不通的

var s=(string)cmd.ExecuteScalar(); 
var enc = new System.Text.ASCIIEncoding(); 
var template= enc.GetBytes(s); 
var fs = new FileStream(excelTemplateFile, FileMode.OpenOrCreate, FileAccess.Write); 
var bw = new BinaryWriter(fs); 
bw.Write(template); 
bw.Flush(); 
bw.Close(); 
fs.Close(); 

我也試着投了TEXT列作爲IMAGE,但是,這並不工作,要麼(SQL服務器抱怨說,它不能轉換)。我知道問題在於文本(字符串)不是字節流,但如果FoxPro可以這樣做,C#應該也可以,不是嗎?

編輯:內容大約3MB大。

+0

是否有一個令人信服的理由,您不能只使用var s =(byte [])cmd.ExecuteScalar();'?你已經嘗試過了嗎? –

+0

是的,我有。對不起,我沒有提到它。這會導致運行時錯誤,因爲查詢返回的字符串無法轉換爲字節數組。 – alzaimar

+0

>二進制XLS文件信息存儲在文本列中 Shudder ... –

回答

3

更改SQL查詢來投的列VARBINARY如下:

select cast(cast(XExcell as varchar(max)) as varbinary(max)) from MyTable 

然後:

var bytes = (byte[])cmd.ExecuteScalar(); 

using (var writer = new BinaryWriter(File.Open("your file name", FileMode.Create))) 
{ 
    writer.Write(bytes); 
} 

編輯:雙鑄造TEXT - > VARCHAR(最大) - > VARBINARY( max),因爲不允許直接從TEXT - > varbinary(max)強制轉換

+0

演員看起來很有前途。我明天會檢查一下。感謝提示,以及剪輯展示了將內容移動到文件的方式。 – alzaimar

+0

對不起,我必須downvote。一個'TEXT'不能轉換成'varbinary(max)' – alzaimar

+1

嘗試重複執行:'cast(cast(XExcell as varchar(max))as varbinary(max))' – wdosanjos

相關問題