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#