小弟在做一个数据录入时遇到了一个奇怪的问题,在sql manager 2007 for mysql中运行一段存储过程能够正常运行,但是一但在c#中调用就报System.Exception: ERROR [23000] 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 ''AddMembers'' at line 1using System.Collections;  //这个是封装odbc的类
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.Odbc;
using System;
public class MyWDABase : IDisposable
{
    public string MySQLODBC;
    public string MySQLODBCClStr;
    public OdbcConnection MySQLODBCConnectionStr;
    public OdbcCommand MySQLODBCCommand;
    public OdbcDataAdapter MySQLODBCDataAdapter;
    public OdbcDataReader MySQLODBCDataReader;
    public string MyConString = "Dsn=MyConnect;uid=root;pwd=abcd1234a/";
    public string MySevers = "SERVER\\SERVER";
    public string MyDBMS = "dnt2";
    public string MyLogin = "sa";
    public string MyPW = "abcd1234a/";
    public string MySQLTestConStr;    // 检测冗余的调用 
    private bool disposedValue = false;    // IDisposable 
    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposedValue)
        {
            if (disposing)
            {
                // TODO: 显式调用时释放非托管资源 
                if ((MySQLODBCConnectionStr != null))
                {
                    MySQLODBCConnectionStr.Close();
                    MySQLODBCConnectionStr.Dispose();
                    MySQLODBCConnectionStr = null;
                }
                if ((MySQLODBCDataReader != null))
                {
                    MySQLODBCDataReader.Close();
                    MySQLODBCDataReader = null;
                }
                if ((MySQLODBCDataAdapter != null))
                {
                    MySQLODBCDataAdapter.Dispose();
                    MySQLODBCDataAdapter = null;
                }
                if ((MySQLODBCCommand != null))
                {
                    MySQLODBCCommand.Dispose();
                    MySQLODBCCommand = null;
                }
            }
            // TODO: 释放共享的非托管资源 
        }
        this.disposedValue = true;
    }
    public MyWDABase()
    {
        MySQLTestConStr = MyConString;
        MySQLODBCConnectionStr = new OdbcConnection(MySQLTestConStr);
    }
   
  

解决方案 »

  1.   


      public void MySQLODBCOpenConnection()
        {
            try
            {
                MySQLODBCConnectionStr.Open();
            }        catch (System.Exception OleDBExceptionErr)
            {
                throw new System.Exception(OleDBExceptionErr.Message, OleDBExceptionErr.InnerException);
            }
        }
        public void MySQLODBCCloseConnection()
        {
            MySQLODBCConnectionStr.Close();
        }
        public void InitializeMySQLODBCCommand()
        {
            if (MySQLODBCCommand == null)
            {
                try
                {
                    MySQLODBCCommand = new OdbcCommand(MySQLODBC, MySQLODBCConnectionStr);
                    if (!MySQLODBC.ToUpper().StartsWith("SELECT") & !MySQLODBC.ToUpper().StartsWith("INSERT") & !MySQLODBC.ToUpper().StartsWith("UPDATE") & !MySQLODBC.ToUpper().StartsWith("DELECT"))
                    {
                        MySQLODBCCommand.CommandType = CommandType.StoredProcedure;                }
                }
                catch (System.Exception OleDBExceptionErr)
                {
                    throw new System.Exception(OleDBExceptionErr.Message, OleDBExceptionErr.InnerException);
                }        }
        }
        public void MySQLODBCAddParameter(string Name, OdbcType Type, int Size, object Value)
        {
            try
            {
                MySQLODBCCommand.Parameters.Add(Name, Type, Size).Value = Value;
            }
            catch (OdbcException OleDbExceptionErr)
            {
                throw new System.Exception(OleDbExceptionErr.Message, OleDbExceptionErr.InnerException);        }
        }
        public void InitializeMySQLODBCDataAdapter()
        {
            try
            {
                MySQLODBCDataAdapter = new OdbcDataAdapter();
                MySQLODBCDataAdapter.SelectCommand = MySQLODBCCommand;
            }        catch (OdbcException OleDbExceptionErr)
            {
                throw new System.Exception(OleDbExceptionErr.Message, OleDbExceptionErr.InnerException);        }
        }
      

  2.   


        public void FillMySQLODBCDataSet(ref DataSet oDataSet, string TableName)
        {
            try
            {
                InitializeMySQLODBCCommand();
                InitializeMySQLODBCDataAdapter();
                MySQLODBCDataAdapter.Fill(oDataSet, TableName);
            }
            catch (System.Exception OleDBExceptionErr)
            {
                throw new System.Exception(OleDBExceptionErr.Message, OleDBExceptionErr.InnerException);        }
            MySQLODBCCommand.Dispose();
            MySQLODBCCommand = null;
            MySQLODBCDataAdapter.Dispose();
            MySQLODBCDataAdapter = null;
        }
        public void FillMySQLODBCDubleDataSet(ref DataSet oDataSet)
        {
            try
            {
                InitializeMySQLODBCCommand();
                InitializeMySQLODBCDataAdapter();
                MySQLODBCDataAdapter.Fill(oDataSet);
            }
            catch (System.Exception OleDBExceptionErr)
            {
                throw new System.Exception(OleDBExceptionErr.Message, OleDBExceptionErr.InnerException);        }
            MySQLODBCCommand.Dispose();
            MySQLODBCCommand = null;
            MySQLODBCDataAdapter.Dispose();
            MySQLODBCDataAdapter = null;
        }
        public void FillMySQLODBCDataTable(ref DataTable oDatatable)
        {
            try
            {
                InitializeMySQLODBCCommand();
                InitializeMySQLODBCDataAdapter();
                MySQLODBCDataAdapter.Fill(oDatatable);
            }
            catch (System.Exception OleDBExceptionErr)
            {
                throw new System.Exception(OleDBExceptionErr.Message, OleDBExceptionErr.InnerException);
            }
            MySQLODBCCommand.Dispose();
            MySQLODBCCommand = null;
            MySQLODBCDataAdapter.Dispose();
            MySQLODBCDataAdapter = null;    }
        public int MySQLODBCExecuteStoredProcedure()
        {
            int functionReturnValue = 0;
            try
            {
                MySQLODBCOpenConnection();
                functionReturnValue = MySQLODBCCommand.ExecuteNonQuery();//这里出的错
            }
            catch (System.Exception OleDBExceptionErr)
            {
                throw new System.Exception(OleDBExceptionErr.Message, OleDBExceptionErr.InnerException);
            }
            finally
            {
                MySQLODBCCloseConnection();
            }
            return functionReturnValue;
        }
        public object MySQLODBCExecuteScalar()
        {
            object functionReturnValue;
            try
            {
                MySQLODBCOpenConnection();
                functionReturnValue = MySQLODBCCommand.ExecuteScalar();
            }
            catch (System.Exception OleDBExceptionErr)
            {
                throw new System.Exception(OleDBExceptionErr.Message, OleDBExceptionErr.InnerException);
            }
            finally
            {
                MySQLODBCCloseConnection();
            }
            return functionReturnValue;
        }
        public int MySQLODBCTLWDExecuteStoredProcedure()
        {
            int functionReturnValue = 0;
            try
            {
                functionReturnValue = MySQLODBCCommand.ExecuteNonQuery();
            }
            catch (System.Exception OleDBExceptionErr)
            {
                throw new System.Exception(OleDBExceptionErr.Message, OleDBExceptionErr.InnerException);
            }
            return functionReturnValue;
        }
        #region " IDisposable Support "
        //  添加此代码是为了正确实现可处置模式。 
        public void Dispose()
        {
            // 不要更改此代码。请将清理代码放入上面的 Dispose(ByVal disposing As Boolean) 中。 
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        #endregion
        public string MySqlDataInsert(string username, string password, string Email, string regip)//传参数
        {
            DataSet chkdata = new DataSet();
            base.MySQLODBC = "select uname from sdb_members where uname='" + username + "';";
            base.FillMySQLODBCDataSet(ref chkdata, "chkName");
            if (chkdata.Tables[0].Rows.Count > 0)
            {
                return "该用户已经存在.";
            }
            else
            {
                string TimeSpan = DateDiff(Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), new DateTime(1970, 1, 1, 0, 0, 0));
                base.MySQLODBC = "'AddMembers'";
                base.InitializeMySQLODBCCommand();
                base.MySQLODBCAddParameter("unameStr", System.Data.Odbc.OdbcType.VarChar, username.Length, username);
                base.MySQLODBCAddParameter("passwordStr", System.Data.Odbc.OdbcType.VarChar, password.Length, password);
                base.MySQLODBCAddParameter("emailStr", System.Data.Odbc.OdbcType.VarChar, Email.Length, Email);
                base.MySQLODBCAddParameter("regtimestr", System.Data.Odbc.OdbcType.Int, TimeSpan.Length, Convert.ToInt64(TimeSpan));
                base.MySQLODBCAddParameter("regIpstr", System.Data.Odbc.OdbcType.VarChar, regip.Length, regip);
                if (base.MySQLODBCExecuteStoredProcedure() < 0)
                {
                    return "帐号添加出错误";
                }
                return "帐号添加成功.";
            }
           }
    }这个是调用的存储过程。CREATE DEFINER = 'root'@'localhost' PROCEDURE `Creatmember`(
            IN `unameStr` varchar(50),
            IN `passwordStr` varchar(32),
            IN `emailStr` varchar(200),
            IN `regtimestr` int(10),
            IN `regIpstr` varchar(16)
        )
        NOT DETERMINISTIC
        CONTAINS SQL
        SQL SECURITY DEFINER
        COMMENT ''
    BEGIN
    INSERT INTO sdb_members SET  member_lv_id = 1,uname= `unameStr`,name='',lastname=null,firstname=null,password= `passwordStr`,area='mainland:',mobile='',tel='',email=`emailStr`,zip='',addr='',province=null,city=null,order_num='0',refer_id=null,refer_url=null,b_year='1900',b_month='1',b_day='1',sex='0',addon=null,wedlock='0',education=null,vocation=null,interest=null,advance=0,advance_freeze=0,point_freeze=0,point_history=0,point=0,score_rate=null,reg_ip=`regIpstr`,regtime= `regtimestr`,state='0',pay_time=null,biz_money='0',pw_answer='',pw_question='',fav_tags=null,custom=null,cur=null,lang=null,unreadmsg='0',disabled='false',re=null,role_type='wholesale',re_type='b1';
            INSERT INTO sdb_member_mattrvalue SET attr_id='11',member_id=(select max(member_id) from sdb_members),value='999999';
    END;
      

  3.   

    你的过程名好象没调对用啊。            string TimeSpan = DateDiff(Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), new DateTime(1970, 1, 1, 0, 0, 0));
                base.MySQLODBC = "Creatmember";   //changed by ACMAIN
                base.InitializeMySQLODBCCommand();
      

  4.   

    是否应该
    CALL Creatmember(5个参数)
      

  5.   

    ado.net中调用procedure 是不用 call 这种语法的。
      

  6.   

    AddMembers:代码是什么?在MYSQL中运行正常?
      

  7.   

    从楼主的错误代码和程序来看,应该是根本没有 AddMembers 这个存储过程。而是 `Creatmember`
      

  8.   

    有2个这样的存储过程都是一样的代码,我粘贴的时候粘贴错了,AddMembers这个也是有的。
      

  9.   

    你的这个类是怎么封装的?有没有设置你的command的 command.CommandType = CommandType.StoredProcedure; ? (mySQL.net的我没试,SQLdb的和oledb的都需要告诉command准备执行一个什么样的命令,是SQL还是storeprocedure.
      

  10.   

        public void InitializeMySQLODBCCommand()
        {
            if (MySQLODBCCommand == null)
            {
                try
                {
                    MySQLODBCCommand = new OdbcCommand(MySQLODBC, MySQLODBCConnectionStr);
                    if (!MySQLODBC.ToUpper().StartsWith("SELECT") & !MySQLODBC.ToUpper().StartsWith("INSERT") & !MySQLODBC.ToUpper().StartsWith("UPDATE") & !MySQLODBC.ToUpper().StartsWith("DELECT"))
                    {
                        MySQLODBCCommand.CommandType = CommandType.StoredProcedure;                }
                }
                catch (System.Exception OleDBExceptionErr)
                {
                    throw new System.Exception(OleDBExceptionErr.Message, OleDBExceptionErr.InnerException);
                }        }
        }
    这里就是了吧。
      

  11.   

    有些乱了。 建议你能单步调试一下,找出错误的语句。目前的程序报错是''AddMembers'' 语法错误,一般那么你调用时有问题,要么这个''AddMembers'' 根本就不存在。
      

  12.   

    如果是你说的这个问题的话,我觉得只可能是上次执行后没有释放掉Command类,所以初始化方法里面就没有执行new。但是    public object MySQLODBCExecuteScalar()
        {
            object functionReturnValue;
            try
            {
                MySQLODBCOpenConnection();
                functionReturnValue = MySQLODBCCommand.ExecuteScalar();
            }
            catch (System.Exception OleDBExceptionErr)
            {
                throw new System.Exception(OleDBExceptionErr.Message, OleDBExceptionErr.InnerException);
            }
            finally
            {
                MySQLODBCCloseConnection();
            }
            return functionReturnValue;
        }
    这里我已经关闭连接了啊,而且这个数据类在使用mssqlserver的时候从来没出过错,改成access的时候也没出过错啊。
      

  13.   

    不知道是不是odbc驱动的问题啊?难道要运行存储过程还要在odbc里面进行设置吗?
      

  14.   

    不需要,你用的是MySQL提供的.net的connector还是ODBC?
      

  15.   

    直接用的odbc,好象叫个什么odbc mysql driver 3.51打开它那个配置界面还有好多选项,不知道是不是还要在那里面设置,我是用的默认设置,没有配置那个东西。
      

  16.   

    哦,是connector/odbc,就在csdn里面下的。
      

  17.   

    单步调试吧。 毕竟你的信息已经传到MySQL服务器了,是MySQL返回的错误信息。
      

  18.   

    还有个方法,你可以到MySQL的错误日志中看一下当时提交了个什么样的语句及参数。
      

  19.   

    你的MYSQL版本?用MYSQL ODBC 5.1试试
      

  20.   

    确实是call加参数谢谢wwwwb大哥的帮助,也感谢acmain_chm的回答MySQLODBC = "CALL new_procMemberAdd(?,?,?,?,?)"