Я пишу функцию 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.
Одно места вы собираетесь неправильно (возможно, непосредственно не связанные с текущей ошибкой) строят запросы, используя строку строитель. Вы должны использовать параметры –
'Console.WriteLine (« Ошибка .. »);' вероятно, вызывает это. В SQL нет консоли. – leppie
@leppie: Спасибо, ты прав. Теперь не исключение :), но не в состоянии вставить в таблицу. –