zoukankan      html  css  js  c++  java
  • MySql.Data.MySqlClient.MySqlException: Parameter ‘@maxid’ must be defined

    本文涉及到的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); } }
  • 相关阅读:
    JavaScript String常用方法和属性
    JavaScript null 和 undefined
    document.write()
    MyBatis中的@MapKey注解
    Zookeeper实现分布式锁
    zookeeper相关
    二阶段提交和三阶段提交
    代理模式
    模板方法模式
    策略模式
  • 原文地址:https://www.cnblogs.com/buguge/p/5974457.html
Copyright © 2011-2022 走看看