无效字符

时间:2013-02-04 15:48:39

标签: c# sql clr

我正在为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();
                    }
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

这里的真正解决方案是清理数据。尝试在返回数据的存储过程中执行此操作,我相信这是最好的方法。

如果不可能,您可能希望在CLR程序集内部执行此操作:使用SqlDataReader而不是SqlDataAdapter,清理每个检索到的值并逐个单元格添加这些值。