C# 在mysql中将DAL函数转换为存储过程

C# 在mysql中将DAL函数转换为存储过程,c#,mysql,stored-procedures,data-access-layer,C#,Mysql,Stored Procedures,Data Access Layer,嗨,我的数据访问层有一个类,它包含一个名为GetCitiesByLocation的函数 public DataTable GetCitiesByLocation(long pStateID, string pKeyword) { //create database object Database db = DBHelper.CreateDatabase(); //create SELECT sql statement to be executed using stri

嗨,我的数据访问层有一个类,它包含一个名为
GetCitiesByLocation
的函数

public DataTable GetCitiesByLocation(long pStateID, string pKeyword)
{

    //create database object
    Database db = DBHelper.CreateDatabase();

    //create SELECT sql statement to be executed using string builder
    //add WHERE 1 = 1 at the end

    //add where [optional] statements
    if (String.IsNullOrEmpty(pKeyword) == false)
    {
        //Create AND statement for ?Keyword
    }

    //add group by order by queries
    sql.Append(" GROUP BY c.city_id ");
    sql.Append(" ORDER BY city_name ");

    //Convert SQL String To DbCommand Object
    DbCommand comm = db.GetSqlStringCommand(sql.ToString());

    //Map Variables to mysql ?Parameters
    db.AddInParameter(comm, "?StateID", DbType.Int64, pStateID);
    db.AddInParameter(comm, "?Keyword", DbType.String, pKeyword);

    try
    {
        //execute sql statement and return results
    }

    catch (Exception ex)
    {
        throw ex;
    }
}
请参见此处的完整版本:

我想将其转换为MYSQL存储过程

下面是我的朋友将其转换为MSSQL存储过程的失败尝试

ALTER PROCEDURE [dbo].[sp_Search]
@Keyword varchar(30)

AS

SELECT count(cc.course_id) as 'course_count',  c.*, con.* FROM city c
LEFT JOIN countries con on con.country_id = c.country_id
LEFT JOIN courses cc on cc.city_id = c.city_id
WHERE 1 = 1
AND CASE @Keyword WHEN (@Keyword <> NULL) THEN (AND c.state_name like @Keyword)  END
AND CASE @Keyword WHEN (pStateID > 0) THEN (AND c.state_id = @StateID AND c.country_id = 69 AND c.province_id = 0) END
AND CASE @Keyword WHEN (pProvinceID  > 0) THEN (AND c.province_id = @ProvinceID AND c.country_id = 52 AND c.state_id = 0) END
ALTER过程[dbo].[sp_搜索]
@关键词varchar(30)
作为
从城市c中选择计数(抄送课程id)作为“课程计数”,c.*,con.*
在con.country\u id=c.country\u id上左连接国家con
左连接课程cc on cc.city\u id=c.city\u id
其中1=1
和CASE@Keyword WHEN(@Keyword NULL)然后(和c.state_name一样@Keyword)结束
和CASE@Keyword WHEN(pStateID>0),然后(c.state\u id=@StateID和c.country\u id=69和c.province\u id=0)结束
和CASE@Keyword WHEN(pProvinceID>0)则(c.ProvinceID=@ProvinceID和c.country\u id=52和c.state\u id=0)结束

我还有一个事务DAL,我想将其转换为mysql存储过程,我不是mysql方面的专家,但似乎您试图以执行参数化查询的方式执行存储过程,但这不起作用

如果你的MSSQL程序按照我预期的那样编译,我也会非常惊讶

  ALTER PROCEDURE [dbo].[sp_Search]
    @Keyword varchar(30),
    @StateID int = null,
    @ProvinceID int = null
或者在MySQL中

CREATE PROCEDURE sp_Search(Keyword varhar(30),
StateID int,
ProviceId int)
您最希望通过以下方式更改DAL

  • 您现有的DAL呼叫 GetSqlStringCommand。你需要 将该命令更改为GetSqlStringCommand,再更改为GetStoredProcCommand
  • 您的参数名称必须 改变
  • 文本将是sp_search,而不是“选择count(cc.course_id)作为'course_count…”

  • 您好,我知道如何访问存储过程,存储过程示例中的参数被故意截断,只是为了表示我想要的示例输出。我想将我现有的DAL代码转换成一个存储过程,DAL包含一系列if语句。