0

私のaspプロジェクトでは、TVPを使用してリストボックスからすべてのアイテムをデータベーステーブルに書き込む必要があります。リストボックス、ストアドプロシージャがあります(TVP - テーブル値パラメータを渡します)。主な問題は、渡す DataTable が NULL であることですが、Session はそうではありません。コード フォームの aspx.cs ファイルをお送りします (ブロックは 1 つだけです。さらに追加する場合はお知らせください)。

protected void ASPxButton1_Click(object sender, EventArgs e)
{
    //DataTable dts = Session["SelectedOptions"] as DataTable;

    DataTable _dt;
    //_dt = new DataTable("Items");
    _dt = Session["SelectedOptions"] as DataTable;
    _dt.Columns.Add("Id", typeof(int));
    _dt.Columns.Add("Name", typeof(string));

    foreach (ListEditItem item in lbSelectedOptions.Items)
    {
        DataRow dr = _dt.NewRow();
        dr["Id"] = item.Value;
        dr["Name"] = item.Text;
    }
    SqlConnection con;
    string conStr = ConfigurationManager.ConnectionStrings["TestConnectionString2"].ConnectionString;
    con = new SqlConnection(conStr);
    con.Open();

    using (con)
    {
        SqlCommand sqlCmd = new SqlCommand("TestTVP", con);
        sqlCmd.CommandType = CommandType.StoredProcedure;
        SqlParameter tvpParam = sqlCmd.Parameters.AddWithValue("@testtvp", _dt);
        tvpParam.SqlDbType = SqlDbType.Structured;
        sqlCmd.ExecuteNonQuery();
    }
    con.Close();

}

編集

スクリーンショットのデバッグ

4

1 に答える 1

1

新しい行を DataTable に追加していません。次のようなものが必要です。

foreach (ListEditItem item in lbSelectedOptions.Items)
{
    DataRow dr = _dt.NewRow();
    dr["Id"] = item.Value;
    dr["Name"] = item.Text;

    _dt.Rows.Add(dr);
}

二次的な懸念は、どこで初期化していますSession["SelectedOptions"]か? ASPxButton1 がクリックされるたびに、コードが Id 列と Name 列を追加しようとするように見えますが、それらの 2 つの列が既に含まれている場合でも同様です。次のようなことを行う方がより論理的に思えます。

_dt = Session["SelectedOptions"] as DataTable;
if (_dt == null)
{
    _dt = new DataTable("Items");
    _dt.Columns.Add("Id", typeof(int));
    _dt.Columns.Add("Name", typeof(string));
    Session.Add("SelectedOptions", _dt);
}
于 2012-06-12T07:28:04.280 に答える