C# - SQL 从 CheckboxList 插入复选框的值和 ID

C# - SQL Insert Value and ID of checkbox From CheckboxList

问题:

我从 SQL table:

填充一个复选框列表
public static List<string> populateCheckBoxes(string type)
        {
            List<string> items = new List<string>();
            items.Add("");

            SqlConnection conn = new SqlConnection(connectionString);
            SqlCommand sqlcmd;
            switch (type)
            {
                case "referralorsignposting":
                    sqlcmd = new SqlCommand("SELECT * FROM SWApp_List_Equipment WHERE type = 'Referral or Signposting' ORDER BY order_no, name", conn);
                    break;
                case "actionstaken":
                    sqlcmd = new SqlCommand("SELECT * FROM SWApp_List_Equipment WHERE type = 'Actions Taken' ORDER BY order_no, name", conn);
                    break;
                default:
                    sqlcmd = new SqlCommand("SELECT * FROM SWApp_List_Equipment", conn);
                    break;
            }
            SqlDataAdapter da = new SqlDataAdapter(sqlcmd);
            DataTable dt = new DataTable();
            da.Fill(dt);
            foreach (DataRow dr in dt.Rows)
            {
                items.Add(dr["name"].ToString());
                CheckboxIDRecord = dr["id"].ToString();
                //items.Add(dr["VisitTime"] + " " + dr["PropPostcode"]);
            }

            return items;
        }

我已经遍历了 "checkboxlist" 中选择的每个值,这插入了每个选择的值:

foreach (var item in saw.actionsTakenCheckBoxList)
                {   //ADD ACTIONS AND REFERRAL 
                    SqlCommand add = new SqlCommand("INSERT INTO SWApp_CheckboxAnswers (SW_ID, Checkbox_ID, Checkbox_Section, Checkbox_Type, Checkbox_Answer) VALUES(@SW_ID,@Checkbox_ID,@Checkbox_Section,@Checkbox_Type,@Checkbox_Answer) ");
                    add.CommandType = CommandType.Text;
                    add.Connection = sqlcon;
                    add.Parameters.AddWithValue("@SW_ID", "");
                    add.Parameters.AddWithValue("@Checkbox_ID", "");
                    add.Parameters.AddWithValue("@Checkbox_Section", "");
                    add.Parameters.AddWithValue("@Checkbox_Type", "");
                    add.Parameters.AddWithValue("@Checkbox_Answer", "");
                    add.Parameters["@SW_ID"].Value = saw.EntryID.ToString();
                    add.Parameters["@Checkbox_ID"].Value = CheckboxIDRecord.ToString();
                    add.Parameters["@Checkbox_Section"].Value = "SmokeDetectionReferral";
                    add.Parameters["@Checkbox_Type"].Value = "";
                    add.Parameters["@Checkbox_Answer"].Value = item.ToString();
                    sqlcon.Open();
                    add.ExecuteNonQuery();
                    sqlcon.Close();
                }

如您所见,我目前尝试只输入在复选框列表中选择的第一个值的 ID。

目标

目的是插入复选框的值 "name" 以及每个项目的 "id"。

研究:

我尝试按照这篇文章将项目放入一个数组中,但最终得到的是 'Array was out of bounds of the index',这让我看到了第二篇文章。

Pass items from checkboxlist to SQL Server table

Index was out of bounds of array? c# forms

如有任何指导,我将不胜感激。谢谢。

我看到了几个问题,而不是试图纠正它们,这里是关于如何解决这个问题的建议。

可以在我关于 CheckedListBox 和 SQL-Server 的 MSDN 代码示例中看到总体情况,其中包括一个 sql 脚本来生成数据库和数据。

https://code.msdn.microsoft.com/Working-with-CheckedListBox-3b765442?redir=0

取自上面 link 中的 Operations.cs,此方法获取我们的数据(下一个代码块填充 CheckedListBox)

/// <summary>
/// Get all records to show in the CheckedListBox
/// </summary>
/// <returns></returns>
public DataTable GetAll()
{
    var dt = new DataTable();

    using (SqlConnection cn = new SqlConnection { ConnectionString = ConnectionString })
    {
        using (SqlCommand cmd = new SqlCommand { Connection = cn })
        {
            cmd.CommandText = "SELECT id, Description, Quantity, CheckedStatus FROM Products ---WHERE (Quantity > 0)";

            cn.Open();
            dt.Load(cmd.ExecuteReader());

        }
    }

    return dt;

}

表单代码

/// <summary>
/// Load CheckedListBox from database table
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{

    var ops = new Operations();

    // read data from database table
    var dt = ops.GetAll();

    int LastIndex = 0;

    /*
        * Here we iterate the rows in the DataTable while in
        * CoursesCodeSample I set the DataSource of the CheckedListBox
        * to the DataTable. The method shown here has always been the
        * way to go as many indicated that since the DataSource property
        * of the CheckedListBox is not documented it could go away, well
        * many years later it's still here so guess what, it's okay.
        */
    foreach (DataRow row in dt.Rows)
    {
        checkedListBox1.Items.Add(new CheckListBoxItem()
        {
            Description = row.Field<string>("Description"),
            PrimaryKey = row.Field<int>("id"),
            Quantity = row.Field<int>("Quantity"),
            IsDirty = false
        });

        LastIndex = checkedListBox1.Items.Count - 1;
        checkedListBox1.SetItemChecked(LastIndex, row.Field<bool>("CheckedStatus"));

    }

    checkedListBox1.ItemCheck += CheckedListBox1_ItemCheck;

}

来自Opertions.cs - 插入方式

public void Insert(List<CheckListBoxItem> items)
{
    // optionally used for obtaining new primary key
    //int newIdentifier;

    using (SqlConnection cn = new SqlConnection { ConnectionString = ConnectionString })
    {
        using (SqlCommand cmd = new SqlCommand { Connection = cn })
        {
            // uncomment ending select statement and use commented to get new primary key
            cmd.CommandText = "INSERT INTO Products " + 
                "([Description],Quantity,CheckedStatus) " + 
                "VALUES (@Description,@Quantity,@CheckedStatus); " + 
                "-- SELECT CAST(scope_identity() AS int);";

            cmd.Parameters.Add(new SqlParameter()
                { ParameterName = "@Description", SqlDbType = SqlDbType.NVarChar });
            cmd.Parameters.Add(new SqlParameter()
                { ParameterName = "@Quantity", SqlDbType = SqlDbType.Int });
            cmd.Parameters.Add(new SqlParameter()
                { ParameterName = "@CheckedStatus", SqlDbType = SqlDbType.Bit });
            cmd.Parameters.Add(new SqlParameter()
                { ParameterName = "@CategoryIdentifier", SqlDbType = SqlDbType.Int });


            cn.Open();

            foreach (CheckListBoxItem item in items)
            {
                cmd.Parameters["@Description"].Value = item.Description;
                cmd.Parameters["@Quantity"].Value = item.Quantity;
                cmd.Parameters["@CheckedStatus"].Value = item.Checked;


                //newIdentifier = (int)cmd.ExecuteNonQuery();
                if ((int)cmd.ExecuteNonQuery() > -1)
                {
                    // inserted
                }
                else
                {
                    // failed
                }

            }
        }
    }
}

以上是基本的,注释掉的代码显示(如果需要)如何获取新的主键。

调用上面的方法

private void iterateButton_Click(object sender, EventArgs e)
{
    var items = new List<CheckListBoxItem>();

    for (int index = 0; index < checkedListBox1.Items.Count; index++)
    {
        if (((CheckListBoxItem)checkedListBox1.Items[index]).IsDirty)
        {
            items.Add(new CheckListBoxItem()
            {
                PrimaryKey = ((CheckListBoxItem)checkedListBox1.Items[index]).PrimaryKey,
                Checked = checkedListBox1.GetItemChecked(index),
                Description = ((CheckListBoxItem)checkedListBox1.Items[index]).Description
            });
        }
    }

    if (items.Count >0)
    {
        Ops.Insert(items);
    }
}

最后 class 用于填充 CheckedListBox

namespace CheckListBoxFromSQL_Server
{
    public class CheckListBoxItem
    {
        /// <summary>
        /// Identifier for database table
        /// </summary>
        public int PrimaryKey;
        /// <summary>
        /// Display member for CheckedListBox and a field in the table
        /// </summary>
        public string Description;
        public int Quantity;
        /// <summary>
        /// Indicates the checked state in the database table and for setting a Checked item in the CheckedListbox
        /// </summary>
        public bool Checked;
        /// <summary>
        /// Used to determine if a item changed after loaded in the CheckedListBox
        /// </summary>
        public bool IsDirty;
        public override string ToString() { return Description; }
    }
}

希望对您有所帮助

我为要放入复选框列表的项目实现了一个字典。这允许我使用复选框项目中的值,然后使用 INSERT 中的键到 SQL 数据库。

Dictionary<string, string> referral = new Dictionary<string, string>();

加载表单时用字典中的项目填充复选框列表。

private void Section3_Load(object sender, EventArgs e)
        { 
            SqlConnection conn = new SqlConnection(connectionString);
            SqlCommand cmd = new SqlCommand("select Id, name from SWApp_List_Equipment WHERE type = 'referral or signposting' ORDER BY order_no,name", conn);
            conn.Open();
            SqlDataReader dr = cmd.ExecuteReader();

            if (dr.HasRows)
            {
                while (dr.Read())
                {
                    referral.Add(dr["id"].ToString(), dr["name"].ToString());
                }
            }

            foreach (KeyValuePair<string, string> refs in referral)
            {
                box = new CheckBox();
                box.Text = refs.Value.ToString();
                actionsTakenCheckBoxList.Items.Add(box.Text);
                box.CheckedChanged += new EventHandler(this.CheckedChange);
            } 
        }

在表单的关闭按钮上将值插入 table。

private void closeButton_Click(object sender, EventArgs e)
        {
    using (SqlConnection sqlcon = new SqlConnection(connectionString)) {
                    //summary
                    foreach (var item in actionsTakenCheckBoxList.CheckedItems.OfType<string>().ToList())
                    {

                        //ADD ACTIONS AND REFERRAL 
                        SqlCommand add = new SqlCommand("INSERT INTO SWApp_CheckboxAnswers (SW_ID, Checkbox_ID, Checkbox_Section, Checkbox_Type, Checkbox_Answer) VALUES(@SW_ID,@Checkbox_ID,@Checkbox_Section,@Checkbox_Type,@Checkbox_Answer) ");
                        add.CommandType = CommandType.Text;
                        add.Connection = sqlcon;
                        add.Parameters.AddWithValue("@SW_ID", "");
                        add.Parameters.AddWithValue("@Checkbox_ID", "");
                        add.Parameters.AddWithValue("@Checkbox_Section", "");
                        add.Parameters.AddWithValue("@Checkbox_Type", "");
                        add.Parameters.AddWithValue("@Checkbox_Answer", "");
                        add.Parameters["@SW_ID"].Value = entry.entryID.ToString();
                        var myKey = referral.FirstOrDefault(x => x.Value == item.ToString()).Key;
                        add.Parameters["@Checkbox_ID"].Value = myKey;
                        add.Parameters["@Checkbox_Section"].Value = "SmokeDetection";
                        add.Parameters["@Checkbox_Type"].Value = "Referral";
                        add.Parameters["@Checkbox_Answer"].Value = item.ToString();
                        sqlcon.Open();
                        add.ExecuteNonQuery();
                        sqlcon.Close();

                    }
                }
}