2017-07-31 26 views
2

我試圖存儲.xps文件在SQL Server數據庫,但我得到的錯誤XPS文件太大而被存儲在數據庫

System.Data.SqlClient.SqlException:「字符串或二進制數據將被截斷。'

我知道這意味着我要存儲的數據量太大,而且我也試着序列化的文檔,它仍然過大(我的數據類型是varchar(MAX)):

var xpsDocument = new XpsDocument(xpsFile, FileAccess.Read); 
String toSave; 

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

con.Open(); 

SqlCommand cmd = con.CreateCommand(); 
cmd.CommandType = CommandType.Text; 
cmd.CommandText = "insert into [table] values('" + filename + "', '" + toSave + "')"; 
cmd.ExecuteNonQuery(); 
con.Close(); 

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(); 
+0

您的數據庫不支持BLOB嗎? – Marged

回答

0

我通過改變我向查詢添加參數的方式設法解決此問題。

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

翻譯您爲nvarchar(最大)文本。你的問題將解決。

+0

我試過了,它仍然給出相同的錯誤 – cosmo

+0

你可以嘗試調試嗎?那麼請告訴我,問題開始於哪個代碼? –

+0

它從'cmd.ExecuteNonQuery()' – cosmo

2

你要的數據類型更改爲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(); 
    } 
} 
+0

同樣的錯誤,我更新了我的代碼以顯示我改變了 - 我做錯了嗎? – cosmo

+0

仍然是相同的錯誤:/ - 我做了一個'Console.Write'文件的長度,它返回1298925;認爲它太大而無法存儲。 – cosmo

+0

@cosmo,出於好奇,你是否將'toSave.Length'寫入控制檯? 'VARBINARY(MAX)'應該能夠處理該文件的大小,因爲它不會大於1MB。你有什麼'filename.Length'? – Poosh

相關問題