C# 将文件转换为字节数组,保存在Access DB中,从DB读取并创建文件
你好,C# 将文件转换为字节数组,保存在Access DB中,从DB读取并创建文件,c#,sql,ms-access,C#,Sql,Ms Access,你好, 我正在努力 将文件转换为字节[] 在Access数据库中写入字节[] 从数据库中读取字节[] 从中重新创建文件 一, 二, 三, DataTable table = AccessConnector.GetFileByteArrayByID(122); DataRow row = table.Rows[0]; System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
我正在努力
一, 二, 三,
DataTable table = AccessConnector.GetFileByteArrayByID(122);
DataRow row = table.Rows[0];
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
byte[] newbytes = enc.GetBytes(row.ItemArray[0].ToString());
四, System.IO.File.WriteAllBytes(@"C:\Users\user\Documents\Docs\a.pdf", newbytes);
问题是,新字节比字节小得多,新文件不可访问。Access DB单元格中的字符类似于中文字母。我已经尝试使用其他编码。没有什么。任何人都可以解释为什么它要小得多(23000到400个字符)。谢谢
更新为其他功能添加了代码
public static DataTable GetFileByteArrayByID(int aID)
{
conn.Open();
dbCommand = new OleDbCommand("SELECT Datei FROM Belege WHERE (ID = @ID)", conn);
dbCommand.Parameters.Add("@ID", OleDbType.Integer).Value = aID;
dbDataAdapter = new OleDbDataAdapter(dbCommand);
DataTable resultDataTable = new DataTable();
dbDataAdapter.Fill(resultDataTable);
conn.Close();
return resultDataTable;
}
您从未为@文件
参数赋值
此外,在读取数据时不需要转换为字符串,这应该可以:
byte[] newbytes = (byte[])table.Rows[0][0];
解决方案
public static void WriteByteArrayToID(int aID, byte[] aFile)
{
conn.Open();
dbCommand = new OleDbCommand("UPDATE Belege SET Datei = @file WHERE(ID = @ID)", conn);
string tmp = Convert.ToBase64String(aFile);
dbCommand.Parameters.Add("@file", OleDbType.VarChar).Value = tmp;
dbCommand.Parameters.Add("@ID", OleDbType.Integer).Value = aID;
dbDataAdapter = new OleDbDataAdapter(dbCommand);
dbCommand.ExecuteNonQuery();
conn.Close();
}
public static DataTable GetFileByteArrayByID(int aID)
{
conn.Open();
dbCommand = new OleDbCommand("SELECT Datei FROM Belege WHERE (ID = @ID)", conn);
dbCommand.Parameters.Add("@ID", OleDbType.Integer).Value = aID;
dbDataAdapter = new OleDbDataAdapter(dbCommand);
DataTable resultDataTable = new DataTable();
dbDataAdapter.Fill(resultDataTable);
conn.Close();
return resultDataTable;
}
//-----------------------------------------------------------------------------------------------------------------
byte[] bytes = System.IO.File.ReadAllBytes(@"C:\Users\user\Music\1.pdf");
AccessConnector.WriteByteArrayToID(122, bytes);
DataTable table = AccessConnector.GetFileByteArrayByID(122);
string file = table.Rows[0][0] as string;
System.IO.File.WriteAllBytes(@"C:\Users\user\Documents\Dokumente\a.pdf", Convert.FromBase64String(file));
//-----------------------------------------------------------------------------------------------------------------
1.是的,谢谢你。我没看到…:D 2。他说:如果我写
byte[]newbytes=(byte[])表,就不能从字符串转换为byte[],行[0][0]
在这种情况下,到字符串的转换可能已经在GetFileByteArrayByID(…)
方法中发生。我觉得您的代码不错,但不幸的是,我已经很久没有使用access数据库了,Datei
列是什么数据类型?它应该类似于“二进制”。
dbCommand.Parameters.Add("@ID", OleDbType.Integer).Value = aID;
dbCommand.Parameters.Add("@ID", OleDbType.VarBinary).Value = aFile;
byte[] newbytes = (byte[])table.Rows[0][0];
public static void WriteByteArrayToID(int aID, byte[] aFile)
{
conn.Open();
dbCommand = new OleDbCommand("UPDATE Belege SET Datei = @file WHERE(ID = @ID)", conn);
string tmp = Convert.ToBase64String(aFile);
dbCommand.Parameters.Add("@file", OleDbType.VarChar).Value = tmp;
dbCommand.Parameters.Add("@ID", OleDbType.Integer).Value = aID;
dbDataAdapter = new OleDbDataAdapter(dbCommand);
dbCommand.ExecuteNonQuery();
conn.Close();
}
public static DataTable GetFileByteArrayByID(int aID)
{
conn.Open();
dbCommand = new OleDbCommand("SELECT Datei FROM Belege WHERE (ID = @ID)", conn);
dbCommand.Parameters.Add("@ID", OleDbType.Integer).Value = aID;
dbDataAdapter = new OleDbDataAdapter(dbCommand);
DataTable resultDataTable = new DataTable();
dbDataAdapter.Fill(resultDataTable);
conn.Close();
return resultDataTable;
}
//-----------------------------------------------------------------------------------------------------------------
byte[] bytes = System.IO.File.ReadAllBytes(@"C:\Users\user\Music\1.pdf");
AccessConnector.WriteByteArrayToID(122, bytes);
DataTable table = AccessConnector.GetFileByteArrayByID(122);
string file = table.Rows[0][0] as string;
System.IO.File.WriteAllBytes(@"C:\Users\user\Documents\Dokumente\a.pdf", Convert.FromBase64String(file));
//-----------------------------------------------------------------------------------------------------------------