我正在为sql server创建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();
}
}
}
}
}
答案 0 :(得分:0)
这里的真正解决方案是清理数据。尝试在返回数据的存储过程中执行此操作,我相信这是最好的方法。
如果不可能,您可能希望在CLR程序集内部执行此操作:使用SqlDataReader
而不是SqlDataAdapter
,清理每个检索到的值并逐个单元格添加这些值。