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();
}