博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySql.Data.MySqlClient.MySqlException: Parameter ‘@maxid’ must be defined
阅读量:5010 次
发布时间:2019-06-12

本文共 2292 字,大约阅读时间需要 7 分钟。

本文涉及到的mysql知识点:

  • mysql中的if条件语句用法: IF(expr1,expr2,expr3)
  • mysql使用变量(mysql中变量不用事前申明
  • mysql事务
  • testcase

为了测试mysql事务,写了个testcase,

using Microsoft.VisualStudio.TestTools.UnitTesting;using MySql.Data.MySqlClient;using System;using System.Collections.Generic;using System.Data;[TestClass]public class MySqlTransactionTest{       [TestMethod]        public void AddStudent()        {            string sql = @"BEGIN;SELECT @maxid:= MAX(id) FROM student;SET @maxid:=IF(@maxid IS NULL,0,@maxid);INSERT student VALUES(@maxid+1,'');COMMIT;";            ExecuteNonQuery(sql);        }        string Connstring = "server=192.168.40.223;user id=yimei;password=password;database=test;Character Set=utf8;";        private int ExecuteNonQuery(string sql)        {            MySqlConnection conn = new MySqlConnection(Connstring);            MySqlCommand cmd = new MySqlCommand(sql, conn);            cmd.CommandType = CommandType.Text;            conn.Open();            int i = cmd.ExecuteNonQuery();            conn.Close();            //Console.WriteLine("ExecuteNonQuery:{0}", i);            return i;        }}

运行testcase,发现报如下异常:MySql.Data.MySqlClient.MySqlException: Parameter ‘@maxid’ must be defined

 

看来,是ado.net把@maxid当成了一个变量,要求必须传递@maxId参数。 当然,这违背了我的初衷——我的sql逻辑是在新增student时将其id字段值设置为现有最大id+1,我本来只是希望它把我这段sql执行一下即可。

和一个哥们讨论了一下,他说如果ado.net连接的是SqlServer,这种情况是没有问题的,我将信将疑。不过,经过测试,还真是如此。 

那么,mysql怎么就会报异常呢?

我的mysql版本是(命令SELECT @@VERSION;):5.5.50-MariaDB。网上了解了一下,要在连接串里显示的加一个Allow User Variables=True,才能允许sql里有用户自定义变量的出现(见老外的博客http://blog.tjitjing.com/index.php/2009/05/mysqldatamysqlclientmysqlexception-parameter-id-must-be-defined.html)。

附ado.net连接SqlServer场景用例:

using System.Data.SqlClient;         [TestMethod]        public void MsSqlAt()        {            string sqlConnstring = "server=192.168.10.27;user id=sa;password=En7Jw5Xh;database=sms;";            string sql = @"declare @num int;SELECT @num=count(1) from T_sms_send;select @num;";             using (SqlConnection conn = new SqlConnection(sqlConnstring))            {                SqlCommand cmd = new SqlCommand(sql, conn);                conn.Open();                var obj = cmd.ExecuteScalar();                conn.Close();                Console.WriteLine(obj);            }        }

 

转载于:https://www.cnblogs.com/buguge/p/5974457.html

你可能感兴趣的文章
android adb常用指令
查看>>
Android框架之路——GreenDao3.2.2的使用
查看>>
类方法WCF学习笔记-KnowTypeAttribute用法
查看>>
平台程序微信平台开发应用的签名
查看>>
程序卡OK6410裸板更新程序_update
查看>>
MYSQL用户名:root
查看>>
JavaScript 开发规范要求
查看>>
Devstack 安装OpenStack Pike版本(单机环境)
查看>>
Javascript 函数初探
查看>>
类的定义、声明使用
查看>>
转载,gini系数代码对应的公式
查看>>
编译安装mysql-5.6.40
查看>>
年终总结
查看>>
初创互联网公司技术架构变迁之路
查看>>
【BZOJ 3676】 3676: [Apio2014]回文串 (SAM+Manacher+倍增)
查看>>
【网络流24题】No. 13 星际转移问题 (网络判定 最大流)
查看>>
解析$.grep()源码及透过$.grep()看(两次取反)!!的作用
查看>>
[模板] 字符串hash
查看>>
SGU438_The Glorious Karlutka River =)
查看>>
Linux集群及LVS简介
查看>>