上传的代码如下,但是上传大文件时(比如60-70兆以上时),sql占用的内存大小会上浮到1.2G以上,不知道哪里有问题?因为问题出在sql上,所以和http与.net框架应该没有太大的关系,不知道是社么原因?谢谢各位兄弟上两次的贴子会一起结算,所以请各位能在下面的贴子里也贴一次,方便结算
http://community.csdn.net/Expert/topic/3871/3871482.xml?temp=.4059717
http://community.csdn.net/Expert/topic/3846/3846307.xml?temp=.5148126
Dim con As System.Data.SqlClient.SqlConnection
Dim strcmd As String
Dim cmd As System.Data.SqlClient.SqlCommand
Dim intfilelen As Integer
Dim objstream As System.IO.Stream
con = New System.Data.SqlClient.SqlConnection(ConfigurationSettings.AppSettings("jxp")) intfilelen = txtfilecontents.PostedFile.ContentLength
Dim arrfile(intfilelen) As Byte
objstream = txtfilecontents.PostedFile.InputStream
objstream.Read(arrfile, 0, intfilelen)
strcmd = "insert uploads (u_title,u_document) values (@u_title,@u_document)"
cmd = New System.Data.SqlClient.SqlCommand(strcmd, con)
cmd.Parameters.Add("@u_title", System.Data.SqlDbType.VarChar).Value = TextBox1.Text
cmd.Parameters.Add("@u_document", System.Data.SqlDbType.Image).Value = arrfile con.Open()
cmd.ExecuteNonQuery()
con.Close()
http://community.csdn.net/Expert/topic/3871/3871482.xml?temp=.4059717
http://community.csdn.net/Expert/topic/3846/3846307.xml?temp=.5148126
Dim con As System.Data.SqlClient.SqlConnection
Dim strcmd As String
Dim cmd As System.Data.SqlClient.SqlCommand
Dim intfilelen As Integer
Dim objstream As System.IO.Stream
con = New System.Data.SqlClient.SqlConnection(ConfigurationSettings.AppSettings("jxp")) intfilelen = txtfilecontents.PostedFile.ContentLength
Dim arrfile(intfilelen) As Byte
objstream = txtfilecontents.PostedFile.InputStream
objstream.Read(arrfile, 0, intfilelen)
strcmd = "insert uploads (u_title,u_document) values (@u_title,@u_document)"
cmd = New System.Data.SqlClient.SqlCommand(strcmd, con)
cmd.Parameters.Add("@u_title", System.Data.SqlDbType.VarChar).Value = TextBox1.Text
cmd.Parameters.Add("@u_document", System.Data.SqlDbType.Image).Value = arrfile con.Open()
cmd.ExecuteNonQuery()
con.Close()
解决方案 »
- 各位大侠,俺想做一个blog之类的网站,多用户怎么实现?谢谢啊
- csdn 那個浮動的窗口用ASP。NET 怎麼做(CSDN未讀消息)
- DetailsView里Dropdownlist联动问题
- { 100分 } ,求一个特性(Attributes)在Asp.net项目中的实际例子。急,好了立即给分。
- 我的源文件丢失,现在要做一个计数器。请问有可能实现吗?
- web.config中可以指定两个forms认证的入口吗?怎么实现啊?
- 各位兄弟帮忙看看
- 请问:如何把word存入sql server中??
- 我的InternetGetCookie为什么取不到Cookie的值?
- 请教高手,我如何将SESSION存放在数据库中,SQL2000,在用户离线后又怎样清空它?????
- 能否让子报表在主报表规定的区域内显示
- 请高手指点。我的页面如果在一分钟内刷新几次,有时数据库(SQL Server)的连接池会满500,一般也是几百?请问这是怎么回事?请帮我看看
我在C#里把文件通过10M网卡存到sql server里的速度跟拷贝同一个文件的速度相差无几,额外占用的内存只跟每次的Block大小有关(例如8K)
比如说用时间命名
newfilename = DateTime.Now().toString("yyyyMMddhhmmss") + DateTime.Now.Millisecond.ToString()
这样的的命名方式,以年月日时分秒再加毫秒,根本不可能重复,除非你的站点每秒钟同时都有数百人操作,但这根本不可能。
2.你上面的写法有问题。这个的方式是一口气把文件写到数据库中,但我记得
cmd.Parameters.Add("@u_document", System.Data.SqlDbType.Image).Value = arrfile
里面还有个参数,对了,是偏移量,意思就是说碰到大文件时,要分多少次把它写进去。你试一下。
能详细说一下那个偏移量的用法吗?我在书里好像没有看见过这个用法和这个词,谢谢。
在你完成此次查询后,sqlserver不会马上释放内存,数据会仍然放在内存中,这是sqlserver的优化策略,sqlserver会不断地占用你的系统内存,来加快sqlserver的运行速度,当你的系统中的其它服务也需要内存时,它才会自动释放部分内存。一句话,sqlserver不会让你的系统有闲置的内存,除非你设置sqlserver的最大内存使用量。这样也没什么不好,如果你的系统很大,单独给sqlserver一台机器,这样会提高它的性能。
如果你只是开发用,要想让sqlserver释放内存,重启sqlserver的服务就行了。如果不想让sqlserver占用太多内存,设置sqlserver的最大内存占用量.
不过,数据库有点不同,是ORACLE9ISystem.Web.HttpPostedFile myFile = this.Request.Files[this.File1.ID];
int myLength = myFile.ContentLength;if(myLength != 0)
{
System.IO.Stream myStream = myFile.InputStream;
byte[] myByte = new byte[myLength];
myStream.Read(myByte,0,myLength); string sql = "insert into tst_myblob(id,blob) values(:id,:blob)";
System.Data.OracleClient.OracleConnection conn = new OracleConnection("Data Source=xxx;user id=xxx;password=xxx");
conn.Open(); System.Data.OracleClient.OracleCommand cmd = conn.CreateCommand();
cmd.CommandText = sql;
cmd.Parameters.Add(new OracleParameter("id",OracleType.Number));
cmd.Parameters["id"].Value = this.TextBox1.Text;
cmd.Parameters.Add(new OracleParameter("blob",OracleType.Blob));
cmd.Parameters["blob"].Size = myLength;
cmd.Parameters["blob"].Value = myByte;
cmd.Parameters["blob"].Offset = 10;
cmd.ExecuteNonQuery();
}
1.文件放在硬盘里面,改名字不会导致重名的。
比如说用时间命名
newfilename = DateTime.Now().toString("yyyyMMddhhmmss") + DateTime.Now.Millisecond.ToString()
这样的的命名方式,以年月日时分秒再加毫秒,根本不可能重复,除非你的站点每秒钟同时都有数百人操作,但这根本不可能。如果你还觉得有问题,完全可以后边加上5位的随机数,那样应该不会重复了吧?
完全没有必要往数据库里写!那样最终回使你的SQL垮掉!
cmd.Parameters["blob"].Offset
上面的Offset就是偏移量。但没有详细测试过。-------------------------------------------
Offset 属性用于客户端二进制和字符串数据分块。例如,为了将 10MB 的文本插入到服务器上的某一列中,用户可能会执行 10 次 1MB 块的参数化插入,在每次迭代中以 1MB 的大小移动 Offset 的值。该属性用于二进制和字符串类型。它返回二进制类型的字节数和字符串的字符数。字符串的计数不包括终止字符。