asp.net 存储过程 input/output 参数
asp.net stored procedure input/output parameter
我正在尝试将单个输入参数传递给存储过程,我认为该存储过程声明了 OUTPUT 参数,但似乎是 input/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
的输出变量只作为输出而不是 input/output 变量,这样存储过程就不会期待他们的输入值?
您的存储过程具有设置为输入参数的 @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.ExecuteReader();
时没有添加 @date
、@HomeTeam
和 @AwayTeam
参数,这就是您收到错误的原因。您应该在 执行 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();
}
我正在尝试将单个输入参数传递给存储过程,我认为该存储过程声明了 OUTPUT 参数,但似乎是 input/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
的输出变量只作为输出而不是 input/output 变量,这样存储过程就不会期待他们的输入值?
您的存储过程具有设置为输入参数的 @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.ExecuteReader();
时没有添加 @date
、@HomeTeam
和 @AwayTeam
参数,这就是您收到错误的原因。您应该在 执行 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();
}