调用SQL CLR函数时出错

时间:2012-10-19 07:35:38

标签: c# sql-server sqlclr

我正在编写一个CLR函数来解析表列并将结果写入另一个表。基本要求是解析Detail列,其中包含Time部分和ID部分。结果将是两个Ids之间的时差。

Ex:Time1,Id1; Time2,Id2; Time3,Id3 ......等等 Time2-Time1是Id1所用的时间,单位为秒。

相同的功能在普通的控制台应用程序中工作,但是当我从SQL服务器调用它时,CLR函数抛出异常。 错误是

在执行用户定义的例程或聚合“Function1”期间发生.NET Framework错误: System.Security.HostProtectionException:尝试执行CLR主机禁止的操作。 受保护的资源(仅在完全信任的情况下可用)是:全部 需求的资源是:UI System.Security.HostProtectionException:    at UserDefinedFunctions.Function1(String msisdn,String promptdetails)

我的代码是:     SqlConnection conn = new SqlConnection();         SqlCommand cmd = new SqlCommand();

    int count = 0;
    string PromptPart = string.Empty;
    string PrevPromptPart = string.Empty;
    DateTime TimePart;
    TimePart = new DateTime();
    DateTime PrevTimePart;
    PrevTimePart = new DateTime();
    TimeSpan difference;

    try
    {
        count++;
        conn.ConnectionString = "Context Connection=true";
        cmd.Connection = conn;

        String[] string1 = promptdetails.Split(";".ToCharArray());
        foreach (var item1 in string1)
        {
            count++;
            String[] string2 = item1.Split(",".ToCharArray());
            PromptPart = string2[1];
            TimePart = DateTime.ParseExact(string2[0], "M/d/yyyy h:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture);
            if (count > 1)
            {
                StringBuilder sbQuery = new StringBuilder(1024);
                sbQuery.Append("INSERT INTO [Shami].[DBO].[data] (MSISDN,PromptID1,PromptID2,TimeDifference) VALUES");
                sbQuery.Append("('");
                sbQuery.Append(msisdn);
                sbQuery.Append("',");
                difference = TimePart.Subtract(PrevTimePart);
                sbQuery.Append("'");
                sbQuery.Append(PrevPromptPart);
                sbQuery.Append("','");
                sbQuery.Append(PromptPart);
                sbQuery.Append("',");
                sbQuery.Append(difference.Seconds);
                sbQuery.Append(")");
                string sub = string.Empty;
                sub = sbQuery.ToString();
                try
                {
                    conn.Open();
                    cmd = new SqlCommand(sub);
                    SqlContext.Pipe.ExecuteAndSend(cmd);
                }
                catch (Exception ie)
                {
                    Console.WriteLine("Error..");
                }
            }
            if (count <= 1)
            {
                StringBuilder sbQuery = new StringBuilder(1024);
                sbQuery.Append("INSERT INTO [Shami].[DBO].[data] (MSISDN,PromptID1,PromptID2,TimeDifference) VALUES");
                sbQuery.Append("('");
                sbQuery.Append(msisdn);
                sbQuery.Append("',");
                sbQuery.Append("'_'");
                sbQuery.Append(",");
                sbQuery.Append(PromptPart);
                sbQuery.Append(",");
                sbQuery.Append("'0'");
                sbQuery.Append(")");
                string sub = string.Empty;
                sub = sbQuery.ToString();
                try
                {
                    conn.Open();
                    cmd = new SqlCommand(sub);
                    SqlContext.Pipe.ExecuteAndSend(cmd);
                }
                catch (Exception ie)
                {
                    Console.WriteLine("Error..");
                }
            }
            PrevPromptPart = PromptPart;
            PrevTimePart = TimePart;
        }



    }
    catch (Exception)
    { ;}
    finally
    {
        conn.Close();
        conn.Dispose();
        cmd.Dispose();
    }
    return msisdn;

请让我知道我哪里出错了。我无法在CLR中调试。

1 个答案:

答案 0 :(得分:0)

您只需更换行

即可

Console.WriteLine( “错误...”);

这一行:

SqlContext.Pipe.Send( “错误...”);

这将为您做同样的事情,它将运行