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

你好,

我正在努力

  • 将文件转换为字节[]
  • 在Access数据库中写入字节[]
  • 从数据库中读取字节[]
  • 从中重新创建文件

  • 一,

    二,

    三,

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