2014-01-18 2 views
3

Я немного смущен параметрами MySQL.C# Параметры MySQL:? или @

Обе следующие части моего кода работают нормально. Первый из них использует параметры с @:

const string query = "UPDATE `items` SET `name` = @name, `price` = @price WHERE `id` = @id"; 
try 
{ 
    using (MySqlCommand cmd = new MySqlCommand(query, Database.MyConnection)) 
    { 
     cmd.Parameters.AddWithValue("name", name); 
     cmd.Parameters.AddWithValue("price", price); 
     cmd.Parameters.AddWithValue("id", id); 
     cmd.ExecuteNonQuery(); 
    } 
} 

Второй использует параметры с ?:

const string query = "UPDATE `items` SET `name` = ?name, `price` = ?price WHERE `id` = ?id"; 
try 
{ 
    using (MySqlCommand cmd = new MySqlCommand(query, Database.MyConnection)) 
    { 
     cmd.Parameters.AddWithValue("name", name); 
     cmd.Parameters.AddWithValue("price", price); 
     cmd.Parameters.AddWithValue("id", id); 
     cmd.ExecuteNonQuery(); 
    } 
} 

These answers говорят как @ или ? прекрасно работают. Даже cmd.Parameters.AddWithValue("@name", name);, похоже, работает (отметьте @ в названии).

  1. Почему все они отлично работают с MySQL?

  2. Есть ли разница между ними?

  3. Какой из них является правильным способом использования с MySQL?

Спасибо за любую помощь, которую я получу.

ответ

5

От documentation:

Предыдущие версии провайдера используется символ '@', чтобы отметить параметры в SQL. Это несовместимо с переменными пользователя MySQL, поэтому поставщик теперь использует '?' символ для нахождения параметров в SQL. Чтобы поддерживать старый код, вы можете установить «старый синтаксис = да» в строке подключения. Если вы это сделаете, помните, что исключение не будет выбрано, если вы не сможете определить параметр, который вы собираетесь использовать в своем SQL.

+0

Я думаю, что это отвечает на все вопросы от OP. '+ 1' и приятная находка. –

+0

+1 за отличный ответ. – analyticalpicasso

+1

Спасибо! Это окончательно отвечает на мои вопросы. +1 Хороший улов. –

1

Оказывается это снова

изменилось С обновленной документации Connector Options

Старый Синтаксис, OldSyntax, использование старого синтаксиса, UseOldSyntax - Эта опция была устаревшей в Connector/Net 5.2.2. Теперь все коды должны быть записаны с использованием символа «@» в качестве маркера параметра.

Кроме того, из Creating a Connector .Net

Используя символ «@» для параметров теперь предпочтительный подход, хотя старый шаблон использования «?» по-прежнему поддерживается. Чтобы избежать конфликтов при использовании символа «@» в сочетании с пользовательскими переменными, см. Параметр «Разрешить пользовательские переменные» в главе 7 «Справочные параметры строки соединителя/сетевого соединения». Параметр строки старого синтаксиса теперь устарел.

0

@ и? оба символа для обозначения параметров в MySQL, вы можете даже использовать его как ...

command.CommandText = @"UPDATE sellinginventorytable SET [email protected],`date`=CURRENT_TIMESTAMP(),`user`[email protected] WHERE cid=?cid; 
         INSERT INTO internaltranstable SET `type`='INV.ADJ.', `cid`=?cid, `cqty`[email protected], `date`=CURRENT_TIMESTAMP(), `notes`='STORE INVENTORY ADJUSTMENT', `area`='COUNTER', `sender`[email protected], `receiver`[email protected];"; 
command.Parameters.AddWithValue("?cid", row.Cells["barcode"].Value); 
command.Parameters.AddWithValue("@aqty", row.Cells["aqty"].Value); 
command.Parameters.AddWithValue("@user", Properties.Settings.Default.user.ToUpper()); 
command.ExecuteNonQuery(); 
command.Parameters.Clear(); 
Смежные вопросы