C# asp.net存储过程输入/输出参数

C# asp.net存储过程输入/输出参数,c#,asp.net,sql-server,stored-procedures,C#,Asp.net,Sql Server,Stored Procedures,我试图将一个输入参数传递给一个存储过程,我认为该存储过程声明了输出参数,但似乎是输入/输出变量,因此给了我一条错误消息,指出其中一个参数没有提供值 C#调用代码设置如下: protected void CheckBoxClassRegion_btnSubmit(object sender, EventArgs e) { date @date; /* Variable for the date of the game */ varchar @H

我试图将一个输入参数传递给一个存储过程,我认为该存储过程声明了输出参数,但似乎是输入/输出变量,因此给了我一条错误消息,指出其中一个参数没有提供值

C#调用代码设置如下:

protected void CheckBoxClassRegion_btnSubmit(object sender, EventArgs e)
{
    date    @date;             /* Variable for the date of the game     */
    varchar @HomeTeam;         /* The name of the high school team      */
    varchar @AwayTeam;         /* The name of the other H.s. team       */
    int     @TeamID;           /* The ID number of the high school team */
    AddressText.Text = "";
    /**********************************************************************/
    /* The code below will initialize the connection to the database.     */
    /* As the connection string to the SQL database is defined as conn,   */
    /* the open method from conn will connect to the database, and the    */
    /* cmd variable will call on the stored procedure GetSchedule.        */
    /**********************************************************************/
    string strcon   = WebConfigurationManager.ConnectionStrings["FollowingHSFootballConnectionString"].ConnectionString;
    SqlConnection conn = new SqlConnection(strcon);
    conn.Open();
    SqlCommand cmd  = new SqlCommand("GetSchedule", conn);
    cmd.CommandType = CommandType.StoredProcedure;

    /**********************************************************************/
    /* The for loop below will determine which items from the checkbox    */
    /* were selected from the input and use the High School team name to  */
    /* pass to the stored procedure 'GetSchedule' to return the dates,    */
    /* home team and away team each game.                                 */
    /**********************************************************************/
                                                                            /**********************************************************************/
    foreach (ListItem item in CheckBoxClassRegion.Items)                    /* This loop will go through all of the checkboxed items              */
    {                                                                       /**********************************************************************/
        if (item.Selected == true)                                          /*    If this team has been selected                                  */
        {                                                                   /**********************************************************************/
            cmd.Parameters.AddWithValue("@TeamName", item.Text);            /*       Pass input parameter "Team Name"                             */
            SqlDataReader reader = cmd.ExecuteReader();                     /*       Utilize the reader function to ensure all games are included */ 
            while (reader.Read())                                           /*       While there are still items to be read                       */
            {                                                               /**********************************************************************/
                cmd.Parameters.Add("@date", SqlDbType.Date);
                cmd.Parameters["@date"].Direction = ParameterDirection.Output;

                cmd.Parameters.Add("@HomeTeam", SqlDbType.VarChar, 25);
                cmd.Parameters["@HomeTeam"].Direction = ParameterDirection.Output;

                cmd.Parameters.Add("@AwayTeam", SqlDbType.VarChar, 25);
                cmd.Parameters["@AwayTeam"].Direction = ParameterDirection.Output;

                cmd.ExecuteNonQuery();                                          /*       Execute the stored procedure                                 */

                Console.WriteLine(cmd.Parameters["@GameDate"].Value);
                Console.WriteLine(cmd.Parameters["@HomeTeam"].Value);
                Console.WriteLine(cmd.Parameters["@AwayTeam"].Value);
                Console.ReadLine(); 
            }
存储过程:

ALTER PROCEDURE [dbo].[GetSchedule]

    @teamname varchar(25),
    @date Date OUTPUT,
    @HomeTeam varchar(25) OUTPUT,
    @AwayTeam varchar(25) OUTPUT

AS
BEGIN

    SET NOCOUNT ON;


    SELECT HomeSchedule.Date, HomeTeam.HighSchoolName, AwayTeam.HighSchoolName
    from (
      (Schedule$ as HomeSchedule inner join HighSchoolFootballTeam$ as HomeTeam 
        on HomeSchedule.HomeTeamID = HomeTeam.HighSchoolTeamID)
     inner join 
      (Schedule$ as AwaySchedule inner join HighSchoolFootballTeam$ as AwayTeam
        on AwaySchedule.AwayTeamID = AwayTeam.HighSchoolTeamID) 
     on HomeSchedule.GameID = AwaySchedule.GameID)
     where HomeTeam.HighSchoolName = @teamname or AwayTeam.HighSchoolName = @teamname
    Order by HomeSchedule.Date

END

如何使
@Date
@HomeTeam
@AwayTeam
的输出变量只充当输出变量,而不充当输入/输出变量,以便存储过程不希望从它们那里得到输入值?

您的存储过程具有设置为输入参数的
@teamname
参数,但是您没有在C#code中为
@teamname
参数设置任何值,因此出现错误。您需要为
@teamname
参数设置一个值,如下所示

while (reader.Read())                                           /*       While there are still items to be read                       */
{                                                               /**********************************************************************/
    cmd.Parameters.Add("@teamname", SqlDbType.VarChar, 25);
    cmd.Parameters["@teamname"].Value = ...; // set the value here

    cmd.Parameters.Add("@date", SqlDbType.Date);
    cmd.Parameters["@date"].Direction = ParameterDirection.Output;

    cmd.Parameters.Add("@HomeTeam", SqlDbType.VarChar, 25);
    cmd.Parameters["@HomeTeam"].Direction = ParameterDirection.Output;

    cmd.Parameters.Add("@AwayTeam", SqlDbType.VarChar, 25);
    cmd.Parameters["@AwayTeam"].Direction = ParameterDirection.Output;

    cmd.ExecuteNonQuery();                                          /*       Execute the stored procedure                                 */

    Console.WriteLine(cmd.Parameters["@GameDate"].Value);
    Console.WriteLine(cmd.Parameters["@HomeTeam"].Value);
    Console.WriteLine(cmd.Parameters["@AwayTeam"].Value);
    Console.ReadLine(); 
}
编辑

在看了更完整的代码之后,这里是您的错误

cmd.Parameters.AddWithValue("@TeamName", item.Text);
SqlDataReader reader = cmd.ExecuteReader();
当您添加
SqlDataReader=cmd.ExecuteReader()时,您没有添加
@date
@HomeTeam
@AwayTeam
参数,这就是为什么会出现错误。在执行
cmd.ExecuteReader()
之前,应该添加这三个参数。您还需要清除
cmd
using的参数,因为您正在循环中使用
cmd
,并删除
cmd.ExecuteNonQuery()
,因为调用
cmd.ExecuteReader()
时已经在执行存储过程。更改您的代码如下

if (item.Selected == true)
{
    cmd.Parameters.Clear();
    cmd.Parameters.AddWithValue("@TeamName", item.Text);
    cmd.Parameters.Add("@date", SqlDbType.Date);
    cmd.Parameters["@date"].Direction = ParameterDirection.Output;
    cmd.Parameters.Add("@HomeTeam", SqlDbType.VarChar, 25);
    cmd.Parameters["@HomeTeam"].Direction = ParameterDirection.Output;
    cmd.Parameters.Add("@AwayTeam", SqlDbType.VarChar, 25);
    cmd.Parameters["@AwayTeam"].Direction = ParameterDirection.Output;
    SqlDataReader reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        Console.WriteLine(cmd.Parameters["@GameDate"].Value);
        Console.WriteLine(cmd.Parameters["@HomeTeam"].Value);
        Console.WriteLine(cmd.Parameters["@AwayTeam"].Value);
        Console.ReadLine(); 
    }

您的存储过程具有设置为输入参数的
@teamname
参数,但您没有在C#code中为
@teamname
参数设置任何值,因此出现错误。您需要为
@teamname
参数设置一个值,如下所示

while (reader.Read())                                           /*       While there are still items to be read                       */
{                                                               /**********************************************************************/
    cmd.Parameters.Add("@teamname", SqlDbType.VarChar, 25);
    cmd.Parameters["@teamname"].Value = ...; // set the value here

    cmd.Parameters.Add("@date", SqlDbType.Date);
    cmd.Parameters["@date"].Direction = ParameterDirection.Output;

    cmd.Parameters.Add("@HomeTeam", SqlDbType.VarChar, 25);
    cmd.Parameters["@HomeTeam"].Direction = ParameterDirection.Output;

    cmd.Parameters.Add("@AwayTeam", SqlDbType.VarChar, 25);
    cmd.Parameters["@AwayTeam"].Direction = ParameterDirection.Output;

    cmd.ExecuteNonQuery();                                          /*       Execute the stored procedure                                 */

    Console.WriteLine(cmd.Parameters["@GameDate"].Value);
    Console.WriteLine(cmd.Parameters["@HomeTeam"].Value);
    Console.WriteLine(cmd.Parameters["@AwayTeam"].Value);
    Console.ReadLine(); 
}
编辑

在看了更完整的代码之后,这里是您的错误

cmd.Parameters.AddWithValue("@TeamName", item.Text);
SqlDataReader reader = cmd.ExecuteReader();
当您添加
SqlDataReader=cmd.ExecuteReader()时,您没有添加
@date
@HomeTeam
@AwayTeam
参数,这就是为什么会出现错误。在执行
cmd.ExecuteReader()
之前,应该添加这三个参数。您还需要清除
cmd
using的参数,因为您正在循环中使用
cmd
,并删除
cmd.ExecuteNonQuery()
,因为调用
cmd.ExecuteReader()
时已经在执行存储过程。更改您的代码如下

if (item.Selected == true)
{
    cmd.Parameters.Clear();
    cmd.Parameters.AddWithValue("@TeamName", item.Text);
    cmd.Parameters.Add("@date", SqlDbType.Date);
    cmd.Parameters["@date"].Direction = ParameterDirection.Output;
    cmd.Parameters.Add("@HomeTeam", SqlDbType.VarChar, 25);
    cmd.Parameters["@HomeTeam"].Direction = ParameterDirection.Output;
    cmd.Parameters.Add("@AwayTeam", SqlDbType.VarChar, 25);
    cmd.Parameters["@AwayTeam"].Direction = ParameterDirection.Output;
    SqlDataReader reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        Console.WriteLine(cmd.Parameters["@GameDate"].Value);
        Console.WriteLine(cmd.Parameters["@HomeTeam"].Value);
        Console.WriteLine(cmd.Parameters["@AwayTeam"].Value);
        Console.ReadLine(); 
    }

关于如何在internet和Stackoverflow上实现这一点,有很多例子。。您是否尝试过通过更改进行google搜索…?我尝试过,但我一直在搜索asp.net存储过程输出参数。在如何定义输出参数和输入/输出参数方面,我没有发现任何与我的代码不同的地方。你有什么建议吗?关于如何在internet和Stackoverflow上实现这一点,有很多例子。。您是否尝试过通过更改进行google搜索…?我尝试过,但我一直在搜索asp.net存储过程输出参数。在如何定义输出参数和输入/输出参数方面,我没有发现任何与我的代码不同的地方。您有什么建议吗?我可能应该在代码中包含对@teamname foreach的赋值(CheckBoxClassRegion.Items中的ListItem项){if(item.Selected==true){cmd.Parameters.AddWithValue(“@TeamName”,item.Text);SqlDataReader=cmd.ExecuteReader();不要在评论中添加代码,这很难阅读。请将代码添加到您的问题中。您确实回答了我的问题,我可以继续。谢谢。我可能应该在@teamname foreach的分配中包含代码(CheckBoxClassRegion.Items中的ListItem项){if(item.Selected==true){cmd.Parameters.AddWithValue(“@TeamName”,item.Text);SqlDataReader reader=cmd.ExecuteReader();不要在注释中添加代码,这很难阅读。请将代码添加到您的问题中。您确实回答了我的问题,我可以继续。谢谢。