无效字符
本文关键字:字符 无效 | 更新日期: 2023-09-27 17:57:24
我正在为sql服务器创建CLR程序集,它将数据库中的一些数据保存到excel文件中。它工作正常,直到我从数据库中收到无效字符错误:
System.ArgumentException: '',十六进制值 0x04,是一个无效字符。
问题是文件保持锁定状态,在下次执行此 CLR 过程之前我无法删除它。发生错误时如何解锁文件甚至删除它?
另一个问题?我可以保存带有无效字符的 excel 文件吗?
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using ClosedXML.Excel;
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Assert, Name = "FullTrust")]
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void createExcel(SqlString procName, SqlString fileName, SqlString filePath, SqlXml xmlParams, out SqlBoolean result)
{
result = false;
DataSet exportData = new DataSet();
if (procName.Value == string.Empty)
throw new Exception("Procedure name value is missing.");
if (filePath.Value == string.Empty)
throw new Exception("Missing file path location.");
if (fileName.Value == string.Empty)
throw new Exception("Missing name of file.");
using (SqlConnection conn = new SqlConnection("context connection=true"))
{
using (SqlCommand getOutput = new SqlCommand())
{
getOutput.CommandText = procName.ToString(); ;
getOutput.CommandType = CommandType.StoredProcedure;
getOutput.CommandTimeout = 300;
getOutput.Connection = conn;
conn.Open();
using (SqlDataAdapter da = new SqlDataAdapter(getOutput))
{
da.AcceptChangesDuringFill = false;//drugače da pokliče na koncu AcceptChanges in hasChanges je vedno false
da.Fill(exportData);
conn.Close();
da.Dispose();
try
{
if (exportData.HasChanges())
{
using (XLWorkbook xlWb = new XLWorkbook(XLEventTracking.Disabled))
{
xlWb.Worksheets.Add(exportData.Tables[0]);
xlWb.SaveAs(filePath.ToString() + fileName.ToString());
result = true;
}
}
}
finally
{
exportData.Dispose();
}
}
}
}
}
这里真正的解决方案是清理数据。尝试在返回数据的存储过程中执行此操作,我相信这是最好的方法。
如果无法做到这一点,您可能需要在 CLR 程序集中执行此操作:使用 SqlDataReader
而不是 SqlDataAdapter
,清理每个检索到的值,并逐个单元格添加这些值。