如何将会话传递给DataTable?

时间:2012-06-12 06:44:20

标签: asp.net sql

在我的asp项目中,我需要使用TVP将列表框中的所有项目写入数据库表。我有列表框,存储过程(传递TVP - 表值参数)。主要问题是传递DataTable是NULL,但Session不是。我会发给你我的代码表格aspx.cs文件(只有一个块,如果你需要更多,请告诉我。)

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();

}

修改

Debugging Screenshot

1 个答案:

答案 0 :(得分: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列,即使它已经包含这两列。做类似的事情似乎更合乎逻辑:

_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);
}