Может кто-нибудь помочь мне понять, почему это не работает.
Вот вам 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