【问题标题】:Error is" string or binary data truncated"错误是“字符串或二进制数据被截断”
【发布时间】:2015-01-08 10:42:59
【问题描述】:

如果txt文件上传成功。但是上传大的txt文件然后发生错误。 错误是“字符串或二进制数据被截断”

protected void Button1_Click(object sender, EventArgs e)
    {
        FileUpload1.SaveAs(Server.MapPath("~\\upload\\") + FileUpload1.FileName);
        f = Path.GetFileNameWithoutExtension(FileUpload1.FileName);
        st = Path.GetFileName(FileUpload1.FileName);
        ml = Server.MapPath("~\\upload\\");
        nww = FileUpload1.FileName;
        ty = Path.GetExtension(FileUpload1.FileName);
        kk = ml + f + ty;

        FileInfo fz = new FileInfo(kk);
        long s1 = fz.Length;
        string fsize = s1.ToString();

        string dat = DateTime.Now.ToString();
        FileStream fs = new FileStream(kk, FileMode.Open, FileAccess.ReadWrite);
        byte[] buffer = new byte[fs.Length];
        fs.Read(buffer, 0, (int)fs.Length);
        fs.Close();
        con.Open();

        SqlCommand cmd1 = new SqlCommand("insert into ofileup     (Fid,filename,files,ftype,fsize,filepath,oname,status,date) values(@Fid,@filename,@files,@ftype,@fsize,@filepath,@oname,@status,@date)", con);

        cmd1.Parameters.AddWithValue("@Fid", Label14.Text);
        cmd1.Parameters.AddWithValue("@filename", st);
        cmd1.Parameters.AddWithValue("@files", buffer);
        cmd1.Parameters.AddWithValue("@ftype", ty);
        cmd1.Parameters.AddWithValue("@fsize", fsize);
        cmd1.Parameters.AddWithValue("@filepath", kk);
        cmd1.Parameters.AddWithValue("@oname", Label16.Text);
        cmd1.Parameters.AddWithValue("@status","waiting");
        cmd1.Parameters.AddWithValue("@date", dat);

        cmd1.ExecuteNonQuery();
        con.Close();
        Label17.Text = "File Uploaded Successfully...";
        autoid();
    }

在数据库中

  • Fid int
  • 文件名 varchar(250)
  • 文件 varchar(150)
  • ftype varchar(150)
  • fsize bigint
  • 文件路径 varchar(150)
  • oname varchar(50)
  • 状态 varchar(50)
  • 日期 varchar(50)

【问题讨论】:

  • 好吧,你的 files 字段说它只能处理 150 个字符,但你用一个可能比这更大的文件的内容填充它。 (尽管该字段是文本字段,但您也没有非常清楚地阅读它,并且将其作为二进制数据读取,但这些是单独的问题。)当您的架构不允许时,您如何期望数据库处理大文件是吗?
  • 虽然这个问题与数据库有关。这里有一些支持您的 .net 应用程序以允许上传大文件的要点。 <httpRuntime maxRequestLength="2097152" executionTimeout="600" /> 只需在 <system.web> 部分下的 web.config 中设置。在示例中,我将最大长度设置为 2GB。请注意,maxRequestLength 以 KB 为单位设置,并且可以设置为 2GB (2079152 KB)。但默认文件大小限制为 (4MB)。

标签: c# sql-server


【解决方案1】:

在数据库中,如果您将文件存储在记录中 - 您需要将 files 列更改为 nvarchar(max)(或以前的 SQL 服务器为 ntext,两者都可以)。但实际上,如果您要存储纯字节,则使用 varbinary 是您的最佳选择(除非超过 250k 左右,否则请使用 FILESTREAM 设置,如果可以的话)。

本质上,通过将files 限制为varchar(150),您只允许文件的字节大小为 150 个字符。

错误消息是 SQL 服务器告诉您,您尝试将更多字符放入 SQL 列中,超出了它允许的范围 - 它空间不足,如果让它继续,数据将被截断/截断。相反,它会出错。

简而言之,将file 列的大小增加到varchar/nvarchar (max)varbinary(max),如果您打算存储> 250k 的文件,请考虑使用FILESTREAM

【讨论】:

  • if (e.CommandName == "Select") { int x = Convert.ToInt32(e.CommandArgument); GridViewRow 行 = GridView1.Rows[x];字符串 fid = row.Cells[0].Text; con.Open(); SqlCommand com = new SqlCommand("select oname,files,filename from ofileup where Fid=@Fid", con); com.Parameters.AddWithValue("@Fid", fid); SqlDataReader dr = com.ExecuteReader();
  • if (dr.Read()) { Response.Clear();响应缓冲区=真; //Response.ContentType = dr["ftype"].ToString(); Response.AddHeader("content-disposition", "files;filename=" + dr["filename"].ToString()); // 打开文件提示框打开或保存文件 Response.Charset = ""; Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.BinaryWrite((byte[])dr["files"]);响应。结束(); } con.Close(); }
  • 在上面的代码中Response.BinaryWrite((byte[])dr["files"]);是显示错误。错误无法将 system.string 转换为 system.binary
  • 这几乎是不可能阅读的——但通过查看您收到的错误来看,您正在将响应的内容类型设置为字符串变体(如 CSV?) - 并尝试 .BinaryWrite 给它。看这里:stackoverflow.com/questions/18998763/…,也只是谷歌“如何在 C# 中从数据库中流式传输文件”——你将获得一百万次点击(给予或接受 5)。
猜你喜欢
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
相关资源
最近更新 更多