これはおそらく簡単なものですが、何が悪いのかわかりません..
次の文字列が URL に追加されています: /projects.aspx?pid=3
私のコードビハインドでは、次のようにこの値を取得しようとしています:
public partial class Projects : System.Web.UI.Page
{
public int pid { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
pid = Convert.ToInt32(Request.QueryString["pid"]); //this is returning 0 when it should have a value.
DataBind(true);
PopulateTestSuiteList();
}
TestSuitesDataList.ItemCommand += new RepeaterCommandEventHandler(this.Item_Command);
}
他の関数で pid の値を調べようとすると、常に「0」になります。なぜそれが私に3を与えないのかわかりませんか?
関数の例を次に示します。
private void ExecuteInsert(string TestSuiteName, string TestSuiteDescription, int ProjectID)
{
SqlConnection conn = new SqlConnection(GetConnectionString());
string sql = "INSERT INTO TestSuites (ProjectID, TestSuiteName, TestSuiteDescription) VALUES " + " (@ProjectID,@TestSuiteName,@TestSuiteDescription)";
try
{
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
SqlParameter[] param = new SqlParameter[3];
param[0] = new SqlParameter("@TestSuiteName", SqlDbType.NVarChar, 50);
param[1] = new SqlParameter("@TestSuiteDescription", SqlDbType.NVarChar, 200);
param[2] = new SqlParameter("@ProjectID", SqlDbType.Int);
param[0].Value = TestSuiteName;
param[1].Value = TestSuiteDescription;
param[2].Value = pid;
for (int i = 0; i < param.Length; i++)
{
cmd.Parameters.Add(param[i]);
}
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
}
catch (System.Data.SqlClient.SqlException ex)
{
string msg = "Insert Error:";
msg += ex.Message;
throw new Exception(msg);
}
finally
{
conn.Close();
}
}
protected void AddTestSuiteButton_Click(object sender, EventArgs e)
{
//checks whether the test suite name already exists in the database and stops duplicates from being added for the same project
string checkExistsQuery = "SELECT TestSuiteName FROM TestSuites WHERE TestSuiteName = @TestSuiteName and @ProjectID = " + pid;
SqlConnection conn = new SqlConnection(GetConnectionString());
SqlCommand checkExistsCmd = new SqlCommand(checkExistsQuery, conn);
SqlParameter c1 = new SqlParameter("TestSuiteName", TxtTestSuiteName.Text);
SqlParameter c2 = new SqlParameter("ProjectID", pid);
checkExistsCmd.Parameters.Add(c1);
checkExistsCmd.Parameters.Add(c2);
conn.Open();
SqlDataReader rd = checkExistsCmd.ExecuteReader();
if (rd.HasRows)
{
lblAddTestSuiteMessage.Text = "Oops, a Project with that name already exists.";
rd.Close();
conn.Close();
}
else
{
string FormattedTestSuiteDescription = TxtTestSuiteDescription.Text.Replace("\r\n", "<br />");
//call the method to execute insert to the database
ExecuteInsert(TxtTestSuiteName.Text, FormattedTestSuiteDescription, pid);
lblAddTestSuiteMessage.Text = "Project has been added successfully";
ClearControls(Page);
}
rd.Close();
conn.Close();
Response.Redirect(Request.RawUrl);
}
同じコード ビハインドでは、この関数は正しいデータを喜んで取得し、ページに表示しているようです。PID も使用していますか??
private void PopulateTestSuiteList()
{
SqlConnection conn = new SqlConnection(GetConnectionString());
conn.Open();
string sql = "SELECT TestSuiteID, ProjectID, TestSuiteName, TestSuiteDescription FROM TestSuites WHERE ProjectID = " + pid + "ORDER BY TestSuiteName ASC";
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader rd = cmd.ExecuteReader();
while (rd.Read())
{
TestSuitesDataList.DataSource = rd;
TestSuitesDataList.DataBind();
}
conn.Close();
}