Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何读取文本列并将其视为字节数组_C#_Sql Server_Tsql_Visual Foxpro - Fatal编程技术网

C# 如何读取文本列并将其视为字节数组

C# 如何读取文本列并将其视为字节数组,c#,sql-server,tsql,visual-foxpro,C#,Sql Server,Tsql,Visual Foxpro,我们有一个古老的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 !ISN

我们有一个古老的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命令)将列视为字符串。好吧,这就是读者在我执行

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();
我还尝试将
文本
列转换为
图像
,但这也不起作用(SQL Server抱怨它无法转换)。我知道问题在于文本(字符串)不是字节流,但如果FoxPro可以做到这一点,C#也应该能够做到,不是吗


编辑:内容约3MB大

将SQL查询更改为将列强制转换为varbinary,如下所示:

select cast(cast(XExcell as varchar(max)) as varbinary(max)) from MyTable
然后:


编辑:双重强制转换TEXT->varchar(max)->varbinary(max),因为不允许从TEXT->varbinary(max)直接强制转换

是否有令人信服的理由不能只使用
var s=(byte[])cmd ExecuteScalar()?你已经试过了吗?是的,我试过了。对不起,我没提。这会导致运行时错误,因为查询返回的字符串无法转换为字节数组。>二进制XLS文件信息存储在文本列中……是。我简直不敢相信。但是,这是遗留代码,我能做什么?除了在旧的垃圾被关掉后尽快改进。演员阵容看起来很有希望。我明天再查。谢谢你的提示,还有剪下来的图片展示了一种将文件移动到文件中的好方法。对不起,我必须投反对票。
TEXT
不可转换为
varbinary(max)
尝试双重转换:
cast(转换为varchar(max))为varbinary(max))
抱歉,我必须向上投票,并将你的答案标记为99%正确:-)请编辑你的解决方案,先转换为
varchar(max)
然后转换为
varbinary(max)
cast(转换为
(xExcell作为varchar(max))作为varbinary(max))
没有看到您的帖子,抱歉。我自己解决了。
var bytes = (byte[])cmd.ExecuteScalar();

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