C# XPS文件太大,无法存储在数据库中

C# XPS文件太大,无法存储在数据库中,c#,sql-server,wpf,database,C#,Sql Server,Wpf,Database,我正在尝试将.xps文件存储在SQL Server数据库中,但出现错误 System.Data.SqlClient.SqlException:“字符串或二进制数据将被截断。” 我知道这意味着我要存储的数据太大,但我也尝试序列化文档,但它仍然太大(我的数据类型是varchar(MAX)): filename只是System.IO.Path.GetFileNameWithoutExtension(openFileDialog.filename)-该列的数据类型是varchar(20),其长度肯定在该

我正在尝试将
.xps
文件存储在SQL Server数据库中,但出现错误

System.Data.SqlClient.SqlException:“字符串或二进制数据将被截断。”

我知道这意味着我要存储的数据太大,但我也尝试序列化文档,但它仍然太大(我的数据类型是
varchar(MAX)
):

filename
只是
System.IO.Path.GetFileNameWithoutExtension(openFileDialog.filename)
-该列的数据类型是
varchar(20)
,其长度肯定在该范围内

有没有其他方法可以进一步减小字符串的大小?如果没有,是否有其他方法在数据库中存储xps文件

根据msd的答案进行编辑:

byte[] toSave;

using (MemoryStream ms = new MemoryStream())
{
    var writer = new XpsSerializerFactory().CreateSerializerWriter(ms);
    writer.Write(xpsDocument.GetFixedDocumentSequence());
    toSave = ms.ToArray();
}

con.Open();

const String preparedCommand = "insert into [table] values(@FileName, @File, '', '', '', '')";

SqlCommand cmd = new SqlCommand(preparedCommand, con);
cmd.Parameters.Add("@File", SqlDbType.VarBinary).Value = toSave;
cmd.Parameters.Add("@FileName", SqlDbType.VarChar).Value = filename;

cmd.ExecuteNonQuery();
con.Close();

用文本翻译你的nvarchar(max)。您的问题将得到解决。

您必须将数据类型更改为
VARBINARY(MAX)
,并使用以下方法将文件(作为内存流)插入数据库

public static void databaseFilePut(MemoryStream file, string fileName) 
{
   int varID = 0;
   byte[] file = fileToPut.ToArray();
   const string preparedCommand = 
              @"insert into [table] values(@FileName, @File, '', '', '', '')";
   using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
        using (var sqlWrite = new SqlCommand(preparedCommand, varConnection)) {
            sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;
            sqlWrite.Parameters.Add("@FileName", SqlDbType.VarChar, file.Length).Value = fileName;
             sqlWrite.ExecuteNonQuery();
        }
    }
编辑:带文件流

public static void databaseFilePut(string varFilePath) {
    byte[] file;
    using (var stream = new FileStream(varFilePath, FileMode.Open, FileAccess.Read)) {
        using (var reader = new BinaryReader(stream)) {
            file = reader.ReadBytes((int) stream.Length);       
        }          
    }
    using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
    using (var sqlWrite = new SqlCommand("insert into [table] values(@FileName, @File, '', '', '', '')", varConnection)) {
        sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;
        sqlWrite.Parameters.Add("@FileName", SqlDbType.VarChar, file.Length).Value = Path.GetFileName(varFilePath);
        sqlWrite.ExecuteNonQuery();
    }
}

我通过改变向查询中添加参数的方式来解决这个问题

 using (var sqlWrite = new SqlCommand("insert into [table] values(@FileName, @File, '" + fileSizeDisplayed + "', '" + current.ToString(dtformat) + "', 'no', 'no')", con))
    {
        SqlParameter file2 = new SqlParameter("@File", file);
        SqlParameter filename2 = new SqlParameter("@FileName", filename);
        sqlWrite.Parameters.Add(filename2);
        sqlWrite.Parameters.Add(file2);
        sqlWrite.ExecuteNonQuery();
    }

你能试试调试吗?那么请告诉我问题从哪个代码开始?它从
cmd.ExecuteNonQuery()
开始您的数据类型像nvarchar(MAX)而不是varchar。我尝试了nvarchar(MAX)、varbinary(MAX)、text、ntext;没有工作。你的数据库不支持blob吗?同样的错误,我更新了我的代码以显示我所更改的内容-我做得不对吗?仍然是同样的错误:/-我做了一个
控制台。写入文件长度的
,它返回1298925;我觉得它太大了,无法存储。@cosmo,出于好奇,你是在写
保存.Length
到控制台吗
VARBINARY(MAX)
应该能够处理该文件大小,因为它不超过1MB。你用
filename.Length
能得到什么?@Poosh是的,我以前用save.Length。filename.Length返回11。
 using (var sqlWrite = new SqlCommand("insert into [table] values(@FileName, @File, '" + fileSizeDisplayed + "', '" + current.ToString(dtformat) + "', 'no', 'no')", con))
    {
        SqlParameter file2 = new SqlParameter("@File", file);
        SqlParameter filename2 = new SqlParameter("@FileName", filename);
        sqlWrite.Parameters.Add(filename2);
        sqlWrite.Parameters.Add(file2);
        sqlWrite.ExecuteNonQuery();
    }