做自动升级,把文件存储到数据库里文件也不大,一个没超过1M,一个超过1M,一个超过5M
局域网内部读取都正常select filedata from SC_Upgrade where filename='myexe.exe'外网通过域名连接进来的时候,超过1M的文件就提示超时这个应该怎么解决?不想用socket另外发文件,有好的解决方案吗?

解决方案 »

  1.   

    提示连接超时  如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,不过是由于连接的时间大于允许的时间而导致出错。   这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器, 并且是慢速连接时,有可能会导致以上的超时错误.有些情况下,由于局域网的网络问题,也会导致这样的错误。   要解决这样的错误,可以修改客户端的连接超时设置. 默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是4秒, 而查询分析器是15秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因).   具体步骤为:   企业管理器中的设置:   1.在企业管理器中,选择菜单上的"工具",再选择"选项"   2.在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡   3.在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如20.   查询分析器中的设置:  工具—选项—连接—将登录超时设置为一个较大的数字 
      

  2.   

    连接是没有超时的,关键是select的时候超时,在企业管理器里改这个时间没用吧
    是通过程序ado.net连接的
      

  3.   

    --写个过程调试一下
    create proc sp_test
    as
    select filedata from SC_Upgrade where filename='myexe.exe' 
    go然后在网页调用:
    exec sp_test --看看什么情况
      

  4.   

    C#
    压缩代码   
                     ZipInputStream lo_Zip = new ZipInputStream(lo_Stream);
                        lo_Zip.GetNextEntry();                   string lo_Rst = lo_Zip;
      

  5.   


     RuntimeObject.DB.Open();
                DataSet ds = RuntimeObject.DB.exeSqlForDataSet(SqlBuilder.GetSelect("SC_Upgrade",
                    "filename,filesize,filelastwritetime"));
                RuntimeObject.DB.Close();
                DataTable dt=ds.Tables[0];
                foreach(DataRow dr in dt.Rows)
                {
                    string filename = dr["filename"].ToString().Trim();
                    long filesize = Convert.ToInt64(dr["filesize"]);
                    DateTime filelastwritetime = Convert.ToDateTime(dr["filelastwritetime"]);                FileInfo fi = new FileInfo(path + @"\" + filename);
                    if ((!fi.Exists) || fi.Length != filesize || fi.LastWriteTime != filelastwritetime)
                    {
                        RuntimeObject.DB.Open();
                        object objx = RuntimeObject.DB.exeSqlForOneVal(SqlBuilder.GetSelect("SC_Upgrade", "filedata"
                            , new FilterParameter("filename", filename)));                    RuntimeObject.DB.Close();                    byte[] filedata = (byte[])objx;
                        if (fi.Exists) fi.Delete();
                        FileStream fs;
                        fs = fi.Create();                    fs.Write(filedata, 0, filedata.Length);
                        fs.Close();
                        fi.LastWriteTime = filelastwritetime;
                    }
                }
    感谢诸位的意见:
    这是我的代码,局域网内实现自动升级没问题,外网接入不行,超过1M就超时
    建立VPN连接感觉不方便,客户是中小企业,没有这么大能耐维护这个东西,暂时不考虑
    文件压缩的话感觉也不是办法,文件大了再压缩超过1M也正常
    用存储过程道理和上面压缩的一样,一个是提高执行效率,一个是减少传输量,应该都不能完全解决文件再大一点的问题——不过我没测试过,可能说得不对,请谅解。
    我的思路是要不要按块存储,就是说一块最多存储1M,大文件分几块存储,客户端读取的时候进行拼接,最后写入整体的文件。
    这样速度上虽然也不快,但是可以显示个进度条,应该可以接受,因为升级的情况毕竟不多。再次恳请各位大侠发表意见!
      

  6.   

    按块存储的流程过于复杂,而且效率并不一定高,毕竟以前一条记录,现在多条。个人觉得按块传输的方法楼主也可以考虑下。步骤如下:
    1.客户端分析文件,分成若干块,分配固定的内存。设置对应的标记。
    2.按照顺序,把对应的块传输到SERVER端。
    3.server端接受块,并讲对应的块写入缓存中的临时文件。
    4.将临时文件存入数据库中。这样在数据库本机操作,应该不用担心超时问题。
     
    楼主可以参考下。
     
      

  7.   

    我们也是把文件存在数据库中,外网下载速度很快的;特征代码是
        public void show() 
        { 
             
                string ss = Request.QueryString["id"].ToString(); 
                string s3 = "select * from imgpic  where id=" + ss; 
                MySqlCommand comm = new MySqlCommand(s3, conn); 
                conn.Open(); 
                MySqlDataReader dr = comm.ExecuteReader(CommandBehavior.CloseConnection); 
                while(dr.Read()) 
                { 
                    Response.Clear(); 
                    Response.ClearContent();
                    Response.BinaryWrite((byte[])dr["myimg"]);//读取 
                } 
                Response.End(); 
                conn.Close(); 
        } 
    }  
      

  8.   

    回12楼,通过SqlDataReader读取最早使用,和目前使用的情况一样,这个不是关键问题
    关键问题是大文件超时,小文件在外网读取也没有问题回13楼,本机读取没问题,局域网都没问题,就是外网不行,网络传输问题这个当然知道,关键是该怎么解决,谢谢!
      

  9.   

    ado.net连接有设置查询超时时间的,默认好像才20秒
    貌似是个commandtimeout之类的属性
      

  10.   

    就你那个conn的属性,你改大点就可以了,是以毫秒为单位的
      

  11.   

    public void CreateMySqlCommand() 
    {
       SqlCommand myCommand = new SqlCommand();
       myCommand.CommandTimeout = 15;--设置这里
       myCommand.CommandType = CommandType.Text;
    }