Gross_Jiang 2019-04-02 02:39 采纳率: 0%
浏览 1106
已结题

C# 使用Mysql.Data 构造参数化查询,设置出参被设置为NULL报错

在C#中使用MySql.Data执行一个Insert语句,获取新增的自增主键。
使用的commandText如下:

INSERT T_Test_Table
(
        Name
)
VALUES 
(
        @Name -- Name - nvarchar(50)
);SET @Id = @@IDENTITY

该语句在Mysql中无论是用存储过程执行,还是直接输入参数执行,都不会报错;
在C#程序中。
设置参数化属性如下:

MySqlParameter mpName = new MySqlParameter("Name",MySqlDbType.Varchar,50,"Test");
mpName.Direction = ParameterDirection.Input;
MySqlParameter mpId = new MySqlParameter("Id",MySqlDbType.Int32);
mpId.Direction = ParameterDirection.OutPut;

代码执行后报错:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL = @@IDENTITY' at line 1

这里不知道为什么:
SET @Id = @@IDENTITY 中 @Id被替换为 NULL;
由于未写事务的缘故,查询数据库发现数据已新增成功。
这是什么问题?应该怎么解决?求解。

数据库结构如下:

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for t_test_table
-- ----------------------------
DROP TABLE IF EXISTS `t_test_table`;
CREATE TABLE `t_test_table` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=MyISAM AUTO_INCREMENT=73 DEFAULT CHARSET=utf8mb4;

附完整代码:

public static void Test()
        {
            try
            {
                string connetStr = "data source=127.0.0.1;database=Test; uid=root;pwd=root;Allow User Variables=True;";
                MySqlConnection conn = new MySqlConnection(connetStr);
                conn.Open();
                string sql =
                    @"INSERT T_Test_Table
                  (
                      Name
                  )
                  VALUES 
                  (
                      @Name -- Name - nvarchar(50)
                  );
                  SET @Id = @@IDENTITY";//在sql语句中定义parameter,然后再给parameter赋值
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                MySqlParameter mpName = new MySqlParameter("Name", MySqlDbType.VarChar, 50);                                
                mpName.Value = "Tests";
                mpName.Direction = ParameterDirection.Input;
                MySqlParameter mpId = new MySqlParameter("Id", MySqlDbType.Int32);
                mpId.Direction = ParameterDirection.Output;
                cmd.Parameters.Add(mpName);
                cmd.Parameters.Add(mpId);
                int iRes = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();                
                conn.Close();
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.ToString());                               
                throw new Exception("Mysql执行出错:\r\n" + ex.Message, ex);
            }

        }
  • 写回答

1条回答 默认 最新

  • weixin_42773422 2019-04-02 10:22
    关注

    此处CText在数据库中定义为允许为null值,但如果在C#参数化中直接插入null值会报错误,

    所以应该传入 DBNull.Value

    评论

报告相同问题?

悬赏问题

  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图