MySqlHelper未将查询参数推送到MySQL
我有一个WPF/.net4.5c#应用程序,我使用的是MySQL-netconnector 6.8.3。我试图在MySQL数据库中执行一个存储过程,它需要3个参数 下表如下: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`
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,而是在调用查询和参数数组中都使用它:)