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

标签 c# asp.net sql-server stored-procedures

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

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# 代码中为 @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 reader = cmd 时,您还没有添加 @date@HomeTeam@AwayTeam 参数。 ExecuteReader();,这就是你得到错误的原因。您应该在 执行 cmd.ExecuteReader() 之前添加这三个参数。您还需要使用 command.Parameters.Clear(); 清除 cmd 的参数因为您在循环中使用 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(); 
    }

关于c# - asp.net存储过程输入/输出参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31126137/

相关文章:

c# - 使用求和和排序依据的 Linq 查询

c# - 如何在不使调用链异步的情况下调用 ApplicationTokenProvider?

c# - 如何将 C# 二维数组返回给 VBScript

asp.net - 在页面之间存储 ID 最多一天?

sql-server - 使用 Delphi 6 从 SQL Server 读取 unicode 字符串

创建/更新日期的 SQL 时间戳

c# - Paypal 快速结账 : Apply order discount

c# - 如何解决 ASP.NET 中全局文件中的 Ninject 依赖项?

c# - 如何创建JObject的JArray?

SQL:内连接两个海量表