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();
}
}
}
问题:
我从 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();
}
}
}