SQL Stored Preocedure, по-видимому, не получает параметры - PullRequest
0 голосов
/ 19 августа 2011

Может кто-нибудь помочь мне понять, почему это не работает.

Вот вам SP:

CREATE PROCEDURE sGetPeriods @PeriodTypeID INT, @ParentPeriodID INT
AS
BEGIN
    SET NOCOUNT ON 
    SELECT PeriodID, Period
      FROM Periods
     WHERE CASE WHEN @PeriodTypeID IS NULL THEN 1
                WHEN @PeriodTypeID = PeriodTypeID THEN 1
                ELSE 0
            END = 1
       AND CASE WHEN @ParentPeriodID IS NULL THEN 1
                WHEN @ParentPeriodID = ParentPeriodID THEN 1
                ELSE 0
            END = 1
    ORDER BY Period
END
GO

Вот код C #, который вызывает SP:

    private DataTable CmdExecuteToDataTable(SqlCommand objSQLCmd)
    {
        DataTable dtReturn = new DataTable();
        using (SqlConnection objSQLConn = new SqlConnection(c_szSQLConnectionString))
        {
            objSQLConn.Open();
            objSQLCmd.Connection = objSQLConn;
            if (bLog)
            {
                //WriteLog("Connection: " + objSQLConn.ConnectionString);
                WriteLog("CmdExecuteToDataTable(" + objSQLCmd.CommandText + ")");
                for (int zz = 0; zz < objSQLCmd.Parameters.Count; zz++)
                {
                    WriteLog(objSQLCmd.Parameters[zz].ParameterName + ": " + objSQLCmd.Parameters[zz].Value.ToString());
                }
            }
            SqlDataReader _r = objSQLCmd.ExecuteReader();
            if (_r.HasRows)
            {
                DataReaderAdapter _dra = new DataReaderAdapter();
                _dra.FillFromReader(dtReturn, _r);
            }
            _r.Close();
        }

        if (bLog)
        {
            WriteLog("\t" + "Returned: " + dtReturn.Rows.Count.ToString() + " rows.");
            WriteLog(("-").PadRight(80, '-'));
        }
        return dtReturn;
    }

И вот код, который вызывает вышеуказанный метод:

    public DataTable GetPeriods(int iPeriodTypeID, int iParentPeriodID)
    {
        SqlCommand objSQLCmd = new SqlCommand("sGetPeriods");
        objSQLCmd.Parameters.Clear();
        if (iPeriodTypeID != 0)
            objSQLCmd.Parameters.Add(new SqlParameter("@PeriodTypeID", iPeriodTypeID));
        if (iParentPeriodID != 0)
            objSQLCmd.Parameters.Add(new SqlParameter("@ParentPeriodID", iParentPeriodID));
        return CmdExecuteToDataTable(objSQLCmd);
    }

Наконец, вот код страницы, который вызывает метод выше:

        int iPeriodTypeID = 1;
        int iParentPeriodID = 1;
        DataTable dtPeriods = clsDataLayer.GetPeriods(iPeriodTypeID, iParentPeriodID);

Когда страница загружается, я получаю

Procedure or function 'sGetPeriods' expects parameter '@PeriodTypeID', which was not supplied. 

Тем не менее, параметр IS предоставляется в соответствии с проверкой записи файла LOG:

8/19/2011 8:44:16 AM: CmdExecuteToDataTable(sGetPeriods)
8/19/2011 8:44:16 AM: @PeriodTypeID: 1
8/19/2011 8:44:16 AM: @ParentPeriodID: 1

Каким-то образом хранимая процедура не получает значения, переданные с объектом команды SQL. Есть идеи?

К вашему сведению, когда я определил SP, как это:

CREATE PROCEDURE sGetPeriods @PeriodTypeID INT = NULL, @ParentPeriodID INT = NULL

Процедура выполняется, но возвращает ВСЕ строки, как если бы она не получила никаких параметров.

Я попытался обернуть код в использование (sqlcommand sqlcmd = objSLQCmd), но это не помогло.

Спасибо за любые указатели,

John

1 Ответ

1 голос
/ 19 августа 2011

Попробуйте установить CommandType SqlCommand на StoredProcedure .

На данный момент он интерпретирует его как текстовый запрос (буквально sGetPeriods). Для текстового запроса вы должны включить соответствующие параметры в текст запроса, который вы не делаете.

К сожалению, если вы предоставляете SQL пакет запроса, начинающийся с имени хранимой процедуры, он обрабатывает его так, как если бы перед этим присутствовал exec. Если бы это было не так, было бы гораздо более очевидное сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...