如何解决从SQL Server加载后,无法在sql中存储exe文件
我们正在尝试在SQL中存储可执行文件(exe)。无论写还是读,我们都不会出错。重新下载后,只是我们存储的文件不起作用。
这是我们存储文件的方式:
databaseFilePut(@"FilePath",con,dt.Rows[0].ItemArray[0].ToString(),"ASIL");
这是函数的内部:
public static void databaseFilePut(string varFilePath,SqlConnection con,string version,string OFSET )
{
byte[] file;
using (var stream = new FileStream(varFilePath,FileMode.Open,FileAccess.Read))
{
using (var reader = new BinaryReader(stream))
{
file = reader.ReadBytes((int)stream.Length);
}
}
using (var sqlWrite = new SqlCommand("UPDATE ERP_TOOL_UPDATE SET Version=@Version1,ExeDosyasi= @ExeDosyasi1,OFSET= @OFSET1",con))
{
sqlWrite.Parameters.AddWithValue("@Version1",(double.Parse(version) + 1).ToString());
sqlWrite.Parameters.Add("@ExeDosyasi1",SqlDbType.VarBinary,file.Length).Value = file;
sqlWrite.Parameters.AddWithValue("@OFSET1","ASIL");
sqlWrite.ExecuteNonQuery();
}
}
保存到数据库后,数据如下:
0x4D5A90000300000004000000FFFF0000B8000 ....继续
阅读后,我们尝试使用以下代码重新创建存储的exe:
SqlCommand com = new SqlCommand("Select ExeDosyasi From ERP_TOOL_UPDATE WHERE OFSET = 'ASIL' ",con);
com.CommandType = CommandType.Text;
SqlDataReader reader = com.ExecuteReader();
reader.Read();
byte[] blob;
byte[] blob2;
blob = (byte[])reader[0];
blob2 = System.Text.Encoding.Default.GetBytes(System.Text.Encoding.Unicode.GetString(blob));
using (var fs = new FileStream(@"C:\Users\Bilal\Desktop\ERPAnalizTool.exe",FileMode.Create,FileAccess.Write))
{
fs.Write(blob2,blob2.Length);
fs.Flush();
}
我们没有收到任何错误,它保存了文件。唯一的问题是文件的大小略小。当我们尝试运行时,它不会运行。就像以前从未有过exe。
任何帮助将不胜感激。谢谢大家。
解决方法
您的问题是以下几行:
blob2 = System.Text.Encoding.Default.GetBytes(System.Text.Encoding.Unicode.GetString(blob));
blob
变量包含您写入数据库的字节,这是在databaseFilePut
方法中读取的文件的内容。完全没有理由将其转换为Unicode字符串,然后再转换为系统默认编码(在我的系统上为Windows-1252)。数据不是字符串,而是二进制。两次转换将仅产生错误的字节序列。
只需将blob
变量写入磁盘:
blob = (byte[])reader[0];
File.WriteAllBytes(@"C:\Users\Bilal\Desktop\ERPAnalizTool.exe",blob);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。