【问题标题】:You have an error in your SQL syntax, mysql connector for .net您的 SQL 语法错误,.net 的 mysql 连接器
【发布时间】:2018-10-28 13:24:55
【问题描述】:

存储过程:

CREATE DEFINER=`newdb`@`%` PROCEDURE `GetMaximumIDsCount`(IN AppID INT,IN isBurnCenter INT,IN BurnCenterID INT)
BEGIN

    IF isBurnCenter = 1 THEN

    SELECT MAX(CAST(b.hospitalid AS SIGNED))

    FROM tblhosipital b

    WHERE b.appId = AppID AND b.burncenterid IS NULL;

    END IF;


    IF isBurnCenter = 0 THEN

    SELECT MAX(CAST(h.hospitalid AS SIGNED))

    FROM tblhosipital h

    WHERE h.appId = AppID AND h.burncenterid <> '' AND h.burncenterid = BurnCenterID;

    END IF;
END

从 ApplicationDbContext 调用(代码优先)

public virtual ObjectResult<long?> GetMaximumIDsCount2(Nullable<int> appID, Nullable<int> isBurnCenter, Nullable<int> burnCenterID)
        {
            var appIDParameter = appID.HasValue ?
                new ObjectParameter("AppID", appID) :
                new ObjectParameter("AppID", typeof(int));

            var isBurnCenterParameter = isBurnCenter.HasValue ?
                new ObjectParameter("isBurnCenter", isBurnCenter) :
                new ObjectParameter("isBurnCenter", typeof(int));

            var burnCenterIDParameter = burnCenterID.HasValue ?
                new ObjectParameter("BurnCenterID", burnCenterID) :
                new ObjectParameter("BurnCenterID", typeof(int));

            return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<Nullable<long>>("GetMaximumIDsCount @AppID, @isBurnCenter, @BurnCenterID", appIDParameter, isBurnCenterParameter, burnCenterIDParameter);
        }

获取异常:

您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 在'GetMaximumIDsCount @AppID,@isBurnCenter,@BurnCenterID'附近 1

【问题讨论】:

    标签: c# mysql asp.net-mvc ef-code-first


    【解决方案1】:

    需要在存储过程名称前加上CALL [procedure_name]()方法:

    return ((IObjectContextAdapter)this)
           .ObjectContext
           .ExecuteStoreQuery<List<long?>>("CALL GetMaximumIDsCount(@AppID, @isBurnCenter, @BurnCenterID)", 
           appIDParameter, isBurnCenterParameter, burnCenterIDParameter);
    

    注意: MySQL 存储过程使用以下语法执行:

    CALL procedure_name(parameter_list)
    

    注意2:使用FirstOrDefault()SingleOrDefault()ObjectResult&lt;T&gt;返回一个结果集:

    var x = db.GetMaximumIDsCount2(...).FirstOrDefault();
    

    附带说明,您可以尝试使用MySqlParameter 而不是ObjectParameter 声明参数:

    // you can change DBNull.Value with any appropriate value
    
    var appIDParameter = new MySqlParameter("AppID", MySqlDbType.Int).Value = (appID.HasValue) ? appID : DBNull.Value;
    
    var isBurnCenterParameter = new MySqlParameter("isBurnCenter", MySqlDbType.Int).Value = (isBurnCenter.HasValue) ? isBurnCenter : DBNull.Value;
    
    var isBurnCenterParameter = new MySqlParameter("BurnCenterID", MySqlDbType.Int).Value = (burnCenterID.HasValue) ? burnCenterID : DBNull.Value;
    

    参考:

    CALL Syntax (MySQL)

    【讨论】:

    • 我在过程名称之前添加了CALL,现在我得到了异常The data reader has more than one field. Multiple fields are not valid for EDM primitive or enumeration types.(过程中的两个if语句都返回整数)
    • 在方法名称后使用FirstOrDefault()SingleOrDefault() 可以从ObjectResult 中返回一个结果集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2014-10-25
    • 2019-12-03
    相关资源
    最近更新 更多