关于大文件上传并保存数据库的处理(image,text,ntext)
2011-11-29 10:33
429 查看
数据库字段类型为image,text,ntext
if (this.FileUpload1.HasFile)
{
string name = FileUpload1.PostedFile.FileName;
string contentType = FileUpload1.PostedFile.ContentType;
int contentLength = FileUpload1.PostedFile.ContentLength;
string cmdText = "insert into Files ( Name, ContentType, ContentLength, Data)"
+ "values (@name, @contentType, @contentLength, 0x0);"
+ "select @identity = SCOPE_IDENTITY();"
+ "select @pointer = TEXTPTR(Data) FROM Files WHERE ID = @identity";
SqlCommand cmd = new SqlCommand(cmdText);
cmd.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = name;
cmd.Parameters.Add("@contentType", SqlDbType.VarChar, 20).Value = contentType;
cmd.Parameters.Add("@contentLength", SqlDbType.Int).Value = contentLength;
//当前插入数据行的ID
SqlParameter paraId = cmd.Parameters.Add("@identity", SqlDbType.Int);
paraId.Direction = ParameterDirection.Output;
//TEXTPTR函数(sqlsvr 2000+)返回16位二进制表示的单元格指针
SqlParameter outParaPtr = cmd.Parameters.Add("@pointer", SqlDbType.Binary, 16);
outParaPtr.Direction = ParameterDirection.Output;
string connStr = "Data Source=.;Initial Catalog=Resources;Integrated Security=True";
using (SqlConnection conn = new SqlConnection(connStr))
{
cmd.Connection = conn;
conn.Open();
cmd.ExecuteNonQuery();
int fileId = (int)paraId.Value;
//msdn建议为8040的倍数
int bufferSize = 8040;
int offset = 0;
byte[] pointer = (byte[])outParaPtr.Value;
//通过UPDATETEXT命令获得单元格指针
SqlCommand cmdAppendFile = new SqlCommand(
"UPDATETEXT Files.Data @pointer @offset 0 @bytes", conn);
SqlParameter paraPtr = cmdAppendFile.Parameters.Add("@pointer", SqlDbType.Binary, 16);
paraPtr.Value = pointer;
SqlParameter paraData = cmdAppendFile.Parameters.Add(
"@bytes", SqlDbType.VarBinary, bufferSize);
SqlParameter paraOffset = cmdAppendFile.Parameters.Add(
"@offset", SqlDbType.Int);
paraOffset.Value = offset;
byte[] buffer = new byte[bufferSize];
int readCount = 0;
//通过流的方式将上传内容逐块写到数据库
while ((readCount = FileUpload1.PostedFile.InputStream
.Read(buffer, 0, bufferSize)) > 0)
{
byte[] data = buffer;
if (readCount < bufferSize)
{
data = new byte[readCount];
Array.Copy(buffer, data, readCount);
}
//将新读入Buffer的数据作为参数传入数据库
paraData.Value = data;
cmdAppendFile.ExecuteNonQuery();
//更新指针的偏移量
offset += readCount;
paraOffset.Value = offset;
}
}
}
if (this.FileUpload1.HasFile)
{
string name = FileUpload1.PostedFile.FileName;
string contentType = FileUpload1.PostedFile.ContentType;
int contentLength = FileUpload1.PostedFile.ContentLength;
string cmdText = "insert into Files ( Name, ContentType, ContentLength, Data)"
+ "values (@name, @contentType, @contentLength, 0x0);"
+ "select @identity = SCOPE_IDENTITY();"
+ "select @pointer = TEXTPTR(Data) FROM Files WHERE ID = @identity";
SqlCommand cmd = new SqlCommand(cmdText);
cmd.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = name;
cmd.Parameters.Add("@contentType", SqlDbType.VarChar, 20).Value = contentType;
cmd.Parameters.Add("@contentLength", SqlDbType.Int).Value = contentLength;
//当前插入数据行的ID
SqlParameter paraId = cmd.Parameters.Add("@identity", SqlDbType.Int);
paraId.Direction = ParameterDirection.Output;
//TEXTPTR函数(sqlsvr 2000+)返回16位二进制表示的单元格指针
SqlParameter outParaPtr = cmd.Parameters.Add("@pointer", SqlDbType.Binary, 16);
outParaPtr.Direction = ParameterDirection.Output;
string connStr = "Data Source=.;Initial Catalog=Resources;Integrated Security=True";
using (SqlConnection conn = new SqlConnection(connStr))
{
cmd.Connection = conn;
conn.Open();
cmd.ExecuteNonQuery();
int fileId = (int)paraId.Value;
//msdn建议为8040的倍数
int bufferSize = 8040;
int offset = 0;
byte[] pointer = (byte[])outParaPtr.Value;
//通过UPDATETEXT命令获得单元格指针
SqlCommand cmdAppendFile = new SqlCommand(
"UPDATETEXT Files.Data @pointer @offset 0 @bytes", conn);
SqlParameter paraPtr = cmdAppendFile.Parameters.Add("@pointer", SqlDbType.Binary, 16);
paraPtr.Value = pointer;
SqlParameter paraData = cmdAppendFile.Parameters.Add(
"@bytes", SqlDbType.VarBinary, bufferSize);
SqlParameter paraOffset = cmdAppendFile.Parameters.Add(
"@offset", SqlDbType.Int);
paraOffset.Value = offset;
byte[] buffer = new byte[bufferSize];
int readCount = 0;
//通过流的方式将上传内容逐块写到数据库
while ((readCount = FileUpload1.PostedFile.InputStream
.Read(buffer, 0, bufferSize)) > 0)
{
byte[] data = buffer;
if (readCount < bufferSize)
{
data = new byte[readCount];
Array.Copy(buffer, data, readCount);
}
//将新读入Buffer的数据作为参数传入数据库
paraData.Value = data;
cmdAppendFile.ExecuteNonQuery();
//更新指针的偏移量
offset += readCount;
paraOffset.Value = offset;
}
}
}
相关文章推荐
- 关于大文件上传并保存数据库的处理(varbinary)
- mssql表转为.sql脚本文件(timestamp不需处理,image,text,ntext,sql_variant 暂时不处理)
- 上传下载保存到数据库的image字段中的文件
- Java中关于文件上传的基本处理方法Commons-FileUpload
- 关于 软考报名 上传照片无法保存的处理方法
- 关于使用java从http接口取数据保存到本地文件的中文乱码处理
- 关于java上传到ftp文件为空的处理笔记
- 关于文件保存到数据库及其读取的方法
- 关于httpclient上传文件是中文名称的处理
- 关于SpringMVC上传文件时后台处理
- php 文件上传 以及保存在本地的乱码问题处理
- Windows Phone 数据库,删除提示 SQL Server does not handle comparison of NText, Text, Xml, or Image data types
- 关于普通表单多文件上传的处理方法
- WPF用流的方式上传/显示/下载图片文件(保存在数据库)
- php中关于普通表单多文件上传的处理方法
- 关于集成第三方office的sdk产品,采用servlet方式将数据库表BLOB字段文件下载与二进制文件上传到blob
- 关于ntext、text 和 image 数据 [ 日期:2005-07-25 ] [ 来自:zt ]
- 上传文件保存到数据库
- Asp.Net上传文件到Access数据中,并从数据库中读取文件并保存
- 上传图片到数据库并保存成Image格式