您的位置:首页 > 数据库

关于大文件上传并保存数据库的处理(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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: