У меня есть приложение на C #, в котором возникают проблемы с использованием подготовленного оператора с ON DUPLICATE KEY UPDATE в MySQL.
Когда я проверяю переменные соединения в точке останова непосредственно перед mypcmd.ExecuteNonQuery();
, mypcmd.IsPrepared
равно false
.
Запрос ничего не делает (он должен обновиться, так как первичный ключ уже существует), и не выдается никаких исключений. mypcmd.Parameters.count = 25
как должно быть, и значения верны, если я углублюсь в представление данных.
Когда запрос выполняется, ключ 0 обновляется для всех имен параметров (например, f.fname:? Fname, middlename:? Middlename и т. Д. Вместо точных значений)
- Версия MySQL Server: 5.0.51a-24 + lenny5
- Версия сборки MySQL c # (mysql.data.dll) 6.3.6.0
- Приложение - WPF .NET 4.0
Код выглядит следующим образом:
const string sqlIpatients = @"
INSERT INTO `tblpatients` ( `number`,`fname`,`middlename`,`surname`,
`title`,`contactno`,`mobileno`,`sex`,`dob`,
`housename`,`houseno`,`address1`,`address2`,
`address3`,`address4`,`postcode`,`notes`,`home`,
`sp1`,`sp2`,`sp3`,`sp4`,`sp5`,`sp6`,`email`)
VALUES( '?number','?fname','?middlename','?surname',
'?title','?contactno','?mobileno','?sex','?dob',
'?housename','?houseno','?address1','?address2',
'?address3','?address4','?postcode','?notes','?home',
'?sp1','?sp2','?sp3','?sp4','?sp5','?sp6','?email')
ON DUPLICATE KEY UPDATE `number`=VALUES(`number`), `fname`=VALUES(`fname`), `middlename`=VALUES(`middlename`), `surname`=VALUES(`surname`),
`title`=VALUES(`title`), `contactno`=VALUES(`contactno`), `mobileno`=VALUES(`mobileno`), `sex`=VALUES(`sex`), `dob`=VALUES(`dob`),
`housename`=VALUES(`housename`), `houseno`=VALUES(`houseno`), `address1`=VALUES(`address1`), `address2`=VALUES(`address2`),
`address3`=VALUES(`address3`), `address4`=VALUES(`address4`), `postcode`=VALUES(`postcode`), `notes`=VALUES(`notes`), `home`=VALUES(`home`),
`sp1`=VALUES(`sp1`), `sp2`=VALUES(`sp2`), `sp3`=VALUES(`sp3`), `sp4`=VALUES(`sp4`), `sp5`=VALUES(`sp5`), `sp6`=VALUES(`sp6`), `email`=VALUES(`email`)";
...
MySqlCommand mypcmd = new MySqlCommand(sqlIpatients, myConn2);
mypcmd.Prepare();
mypcmd.Parameters.Add("?number", MySqlDbType.UInt32);
mypcmd.Parameters.Add("?fname", MySqlDbType.VarChar, 20);
mypcmd.Parameters.Add("?middlename", MySqlDbType.VarChar, 20);
mypcmd.Parameters.Add("?surname", MySqlDbType.VarChar, 40);
mypcmd.Parameters.Add("?title", MySqlDbType.VarChar, 6);
mypcmd.Parameters.Add("?contactno", MySqlDbType.VarChar, 40);
mypcmd.Parameters.Add("?mobileno", MySqlDbType.VarChar, 40);
mypcmd.Parameters.Add("?sex", MySqlDbType.VarChar, 1);
mypcmd.Parameters.Add("?dob", MySqlDbType.Date);
mypcmd.Parameters.Add("?housename", MySqlDbType.VarChar, 20);
mypcmd.Parameters.Add("?houseno", MySqlDbType.VarChar, 20);
mypcmd.Parameters.Add("?address1", MySqlDbType.TinyText);
mypcmd.Parameters.Add("?address2", MySqlDbType.TinyText);
mypcmd.Parameters.Add("?address3", MySqlDbType.TinyText);
mypcmd.Parameters.Add("?address4", MySqlDbType.TinyText);
mypcmd.Parameters.Add("?postcode", MySqlDbType.TinyText);
mypcmd.Parameters.Add("?notes", MySqlDbType.Text);
mypcmd.Parameters.Add("?home", MySqlDbType.UInt16);
mypcmd.Parameters.Add("?sp1", MySqlDbType.VarChar, 1);
mypcmd.Parameters.Add("?sp2", MySqlDbType.VarChar, 1);
mypcmd.Parameters.Add("?sp3", MySqlDbType.VarChar, 1);
mypcmd.Parameters.Add("?sp4", MySqlDbType.VarChar, 1);
mypcmd.Parameters.Add("?sp5", MySqlDbType.VarChar, 1);
mypcmd.Parameters.Add("?sp6", MySqlDbType.VarChar, 1);
mypcmd.Parameters.Add("?email", MySqlDbType.Text);
var prodr = procmd.ExecuteReader();
while (prodr.Read())
{
foreach (MySqlParameter p in mypcmd.Parameters)
{
p.Value = prodr[p.ParameterName.Replace("?", "")].ToString().Trim();
}
}
mypcmd.ExecuteNonQuery();
Что мне не хватает? Пожалуйста, помогите!