0

これについて助けが必要です。簡単に思えますが、私はそれを理解することはできません。

私のコード:

    public DataTable GetUserAssociatedModules(string UserEmail)
    {
        // retrieve module titles from Module table to be passed to ddlModules in Student.Master
        try
        {
            SqlCommand getModules = new SqlCommand("GetUserAssociatedModules", con);
            getModules.Parameters.AddWithValue("@userEmail", UserEmail);

            SqlDataReader dr;
            dr = getModules.ExecuteReader();

            //DataTable dt = new DataTable();
            dt.Columns.Add("moduleTitle");
            dt.Load(dr);
            return dt;
        }
        catch (Exception ex)
        {
            HttpContext.Current.Response.Write("Exception: " + ex.Message + ", CourseDAO.GetModules()");
            return null;
        }
        finally
        {
            // close database connection
            if (con != null)
            {
                con.Close();
            }
        }
    }

例外が発生し続けます:

プロシージャまたは関数 'GetUserAssociatedModules' には、指定されていないパラメーター '@userEmail' が必要です。

私は時計をつけましたUserEmail。UIから値を渡す必要がありますが、データリーダーはnullのままです...

SQL を確認しました。それは正常に実行されます。

コードで呼び出されたストアド プロシージャ名がデータベース内のプロシージャと一致し、コード内のパラメータ名がプロシージャ内のパラメータ名と一致することを確認するために、二重と三重のチェックを行いました...

手順...

ALTER PROCEDURE [dbo].[GetUserAssociatedModules]
    @userEmail nvarchar(MAX)
AS
BEGIN
    SELECT 
        [dbo].[Module].[moduleId],[moduleTitle] 
    FROM 
        [dbo].[Module] 
    INNER JOIN 
        [dbo].[ModuleUser] ON [dbo].[Module].[moduleId] = [dbo].[ModuleUser].[moduleId]
    WHERE 
        [dbo].[ModuleUser].[userId] = (SELECT [userId]
                                       FROM [dbo].[User]
                                       WHERE [eMail] = @userEmail)
    ORDER BY 
        [moduleTitle] ASC
END
4

1 に答える 1

6

接続を開いていません:

conn.Open();

または、この行を指定しない:

sqlCommand.CommandType = CommandType.StoredProcedure;

public DataTable GetUserAssociatedModules(string userEmail)
{
var dt = new DataTable();
string connString = AppConfigurationManager.GetAppSetting("ConnectionString",IsTest,IsQA, IsProd);
using (var conn = new SqlConnection(connString))
{
    conn.Open();
    using (var sqlCommand = new SqlCommand("GetUserAssociatedModules", conn))
    {
        sqlCommand.CommandType = CommandType.StoredProcedure;
        sqlCommand.Parameters.AddWithValue("@userEmail", userEmail);

        SqlDataReader dr = null;
        DataSet ds = new DataSet();
        try
        {
            dr = sqlCommand.ExecuteReader();
            dt = new DataTable("DatatTable_GetUserAssociatedModules");
            ds.Tables.Add(dt);
            ds.Load(dr, LoadOption.OverwriteChanges, dt);
        }
        catch (SqlException ex)
        {
            LogExceptions(ex, new List<Param> { new Param { Name = "userEmail", Value = userEmail} });
         }
        catch (Exception ex)
        {
            LogExceptions(ex, new List<Param> { new Param { Name = "userEmail", Value = userEmail} });
        }
        finally
        {

        }
    }
}
return dt;
}
于 2013-02-05T03:10:23.597 に答える