字符串或二进制数据将被截断为asp.net

时间:2014-01-10 07:23:29

标签: c# asp.net .net

在数据库中以二进制形式插入doc文件。我收到错误字符串或二进制数据将被截断..

我有一个像这样的网页表单

 <table>
<tr>
<td> 
    Select File
    </td>
    <td>
    <asp:FileUpload ID="FileUpload1" runat="server" ToolTip="Select Only Word File" />
    </td>
    <td> 
    <asp:Button ID="Button1" runat="server" Text="Upload" onclick="Button1_Click" />
    </td>
    <td>
        <asp:Button ID="Button2" runat="server" Text="View Files" 
            onclick="Button2_Click" />
   </td>
    </tr>

用户点击上传时的代码

protected void Button1_Click(object sender, EventArgs e)
        {
            Label2.Visible = true;
            string filePath = FileUpload1.PostedFile.FileName;
            string filename1 = Path.GetFileName(filePath);
            string ext = Path.GetExtension(filename1);
            string type = String.Empty;

            if (!FileUpload1.HasFile)
            {
                Label2.Text = "Please Select File";
            }
            else
                if (FileUpload1.HasFile)
                {

                    try
                    {
                        // Added by vithal wadje for Csharp-Corner contribution

                        switch (ext)
                        {
                            case ".doc":

                                type = "application/word";

                                break;

                            case ".docx":

                                type = "application/word";

                                break;

                        }

                        if (type != String.Empty)
                        {
                            connection();
                            Stream fs = FileUpload1.PostedFile.InputStream;
                            BinaryReader br = new BinaryReader(fs);
                            Byte[] bytes = br.ReadBytes((Int32)fs.Length);
                            query = "insert into test(data)" + " values (@Data)";
                            com = new SqlCommand(query, con);
                            com.Parameters.Add("@Data", SqlDbType.VarBinary).Value = bytes;
                            com.ExecuteNonQuery();
                            Label2.ForeColor = System.Drawing.Color.Green;
                            Label2.Text = "Word File Uploaded successfully";

                        }
                        else
                        {
                            Label2.ForeColor = System.Drawing.Color.Red;

                            Label2.Text = "Select Only word Files";


                        }
                    }
                    catch (Exception ex)
                    {
                        Label2.Text = "Error: " + ex.Message.ToString();


                    }

                }
        }

在SQL Server中,我有数据库名称测试表名称test

data varbinary(Max)

我上传的文件包含数据byte[9886].

3 个答案:

答案 0 :(得分:0)

此问题是由于我们尝试在大于指定列的最大大小的列中插入值,因此请尝试使用最大数据类型

name Varchar(Max)
type Varchar(Max)
data VarBinary(Max)

在此过程中检查您要插入的其他列。我会特别检查type列,因为它类似于image/jpeg,而不仅仅是图像或jpeg。

以下是list of possible content types,以便您可以相应地在ContentType列中创建足够的空间。

答案 1 :(得分:0)

尝试将SQL参数的大小/长度设置为实际的字节长度。

com = new SqlCommand(query, con);
com.Parameters.Add("@Data", SqlDbType.VarBinary, bytes.Length).Value = bytes;
com.ExecuteNonQuery();

或尝试将参数长度设置为-1,以便它由SQLClient转换为varbinary(MAX):

com = new SqlCommand(query, con);
com.Parameters.Add("@Data", SqlDbType.VarBinary, -1).Value = bytes;
com.ExecuteNonQuery();

答案 2 :(得分:0)

虽然您可以使用VarBinary(MAX)来解决问题,这会将容量增加到约2GB,但这可能不是理想的解决方案。

虽然可以将大量二进制数据存储到SQL数据库中,但您可能不应该这样做。相反,您应该只查看存储对该文件的引用以及其他元数据,并将该文件存储到磁盘上。您最好只使用文件服务器,这样可以避免对SQL服务器造成过高的负担。

如果您希望坚持将文件存储在SQL服务器上,请查看使用VarBinary(MAX)FILESTREAM,然后可以存储更大的文件并更快地移动数据。

此处有更多信息:http://technet.microsoft.com/en-us/library/bb933993(v=sql.105).aspx