SQL存储过程似乎没有接收参数

时间:2011-08-19 13:51:05

标签: c# sql-server-2008

有人可以帮我弄清楚为什么这不起作用。

这是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)中包装代码,但这没有帮助。

感谢您的任何指示,

约翰

1 个答案:

答案 0 :(得分:1)

尝试将SqlCommand的CommandType设置为StoredProcedure

目前,它将其解释为文本查询(字面意思sGetPeriods)。对于文本查询,您必须在查询文本中包含相应的参数,而这些参数您没有这样做。

不幸的是,如果您为SQL提供一个以存储过程名称开头的查询批处理,它会将其视为在此之前存在exec。如果不是这样,那将是一个更明显的错误信息。