有人可以帮我弄清楚为什么这不起作用。
这是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
以下是调用SP的C#代码:
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 Command对象传递的值。 有什么想法吗?
仅供参考,当我定义SP时喜欢这个:
CREATE PROCEDURE sGetPeriods @PeriodTypeID INT = NULL, @ParentPeriodID INT = NULL
Procedure执行但返回所有行,就好像它没有收到任何参数一样。
我尝试在using(sqlcommand sqlcmd = objSLQCmd)中包装代码,但这没有帮助。
感谢您的任何指示,
约翰
答案 0 :(得分:1)
尝试将SqlCommand的CommandType设置为StoredProcedure。
目前,它将其解释为文本查询(字面意思sGetPeriods
)。对于文本查询,您必须在查询文本中包含相应的参数,而这些参数您没有这样做。
不幸的是,如果您为SQL提供一个以存储过程名称开头的查询批处理,它会将其视为在此之前存在exec
。如果不是这样,那将是一个更明显的错误信息。