【问题标题】:Inserting selected items from a ListBox into MSSQL database with ADO.NET (c#)使用 ADO.NET (c#) 将列表框中的选定项目插入 MSSQL 数据库
【发布时间】:2020-11-06 05:31:15
【问题描述】:

我想知道如何将列表框中的选定项目插入 MSSQL 数据库。

我正在开发一个 ASP.NET 网络应用程序,这就是问题所在:

  1. 我有一个名为lbxRuoli 的列表框,项目直接从数据库中加载:
SqlCommand cmd = new SqlCommand("select descrizione_Ruoli, id_Ruoli from Ruoli", conn);
SqlDataReader dr = cmd.ExecuteReader();
ListItem li = new ListItem("- SELEZIONA -", "");
lbxRuoli.Items.Add(li);
while (dr.Read())
{
    li = new ListItem(dr["descrizione_Ruoli"].ToString(), dr["id_Ruoli"].ToString());
    lbxRuoli.Items.Add(li);
}
dr.Close();
cmd.Dispose();
  1. 现在为所选项目写INSERT
for (int i = 0; i < lbxRuoli.Items.Count; i++)
{
    if (lbxRuoli.Items[i].Selected == true)
    {
        cmd = new SqlCommand("insert into [Utenti.Ruoli] (id_Utenti, id_Ruoli) values(@id, @idR)", conn);
        cmd.Parameters.AddWithValue("@id", txtId.Text);
        cmd.Parameters.AddWithValue("@idR", lbxRuoli.SelectedValue);
        cmd.ExecuteNonQuery();
    }
}    

碰巧我只插入相同的第一个选定项目作为所选项目的总数。

如果有人可以帮助我,那就太好了!
提前感谢每一个人!

【问题讨论】:

  • lbxRuoli.SelectedValue 只是当前的第一项。注意它是如何忽略i 索引的。
  • 感谢 LarsTech 的回答!我已经按照您的建议将 [i] 添加到了 lbxRuoli.SelectedValue ,但是我收到了一个我目前不记得的错误。我会尽快让你知道的!非常感谢!!!

标签: c# asp.net sql-server listbox ado.net


【解决方案1】:

连接不仅需要关闭,还需要处理以释放非托管对象。 using 块即使有错误也会处理这个问题。 命令也需要处理。为了实现这一点,应该将它们声明为使用它们的方法的本地。 using 块将关闭并处理您的数据库对象。

您不希望在更新用户界面时保持连接打开。填写DataTable,关闭连接(using 块执行此操作),然后从DataTable 填写ListBox

要插入数据,请在循环外创建连接、命令并填充参数集合。只有参数的值在循环内改变

下面的代码演示了如何将.Add 方法用于参数。我不得不猜测参数的类型和大小。检查您的数据库并相应地调整代码,确保参数值与SqlDbType 兼容。

    private string ConStr = "Your connection string";
    private DataTable GetListData()
    {
        DataTable dt = new DataTable();
        using (SqlConnection cn = new SqlConnection(ConStr))
        using (SqlCommand cmd = new SqlCommand("select descrizione_Ruoli, id_Ruoli from Ruoli", cn))
        {
            cn.Open();
            dt.Load(cmd.ExecuteReader());
        }
        return dt;
    }
    private void FillListBox()
    {
        DataTable dt = GetListData();
        ListItem li = new ListItem("- SELEZIONA -", "");
        lbxRuoli.Items.Add(li);
        foreach (DataRow row in dt.Rows)
        {
            li = new ListItem(row["descrizione_Ruoli"].ToString(), row["id_Ruoli"].ToString());
            lbxRuoli.Items.Add(li);
        }

    }
    private void InsertData()
    {
        using (SqlConnection cn = new SqlConnection(ConStr))
        using (SqlCommand cmd = new SqlCommand("insert into [Utenti.Ruoli] (id_Utenti, id_Ruoli) values(@id, @idR)", cn))
        {
            cmd.Parameters.Add("@id", SqlDbType.VarChar, 20);
            cmd.Parameters.Add("@idR", SqlDbType.VarChar, 20);
            cn.Open();
            foreach (ListItem li in lbxRuoli.Items)
            { 
                if (li.Selected)
                {
                    cmd.Parameters["@id"].Value = li.Text;
                    cmd.Parameters["idR"].Value = li.Value;
                    cmd.ExecuteNonQuery();
                }
            }
        }
    }

【讨论】:

  • 嗨,玛丽,非常感谢您的帮助。我将 USING 用于 CONNECTION 和 COMMANDS,但我开始避免它更喜欢手动关闭它们(这是代码的摘录)。感谢有关使用 .Add 而不是 .AddWithValue 的建议。我会尽快让你知道你的代码。再次感谢您的宝贵提示!!!
  • 如果您想手动执行此操作,您还需要在连接和命令上调用 .Dispose。他们可能正在使用在其 .Dispose 方法中释放的非托管资源。您将需要尝试...catch...finally 将代码放入 finally 中,这样您就可以确保它运行。除非您可以更正 catch 中的错误,否则最好让它冒泡到调用代码并在 UI 代码中通知用户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
相关资源
最近更新 更多