从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);

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...