sql 中存储的 exe 文件在从 SQL 服务器加载后无法执行
Stored exe File in sql is not executable after Loaded From SQL Server
我们正在尝试在 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, 0, 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);
我们正在尝试在 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, 0, 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);