Добрый день,
Наткнулся на такую проблемку:
При выполнении ХП с использованием MySqlDataProvider получается косячок с установкой значений параметров. Дело в том что при использовании ХП сначала идет запрос к БД чтобы получить параметры ХП. Далее происходит такой цикл:
for (int i = 0; i < commandParameters.Length; i++)
{
IDbDataParameter param = commandParameters[i];
string name = param.ParameterName;
bool found = false;
foreach (IDbDataParameter p in parameterValues)
{
if (string.Compare(name, p.ParameterName, true) == 0)
{
...
}
Т.е. сравниваются имена параметров, полученных запросом из БД, с именами заданных параметров. Но дело в том, что в в MySQL параметры задаются префиксом "?", т.е. задаем мы их типа так db.Parameter("?Message", "blablabla"), но имена параметров полученных из MySqlCommandBuilder.DeriveParameters() начинаются с префикса "@". Поэтому при сравнении имен параметров считается что они разные и значения не задаются. В результате ХП вызывается со значением параметров — null.
Надеюсь, что объяснил более менее понятно.
Я могу чего-то не знать, но склоняюсь что это ошибка в MySqlCommandBuilder.DeriveParameters() — думаю что префикс должен использоваться "?", либо выбираться в зависимости от настроек заданных в connection string (вроде у mysql там есть параметр который отвечает за выбор префикса).
Поэтому видимо надо сообщать о баге в MySQL, либо может быть в DbManager.CreateSpParameters() сравнивать имена параметров без учета префикса.
Здравствуйте, MozgC, Вы писали:
MC>Добрый день, MC>Наткнулся на такую проблемку: MC>При выполнении ХП с использованием MySqlDataProvider получается косячок с установкой значений параметров. Дело в том что при использовании ХП сначала идет запрос к БД чтобы получить параметры ХП.
MC>Что думаете?
эт все от стремления быть похоим на MS
попробуйте 747 ревизию, я там провайдер малеха поправил, должно помочь
Note
Using the '@' symbol for parameters is now the preferred approach although the old pattern of using '?' is still supported.
Please be aware however that using '@' can cause conflicts when user variables are also used. To help with this situation please see the documentation on the Allow User Variables connection string option, which can be found here: Section 20.2.4.3, “Creating a Connection String”. The Old Syntax connection string option has now been deprecated.
но, поскольку, пил у нас никто не забирал... таперачи MySqlDataProvider ведет себя хитро...
есть у него такие параметры: ParameterPrefix - префикс параметра (?/@) TryConvertParameterName - задает, пытаться ли конвертить имена параметров из одного стиля, в другой... ConvertParameterPrefixies - префиксы, которые конвертятся в основной (может я чего путаю, но, вроде, мускульный провайдер поддерживает не только ? & @ в качестве префиксов....)
доступны 2 нелпер-метода, устанавливающие эти параметры:
MySqlDataProvider.ConfigureOldStyle() — это ?, true, { '@' } — используется по умолчанию
MySqlDataProvider.ConfigureТуцStyle() — это ?, false, { }