2012-10-19 2 views
1

Я пишу функцию CLR для синтаксического анализа столбца таблицы и записи результатов в другую таблицу. Основным требованием является разбор колонны Detail, которая содержит часть Time и часть ID. Результатом будет разница во времени между двумя идентификаторами.Ошибка при вызове функции SQL CLR

Пример: Time1, Id1; Time2, Id2; Time3, Id3 ... и т. Д. Time2-Time1 - время, затраченное на Id1 в секундах.

Такая же функция работает в обычном консольном приложении, но функция CLR бросает исключение, когда я вызываю его с SQL-сервера. Ошибка произошла

.NET Framework ошибка во время выполнения определяемой пользователем подпрограммы или статистической «Function1»: System.Security.HostProtectionException: Попытка выполнить операцию, которая была запрещена хост CLR. Защищенные ресурсы (только с полным доверием) были: Все Требуемые ресурсы были: UI System.Security.HostProtectionException: в UserDefinedFunctions.Function1 (String, String MSISDN promptdetails)

Мой код: SqlConnection conn = новый 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

'Console.WriteLine (« Ошибка .. »);' вероятно, вызывает это. В SQL нет консоли. – leppie

+0

@leppie: Спасибо, ты прав. Теперь не исключение :), но не в состоянии вставить в таблицу. –

ответ

0

Вам просто нужно будет заменить вашу линию

Console.WriteLine ("Ошибка ...");

с этой линией:

SqlContext.Pipe.Send ("Ошибка ...");

Это будет делать то же самое для вас, и он будет работать

Смежные вопросы