Странное поведение с SqlParameter - PullRequest
0 голосов
/ 28 сентября 2018

Использование .Net 4.5.2 У меня есть следующий пример кода ...

var cmd = new SqlCommand();
cmd.Parameters.Add(new SqlParameter("@CONTENTHYPERLINK", SqlDbType.VarChar, 50));
cmd.Parameters["@contentHyperlink"].Value = "hello world";

Третья ссылка вызывает IndexOutOfRangeException исключение

Но если я использую любой из следующего (который чисто меняет регистр имени параметра) это работает!

cmd.Parameters["@CONTENTHYPERLINK"].Value = "hello world";
cmd.Parameters["@contenthyperlink"].Value = "hello world";
cmd.Parameters["@contenTHYperlink"].Value = "hello world";

Если я использую любой из следующего, это не работа ...

cmd.Parameters["@contentHyperlink"].Value = "hello world";
cmd.Parameters["@contentHYPERLINK"].Value = "hello world";
cmd.Parameters["@CONTENtHYPERLINK"].Value = "hello world";

(И есть еще много примеров, которые работают и не работают, и я не буду здесь перечислять.)

Почемуна земле делает что-то, что должно быть без учета регистра, генерировать исключение в определенных случаях?

(я понимаю, что решение этой проблемы - использовать тот, который не вызывает исключения, но я хочу знать, почему это такпроисходит)


Обновление

После изменения кода для использования верхнего регистра, то же самое произошло с другим параметром sproc ...

cmd.Parameters["@PortalLastLogon"]  <-- Fails
cmd.Parameters["@portalLastlogon"]  <-- Fails

cmd.Parameters["@PORTALLASTLOGON"]  <-- Works
cmd.Parameters["@portallastlogon"]  <-- Works

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

Может Кто-нибудь Объясните, что происходит на земле?!

У меня есть программное обеспечение с более чем 2400 параметрами sproc ... Я не могу позволить себе время обновить их все!

1 Ответ

0 голосов
/ 08 октября 2018

Я выяснил, что причина этого заключается в том, что мы недавно представили код для обработки языковой культуры.

В части [Global].Application_BeginRequest моего веб-приложения ASP.Net я устанавливаю следующее...

var culture = new Globalization.CultureInfo(cultureCode);
Threading.Thread.CurrentThread.CurrentCulture = culture;
Threading.Thread.CurrentThread.CurrentUICulture = culture;

Конкретным языком, с которым я работаю, является валлийский (код cy) ... и должно быть что-то очень странное в проверке без учета регистра для этой культуры, что означает, чтоне соответствует.

В тот момент, когда я возвращаю его на английский, проблема исчезает.

В настоящее время у меня нет ответа на вопрос как ЯЯ собираюсь решить проблему, не обновляя каждый отдельный вызов sproc в верхний регистр ... но, по крайней мере, у меня есть причина , почему не удается.


Вхождение в Исходный код .Net показывает, что IndexOf использует как EntityUtil.SrcCompare, что делает прямое сравнение == ... но также EntityUtil.DstCompare, который делает культуру на основе Compare.

Так что, по крайней мере, у меня есть доказательство того, чтоКультура оказывает влияние.


Следующее продемонстрирует проблему (используя те же CompareOptions, что и EntityUtil.DstCompare) ...

using System.Threading;
using System.Globalization;

Thread.CurrentThread.CurrentCulture = new CultureInfo("en");
var enResult = CultureInfo.CurrentCulture.CompareInfo.Compare("lL", "LL",
    CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth | CompareOptions.IgnoreCase);
// enResult == 0 as expected

Thread.CurrentThread.CurrentCulture = new CultureInfo("cy");
var cyResult = System.CurrentCulture.CompareInfo.Compare("lL", "LL",
    CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth | CompareOptions.IgnoreCase);
// cyResult == -1 

Поскольку мне нужна системачтобы работать в соответствии с культурой, у меня нет выбора, кроме как написать скрипт для обновления всех Parameters[xxx], чтобы точно соответствовать случаю определения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...