Конвертировать функцию DAL в хранимые процедуры в MySQL - PullRequest
0 голосов
/ 27 августа 2010

Привет, у меня есть класс для моего уровня доступа к данным, который содержит функцию с именем 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;
    }
}

См. Полную версию здесь: http://friendpaste.com/6ZGJHRNxQ9J57ntFD5XZi1

Я быхотел бы преобразовать это в хранимую процедуру 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

У меня также есть транзакционный DAL, который я хочу преобразовать в mysqlсохраненный процесс

1 Ответ

0 голосов
/ 01 сентября 2010

Я не эксперт по MySQL, но может показаться, что вы пытаетесь выполнить хранимую процедуру так же, как если бы вы выполняли параметризованный запрос, и это не работает.

Я бы тожеочень удивитесь, если ваш MSSQL Proc скомпилирован так, как я ожидал, что ваш процесс будет начинаться с

  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 вследующие способы

  1. Ваш существующий DAL вызывает GetSqlStringCommand.Вам нужно изменить это на GetSqlStringCommand на GetStoredProcCommand.
  2. имена ваших параметров должны будут изменить
  3. текст будет sp_search вместо "Выберите count (cc.course_id) как 'course_count ..."
...