#region 打开电机各类文档 /// <summary> /// 打开电机各类文档 /// </summary> /// <param name="fileName">文档的名称</param> /// <param name="procName">存储过程名</param> /// <param name="fieldFileName">存储文档名称的字段名</param> /// <param name="fieldFile">存储文档的字段名</param> private void openFile(string fileName, string procName,string fieldFileName,string fieldFile) { dataSet = SqlHelper.ExecuteDataset(SqlHelper.connStr, CommandType.StoredProcedure, procName, new SqlParameter(fieldFileName, fileName)); table = dataSet.Tables[0]; string path = @"C:\Users\Administrator\Desktop\ " + fileName; using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write)) { foreach (DataRow row in table.Rows) { byte[] fileByte = (byte[])row[fieldFile]; int arraySize = fileByte.GetUpperBound(0); fs.Write(fileByte, 0, arraySize); Process.Start(path); } } } #endregion
这是我的下载代码
using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { byte[] motorSPLByte = new byte[Convert.ToInt32(fileStream.Length)]; fileStream.Read(motorSPLByte, 0, (int)fileStream.Length); SqlHelper.ExecuteNonQuery(sqlTran, CommandType.StoredProcedure, "proc_insertSPLDecument", new SqlParameter("motorName", this.txtMotorName.Text), new SqlParameter("@sPLName", fileName), new SqlParameter("@sPLDecument", motorSPLByte)); }
这是我的部分上传代码
代码中的主要问题是在FileStream还没关闭,就用Process.Start打开文件,我改了一下代码:
int index = 1; foreach (DataRow row in table.Rows) { string path = @"C:\Users\Administrator\Desktop\ " + fileName + index++; using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write)) { byte[] fileByte = (byte[])row[fieldFile]; int arraySize = fileByte.Length(0); fs.Write(fileByte, 0, arraySize); } } Process.Start(path); }
using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
{
byte[] fileByte = (byte[])row[fieldFile];
int arraySize = fileByte.Length(0);
fs.Write(fileByte, 0, arraySize);
}
}
关闭了啊,用using自动销毁FileStream
@紫砂清壶: Process.Start(path);应该放在using外面
@dudu:
foreach (DataRow row in table.Rows) { using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write)) { byte[] fileByte = (byte[])row[fieldFile]; int arraySize = fileByte.GetUpperBound(0); fs.Write(fileByte, 0, arraySize); } Process.Start(path); }
还是同样的问题
@紫砂清壶:
@紫砂清壶:
你现在每次foreach都是同样的文件名,这个地方会有问题。
@dudu: 但是为什么word,图片没有问题,就excel有问题???
@dudu: 难道可能是excel里面含有公式、图片,不能恢复???
@紫砂清壶: 你上传一个空的Excel文件试试
@dudu: 可以打开,但是出现警告
@紫砂清壶: 是用Process.Start(path);打开的,还是手动打开的?
@dudu: 手动打开和Process.Start(path)打开效果一样。。。能否远程协助一下,我的QQ发到你信箱了???
@紫砂清壶: 是fileByte.GetUpperBound(0);引起的,fileByte.GetUpperBound(0)得到的长度比fileByte.Length少1,也就是 Array.GetUpperBound(0) = Array.Length-1;
呵呵,不用说一看就知道楼主的代码不够简练.
数组长度你调试跟踪一下
不是数组长度的问题啊