ExecuteScalar
Ошибка
An unhandled exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in MySql.Data.dll
Additional information: Fatal error encountered during command execution.
в следующем коде
MySqlConnection connect = new MySqlConnection(Params.connStr);
connect.Open();
MySqlCommand comm = connect.CreateCommand();
comm.CommandText = "select count(*) from results where compdiscid=@cdid and memid=@mem";
comm.Parameters.Add("@cdid", MySqlDbType.Int32).Value = ((Para)cbDisciplineResult.SelectedItem).ID;
comm.Parameters.Add("@memid", MySqlDbType.Int32).Value = currentID;
object result = comm.ExecuteScalar(); //место ошибки
int cnt = 0; ;
if (result != null)
{
cnt = Convert.ToInt32(result);
}
причем если параметры занести в sql запрос напрямую то проблемы не будут
пример comm.CommandText = "select count(*) from results where compdiscid=" + ((Para)cbDisciplineResult.SelectedItem).ID + " and memid=" + currentID;
Хотел разобраться в чем дело, потому как переписывать таким способом все запросы накладно будет.
Хотел разобраться в чем дело, потому как переписывать таким способом все запросы накладно будет.
Подозреваю, что дело в @cdid и @mem. У мускуля иные префиксы параметров. Попробуйте ? и $.
Хотел разобраться в чем дело, потому как переписывать таким способом все запросы накладно будет.
Это не только накладно, а еще и опасно - прямая дорога к Sql Injection и непонятным ошибкам маршаллинга данных.
пример из документации к драйверу
string connStr = "server=localhost;user=root;database=world;port=3306;password=******;";
MySqlConnection conn = new MySqlConnection(connStr);
try
{
Console.WriteLine("Connecting to MySQL...");
conn.Open();
string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent=@Continent";
MySqlCommand cmd = new MySqlCommand(sql, conn);
Console.WriteLine("Enter a continent e.g. 'North America', 'Europe': ");
string user_input = Console.ReadLine();
MySqlParameter param = new MySqlParameter();
param.ParameterName = "@Continent";
param.Value = user_input;
cmd.Parameters.Add(param);
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Console.WriteLine(rdr["Name"]+" --- "+rdr["HeadOfState"]);
}
conn.Close();
то есть префиксы такие должны быть
//comm.Parameters.Add("@cdid", ((Para)cbDisciplineResult.SelectedItem).ID);
//comm.Parameters.Add("@memid", currentID);
//comm.Parameters.AddWithValue("@cdid", ((Para)cbDisciplineResult.SelectedItem).ID);
//comm.Parameters.AddWithValue("@memid", currentID);
пробовал следующее
результат тотже
а если вот так, то работает
MySqlParameter param = new MySqlParameter();
param.ParameterName = "@cdid";
param.Value = ((Para)cbDisciplineResult.SelectedItem).ID;
MySqlParameter param1 = new MySqlParameter();
param1.ParameterName = "@mem";
param1.Value = currentID;
try to use latest mysql connector this may solve your problem as well...
может и баг
хотя еще пишут, что можно попробовать добавить "allow user variables=true" в connectionString
а почему выбрали именно MySQL для миграции?
хотя еще пишут, что можно попробовать добавить "allow user variables=true" в connectionString
а почему выбрали именно MySQL для миграции?
Это желание заказчика, хотя можно было бы использовать бесплатную версию MS SQLSrerver она бы им подошла я думаю.
хотя еще пишут, что можно попробовать добавить "allow user variables=true" в connectionString
а почему выбрали именно MySQL для миграции?
"allow user variables=true" решил проблему, код прошел. Надеюсь далее тоже без проблем проскочит. Спасибо.
А где вы нашли эту инфу, и на что именно влияет allow user variables=true? Интересно просто в чем именно проблема.
Учитывая тот факт что параметры всетаки можно задействовать и без директивы, только очень длинно получается. Вариант описан выше.