MySqlHelper未将查询参数推送到MySQL

MySqlHelper未将查询参数推送到MySQL,mysql,.net,query-parameters,Mysql,.net,Query Parameters,我有一个WPF/.net4.5c#应用程序,我使用的是MySQL-netconnector 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`

我有一个WPF/.net4.5c#应用程序,我使用的是MySQL-netconnector 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
存储的过程如下所示:

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#代码:

但我得到了以下错误:

"Column 'name' cannot be null"
我已将列
name
设置为非空列。因此,似乎没有将参数值发送到存储过程。实际上,如果我从
name
列中删除NOTNULL限制,查询将执行,但所有四列都为NULL


我不知道我错在哪里。有什么想法吗?谢谢…

我尝试了一个与您的代码类似的代码,经过一些小改动后,它可以正常工作

首先,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
现在对SP的调用如下所示

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语句中,参数名称和占位符必须使用相同的名称,但不带前缀。相反,C#code

中似乎需要
@前缀
,现在无法进行测试,因此我不将此作为答案,但我认为您应该使用
MySqlHelper.ExecuteNonQuery(connstring,“call storedProc1(姓名、姓氏、年龄)”,参数)让我知道它是否有效谢谢Steve。我试过了,但是后来我得到了这个错误:“字段列表中的未知列‘name’”。我也试过:调用storedProc1(@name,@name,@age)”,参数);也就是说,将@放在参数前面,但它再次给我同样的错误:“列‘name’不能为null“:/我可以问一下为什么需要使用MySqlHelper类而不是常规的MySqlCommand吗?”?。回顾我的例子,我似乎遗漏了字符串末尾的分号(
callstoreproc1(姓名、姓氏、年龄);"
尝试使用分号,运气不好。我一直使用MySqlCommand,但我想尝试MySqlHelper进行更改,原因有两个:1.我在MySQL网站上读到,MySqlHelper现在是推荐/首选的使用技术;2.我感觉使用标准MySqlConnection和MySqlCommand进行连接池的工作不好-如果我打开并反复关闭连接,而不是在幕后保持连接打开以提高性能,我注意到它实际上每次都打开和关闭连接。我想看看连接池是否在MySqlHelper上工作得更好。我感到惊讶的是,我找不到一个使用MySqlHelper的示例(带参数)在网络上任何地方都可以使用.Net语言!!!您的SP似乎在定义参数时没有
@
前缀,但尝试将其与
@
前缀一起使用。在上面的我的代码中执行相同操作,并获得错误
用户名不能为null
。请删除sql INSERT语句中的
@
前缀谢谢Steve-让我这样做告诉你,我尝试了@prefix的所有可能组合——在插入查询中,在调用方法中,在参数数组中……最终,正如你所建议的,正确的组合是在创建过程中不使用@prefix,而是在调用查询和参数数组中都使用它:)