OLE字段存储视频byte[]数组后无法转换回文件问题求助
问题修复方案
核心错误位置:UploadVideo方法的SQL拼接逻辑
你直接将byte[] file变量拼接入SQL字符串时,C#会自动调用byte数组的ToString()方法,最终存入OLE对象字段的是字符串"System.Byte[]",而非真实的视频二进制数据,所以读取时无法转回正常视频文件。
修复后的UploadVideo方法代码
public void UploadVideo(string hero, string username , byte[] file) { using (OleDbConnection conn = new OleDbConnection(Connect.GetConnectionString())) { conn.Open(); try { // 改用参数化查询,不要直接拼接SQL,file为数据库关键字加[]避免冲突 string sql = "Insert Into videos(username, hero, [file]) Values(?, ?, ?) "; using (OleDbCommand com = new OleDbCommand(sql, conn)) { // OleDb参数按顺序匹配,二进制参数单独指定类型 com.Parameters.AddWithValue("@p1", username); com.Parameters.AddWithValue("@p2", hero); OleDbParameter fileParam = new OleDbParameter("@p3", OleDbType.Binary, file.Length); fileParam.Value = file; com.Parameters.Add(fileParam); com.ExecuteNonQuery(); } } catch (Exception ex) { throw ex; } } }
额外校验&优化建议
- 插入完成后可先查询对应记录的
file字段长度,如果长度小于100基本可以判定是插入错误,正常视频文件的二进制长度至少在MB级别 - 你当前的逻辑是先把上传的视频存到服务器本地文件夹,再读成byte数组存入数据库,冗余了一次磁盘IO,可以直接读取
HttpPostedFile.InputStream的流转为byte数组,不需要先存本地临时文件 - 若视频体积普遍较大,不建议存储在数据库中,更推荐将视频存在磁盘/对象存储,数据库仅存储文件路径,读取性能会高很多
- 读取写入文件的逻辑无需修改,插入逻辑修复后即可正常生成可用的mp4文件
内容的提问来源于stack exchange,提问作者דין ודברים
相关产品推荐
相关产品推荐

