【问题标题】:How to read a TEXT column and treat is as byte array如何读取 TEXT 列并将其视为字节数组
【发布时间】: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


【解决方案1】:

更改 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(max) -> varbinary(max),因为不允许从 TEXT 直接转换 -> varbinary(max)

【讨论】:

  • 演员阵容看起来很有希望。我明天会检查的。感谢您的提示,以及剪辑演示了一种将内容移动到文件的漂亮而紧凑的方式。
  • 对不起,我不得不投反对票。 TEXT 不能转换为 varbinary(max)
  • 尝试双重投射:cast(cast(XExcell as varchar(max)) as varbinary(max))
  • 抱歉,我必须投票并将您的答案标记为 99% 正确 :-) 请编辑您的解决方案以先转换为 varchar(max),然后再转换为 varbinary(max)cast(cast(xExcell as varchar(max)) as varbinary(max))
  • 没有看到你的帖子,抱歉。我自己想通了。
猜你喜欢
  • 2020-11-14
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 2020-04-16
  • 2017-11-16
  • 1970-01-01
相关资源
最近更新 更多