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); } }
  • 相关阅读:
    进制
    流程控制
    运算符
    格式化输出
    数据结构-树的遍历
    A1004 Counting Leaves (30分)
    A1106 Lowest Price in Supply Chain (25分)
    A1094 The Largest Generation (25分)
    A1090 Highest Price in Supply Chain (25分)
    A1079 Total Sales of Supply Chain (25分)
  • 原文地址:https://www.cnblogs.com/buguge/p/5974457.html
Copyright © 2011-2022 走看看