c# - 您的 SQL 语法有错误,适用于 .net 的 mysql 连接器

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

存储过程:

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);
        }

获取异常:

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 'GetMaximumIDsCount @AppID, @isBurnCenter, @BurnCenterID' at line 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<T> 中的一个结果集:

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)

关于c# - 您的 SQL 语法有错误,适用于 .net 的 mysql 连接器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50405625/

相关文章:

c# - 使用 ObservableCollection 进行 LINQ

c# - 使用不同颜色的 Material 绘制网格

c# - 单元测试 IInterceptionBehavior

mysql - 选择 SUM() 查询的 MAX()

jquery:选择列表框中的项目并触发更改

c# - 我可以将未知对象强制转换为接口(interface)以便我可以在 C# 中访问它的属性吗?

c# - 文件流重命名文件

mysql - 我应该创建一个只有id和name并且一对一属于users表的表吗?

php - 如何在 isset_POST 中设置 OR

asp.net-mvc - 为模型创建 View 中的 ASP.NET MVC4 下拉列表