System.IndexOutOfRangeException 由于参数和变量
System.IndexOutOfRangeException due to parameter & variables
使用 C# 和 ASP.net,我有一个母版页和一个内容页。在内容页面上,我有一个文本框,用户可以在其中输入一个值,然后点击一个按钮。此按钮运行一个存储的 SQL 过程,并使用用户输入作为参数,然后将结果放入 html table 中显示。
我的网页将启动,但在使用用户输入点击按钮后抛出错误。我认为我的问题与参数 (@PN
)、参数变量 (param
)、用户输入变量 (inputX
) 有关。错误消息显示
System.IndexOutOfRangeException was unhandled by user code
Message=An SqlParameter with ParameterName '@PN' is not contained by
this SqlParameterCollection.
C#代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
using System.Text;
using System.Configuration;
namespace NSV3
{
public partial class Fancy : System.Web.UI.Page
{
private string inputX = string.Empty;
protected void Page_Load(object sender, EventArgs e)
{
Label1.Attributes.Add("onClick", "CallMe();");
}
public void btnTemp_Click(object sender, EventArgs e)
{
string inputX = TextBox1.Text.ToString();
Label2.Text = "You've selected " + inputX;
SqlParameter param = new SqlParameter();
param.ParameterName = "@PN";
param.Value = inputX;
DataTable dt = this.GetData();
StringBuilder html = new StringBuilder();
html.Append("<table border = '1'>");
html.Append("<tr>");
foreach (DataColumn column in dt.Columns)
{
html.Append("<th>");
html.Append(column.ColumnName);
html.Append("</th>");
}
html.Append("</tr>");
foreach (DataRow row in dt.Rows)
{
html.Append("<tr>");
foreach (DataColumn column in dt.Columns)
{
html.Append("<td>");
html.Append(row[column.ColumnName]);
html.Append("</td>");
}
html.Append("</tr>");
}
html.Append("</table>");
PlaceHolder1.Controls.Add(new Literal { Text = html.ToString() });
}
public DataTable GetData()
{
string constr = "editted";
string sql = @"EXEC [ERP_Reports].[dbo].[udsp_WhereUsed]
@IMA_ItemID_INPUT = @PN,
@IMA_RecordID_INPUT = NULL,
@RecursionLevel = NULL,
@FetchSequence = NULL,
@QtyPerAssy_PrevLevel = NULL";
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand(sql))
{
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.Connection = con;
cmd.Parameters["@PN"].Value = inputX;
sda.SelectCommand = cmd;
using (DataTable dt = new DataTable())
{
sda.Fill(dt);
return dt;
}
}
}
}
}
}
}
在 GetData 方法中,在 SqlDataAdapter 'using' 内,尝试以下操作:
...
cmd.Connection = con;
cmd.Parameters.AddWithValue("@PN", inputX);
sda.SelectCommand = cmd;
...
问题是当您设置其值时 cmd.Parameters["@PN"] 不存在,因此出现异常。
您需要将Param 添加到sqlCommand
cmd.Parameters.AddWithValue("@PN", inputx);
您的 btnTemp_Click 方法中也不需要此代码
SqlParameter param = new SqlParameter();
param.ParameterName = "@PN";
param.Value = inputX;
使用 C# 和 ASP.net,我有一个母版页和一个内容页。在内容页面上,我有一个文本框,用户可以在其中输入一个值,然后点击一个按钮。此按钮运行一个存储的 SQL 过程,并使用用户输入作为参数,然后将结果放入 html table 中显示。
我的网页将启动,但在使用用户输入点击按钮后抛出错误。我认为我的问题与参数 (@PN
)、参数变量 (param
)、用户输入变量 (inputX
) 有关。错误消息显示
System.IndexOutOfRangeException was unhandled by user code
Message=An SqlParameter with ParameterName '@PN' is not contained by this SqlParameterCollection.
C#代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
using System.Text;
using System.Configuration;
namespace NSV3
{
public partial class Fancy : System.Web.UI.Page
{
private string inputX = string.Empty;
protected void Page_Load(object sender, EventArgs e)
{
Label1.Attributes.Add("onClick", "CallMe();");
}
public void btnTemp_Click(object sender, EventArgs e)
{
string inputX = TextBox1.Text.ToString();
Label2.Text = "You've selected " + inputX;
SqlParameter param = new SqlParameter();
param.ParameterName = "@PN";
param.Value = inputX;
DataTable dt = this.GetData();
StringBuilder html = new StringBuilder();
html.Append("<table border = '1'>");
html.Append("<tr>");
foreach (DataColumn column in dt.Columns)
{
html.Append("<th>");
html.Append(column.ColumnName);
html.Append("</th>");
}
html.Append("</tr>");
foreach (DataRow row in dt.Rows)
{
html.Append("<tr>");
foreach (DataColumn column in dt.Columns)
{
html.Append("<td>");
html.Append(row[column.ColumnName]);
html.Append("</td>");
}
html.Append("</tr>");
}
html.Append("</table>");
PlaceHolder1.Controls.Add(new Literal { Text = html.ToString() });
}
public DataTable GetData()
{
string constr = "editted";
string sql = @"EXEC [ERP_Reports].[dbo].[udsp_WhereUsed]
@IMA_ItemID_INPUT = @PN,
@IMA_RecordID_INPUT = NULL,
@RecursionLevel = NULL,
@FetchSequence = NULL,
@QtyPerAssy_PrevLevel = NULL";
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand(sql))
{
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.Connection = con;
cmd.Parameters["@PN"].Value = inputX;
sda.SelectCommand = cmd;
using (DataTable dt = new DataTable())
{
sda.Fill(dt);
return dt;
}
}
}
}
}
}
}
在 GetData 方法中,在 SqlDataAdapter 'using' 内,尝试以下操作:
...
cmd.Connection = con;
cmd.Parameters.AddWithValue("@PN", inputX);
sda.SelectCommand = cmd;
...
问题是当您设置其值时 cmd.Parameters["@PN"] 不存在,因此出现异常。
您需要将Param 添加到sqlCommand
cmd.Parameters.AddWithValue("@PN", inputx);
您的 btnTemp_Click 方法中也不需要此代码
SqlParameter param = new SqlParameter();
param.ParameterName = "@PN";
param.Value = inputX;