Проблема с вызовом ХП в MySQL
От: MozgC США http://nightcoder.livejournal.com
Дата: 14.05.09 20:22
Оценка:
Добрый день,
Наткнулся на такую проблемку:
При выполнении ХП с использованием 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() сравнивать имена параметров без учета префикса.

Что думаете?
mysql parameter deriveparameters createspparameters
Re: Проблема с вызовом ХП в MySQL
От: ili Россия  
Дата: 15.05.09 01:45
Оценка:
Здравствуйте, MozgC, Вы писали:

MC>Добрый день,

MC>Наткнулся на такую проблемку:
MC>При выполнении ХП с использованием MySqlDataProvider получается косячок с установкой значений параметров. Дело в том что при использовании ХП сначала идет запрос к БД чтобы получить параметры ХП.

MC>Что думаете?


эт все от стремления быть похоим на MS
попробуйте 747 ревизию, я там провайдер малеха поправил, должно помочь
Re[2]: Проблема с вызовом ХП в MySQL
От: MozgC США http://nightcoder.livejournal.com
Дата: 15.05.09 09:12
Оценка:
Здравствуйте, ili, Вы писали:

ili>эт все от стремления быть похоим на MS

ili>попробуйте 747 ревизию, я там провайдер малеха поправил, должно помочь

Не помогает. Тест может быть таким:
dbManager.SetSpCommand("MyStoredProcedure", db.Parameter("?MyParameter", myParameterValue)).ExecuteNonQuery();
// или таким:
dbManager.SetSpCommand("MyStoredProcedure", db.CreateParameters(myEntityObject)).ExecuteNonQuery();
Re[2]: Проблема с вызовом ХП в MySQL
От: MozgC США http://nightcoder.livejournal.com
Дата: 15.05.09 23:32
Оценка:
Не нужно ли в функции DbManager.CreateSpParameters() в строке
if (string.Compare(name, p.ParameterName, true) == 0)

Вызывать DataProvider.Convert(..., ConvertType.ParameterToName), т.е. грубо говоря так:
if (string.Compare(
  _dataProvider.Convert(name, ConvertType.ParameterToName).ToString(),
  _dataProvider.Convert(p.ParameterName, ConvertType.ParameterToName).ToString(), true) == 0)

?
Re: Проблема с вызовом ХП в MySQL
От: ili Россия  
Дата: 16.05.09 09:50
Оценка: 14 (1)
Здравствуйте, MozgC, Вы писали:

MC>Что думаете?


как выяснилось, не столь важно что думаем мы, сколь выжно, что думает MySql Team:

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, { }

749 ревизия
Re[2]: Проблема с вызовом ХП в MySQL
От: MozgC США http://nightcoder.livejournal.com
Дата: 16.05.09 10:54
Оценка:
Здравствуйте, ili, Вы писали:

ili>749 ревизия


А где скачать?
Re[3]: Проблема с вызовом ХП в MySQL
От: Clerk  
Дата: 17.05.09 09:25
Оценка: 7 (1)
Здравствуйте, MozgC, Вы писали:

MC>А где скачать?

svn co http://bl-toolkit.googlecode.com/svn/
... << RSDN@Home 1.2.0 alpha 4 rev. 1218>>
Re[4]: Проблема с вызовом ХП в MySQL
От: MozgC США http://nightcoder.livejournal.com
Дата: 17.05.09 10:07
Оценка:
Здравствуйте, Clerk, Вы писали:

C>svn co http://bl-toolkit.googlecode.com/svn/

Спасибо.

Я слеповат или этой ссылки нигде в основных страницах о проекте нету? Т.е. как люди должны найти этот репозиторий?
Re[5]: Проблема с вызовом ХП в MySQL
От: ili Россия  
Дата: 17.05.09 10:48
Оценка:
Здравствуйте, MozgC, Вы писали:

MC>Я слеповат или этой ссылки нигде в основных страницах о проекте нету? Т.е. как люди должны найти этот репозиторий?


логично... добавил на главную страницу wiki
Re[2]: Проблема с вызовом ХП в MySQL
От: MozgC США http://nightcoder.livejournal.com
Дата: 17.05.09 11:44
Оценка:
Здравствуйте, ili, Вы писали:

ili>749 ревизия


Спасибо, пару тестиков прогнал, вроде все ок.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.