2

该文件只有 14kb(14,000 字节)。我已经读到varbinary(max)列类型(这是我正在使用的)仅支持 8,000 字节。那是对的吗?如何将我的文件上传到数据库中?

if (file.ContentLength < (3 * 1048576))
{
    // extract only the fielname
    var fileName = Path.GetFileName(file.FileName);

    using (MemoryStream ms = new MemoryStream())
    {
        file.InputStream.CopyTo(ms);
        byte[] array = ms.GetBuffer();
        adj.resumeFile = array;
        adj.resumeFileContentType = file.ContentType;
    }
}

错误:

字符串或二进制数据将被截断。该语句已终止。

4

4 回答 4

5

检查您在此过程中插入的其他列。我会特别检查该ContentType列,因为这将类似于image/jpeg而不是简单的图像或 jpeg。

以下是可能的内容类型列表,以便您可以在 ContentType 列中相应地创建足够的空间。

于 2013-05-09T19:28:36.857 回答
1
varbinary  [ ( n | max) ]  
Variable-length binary data. n can be a value from 1 through 8,000. 

max 表示最大存储大小为 2^31-1 字节。

http://msdn.microsoft.com/en-us/library/ms188362.aspx

所以这是2GB。

于 2013-05-09T19:00:28.937 回答
1

我知道这不是您问题的答案,但 ms.GetBuffer() 将获得可能不是您数据的确切大小的底层缓冲区。MemoryStream 为写入分配了额外的空间,您可能正在从未使用的缓冲区中插入额外的字节。在这里你可以看到 GetBuffer() 返回一个 256 字节的数组,即使文件只有 5 个字节长:

using (MemoryStream ms = new MemoryStream())
{
    using (FileStream fs = File.OpenRead("C:\\t\\hello.txt"))
    {
        fs.CopyTo(ms);
        byte[] results = ms.GetBuffer();
        Console.WriteLine("Size: {0}", results.Length); // 256
        byte[] justdata = new byte[ms.Length];
        Array.Copy(results, justdata, ms.Length);
        Console.WriteLine("Size: {0}", justdata.Length); // 5
    }
}
于 2013-05-09T23:35:06.637 回答
1

如果您VARBINARY(MAX)在表定义中定义了列,那么您应该有最多 2 GB 的存储空间。如果您将最大列大小指定为数字,那么您只能明确要求最多VARBINARY(8000).

有关更多详细信息,请参阅此问题

AFAIKVARBINARY(MAX)仅出现在 SQL Server 2008 中,因此如果您的数据库早于该版本,您可能需要升级它。

于 2013-05-09T19:03:04.633 回答