MySqlHelper没有将查询参数推送到MySQL

时间:2014-09-10 20:26:47

标签: mysql .net query-parameters

我有一个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列。因此,看起来参数的值不会被发送到存储过程。实际上,如果我从name列中删除NOT NULL限制,则执行查询,但所有四列都为NULL。

我无法弄清楚我哪里出错了。有任何想法吗?感谢...

1 个答案:

答案 0 :(得分:0)

我已经尝试过类似的代码,并且经过一些小的改动后它可以正常工作

首先,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#代码中需要@ prefix