MySqlHelper не проталкивает параметры запроса в MySQL

У меня есть приложение WPF/.Net 4.5 C#, и я использую MySQL NET Connector 6.8.3. Я пытаюсь выполнить хранимый процесс в базе данных MySQL, который ожидает 3 параметра.

Таблица выглядит следующим образом:

CREATE TABLE `geofences` (
  `id_geofences` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `description` varchar(255) DEFAULT NULL,
  `type_id` int(11) NOT NULL,
  `shape_id` int(11) NOT NULL,
  PRIMARY KEY (`id_geofences`),
  UNIQUE KEY `id_geofences_UNIQUE` (`id_geofences`),
  UNIQUE KEY `name_UNIQUE` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Сохраненный процесс выглядит следующим образом:

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_geofence`(geofenceName VARCHAR(45), geofenceDescription VARCHAR(255), typeId INT, shapeId INT)
BEGIN
    INSERT INTO geofences (`name`, `description`, `type_id`, `shape_id`) VALUES (@geofenceName, @geofenceDescription, @typeId, @shapeId);
END

Это мой код C#:

string sql = "call insert_geofence (@geofenceName, @geofenceDescription, @typeId, @shapeId);";
MySqlParameter[] parameters = new MySqlParameter[4];
parameters[0] = new MySqlParameter("@geofenceName", "test name");
parameters[1] = new MySqlParameter("@geofenceDescription", "test description");
parameters[2] = new MySqlParameter("@typeId", 1);
parameters[3] = new MySqlParameter("@shapeId", 2);

MySql.Data.MySqlClient.MySqlHelper.ExecuteNonQuery(ConnectionString, sql, parameters);

Но я получаю следующую ошибку:

"Column 'name' cannot be null"

Я сделал колонку name столбец NOT NULL. Таким образом, кажется, что значения параметров не передаются в хранимую процедуру. Действительно, если я уберу ограничение NOT NULL из name столбец, запрос выполняется, но все четыре столбца имеют значение NULL.

Я не могу понять, где я иду не так. Есть идеи? Спасибо...

1 ответ

Решение

Я пробовал код, похожий на ваш, и он работает, как и ожидалось, после некоторых небольших изменений

Сначала SP выглядит так:

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_test`(n varchar(10), f varchar(255))
BEGIN
    INSERT INTO filename (username, file) VALUES (n, f);
END

Теперь звонок в ИП такой

string conn = "Server=localhost;Database=test;Uid=root;Pwd=root;Port=3306";
string cmdText = "call sp_test(@n, @f);";
MySqlParameter[] parameters = new MySqlParameter[2];
parameters[0] = new MySqlParameter("@n", "steve");
parameters[1] = new MySqlParameter("@f", @"d:\temp\test.txt");
MySql.Data.MySqlClient.MySqlHelper.ExecuteNonQuery(conn, cmdText, parameters);

Важно, чтобы вы использовали одно и то же имя без префикса для имени параметров и для заполнителей в выражении Sql. Вместо этого кажется, что @ prefix требуется в коде C#

Другие вопросы по тегам