无效字符

本文关键字:字符 无效 | 更新日期: 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 ,清理每个检索到的值,并逐个单元格添加这些值。