2014-02-10 29 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

相关问题