0

在我的 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();

}

编辑

调试截图

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 列,即使它已经包含这两列。这样做似乎更合乎逻辑:

_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 回答