【发布时间】:2014-02-10 17:54:20
【问题描述】:
我们有一个古老的 foxpro 应用程序,其中包含一个必须转换为 C# 的函数。
基本上,它所做的只是从 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 命令)将列视为字符串。好吧,这就是我执行 a
时读者的想法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 Server 抱怨它无法转换)。我知道问题在于文本(一串字符)不是字节流,但如果 FoxPro 能做到,C# 也应该能做到,不是吗?
编辑:内容大约 3MB 大。
【问题讨论】:
-
您是否有一个令人信服的理由不能只使用
var s=(byte[])cmd.ExecuteScalar();?你试过了吗? -
是的,我有。对不起,我没有提到它。这会导致运行时错误,因为查询返回的字符串无法转换为字节数组。
-
> 二进制 XLS 文件信息存储在 TEXT 列中 不寒而栗 ...
-
是的。我简直不敢相信。但是,那是遗留代码,那我该怎么办?除了关闭旧垃圾后立即对其进行改进。
标签: c# sql-server tsql visual-foxpro