如何仅更新与checkedlistbox关联的列?

ogq8wdun  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(222)

我想知道如果表列与checkedlistbox关联,如何更新它们,否则就不更新。
举个例子如下 Permissions 表格:

Name |   Email     | Admin  | Subscribed | Newsletter
-----------------------------------------------------
John | j@email.com |   1    |     0      |      1

最后三列需要根据在checkedlistbox中选中的值进行更新。我知道我通常会对每个指定列执行以下操作:

string myQuery = "UPDATE Permissions SET Admin = @admin, Subscribed = @subscribed, Newsletter = @newsletter WHERE Name = 'John'";
using (SqlConnection myConn = new SqlConnection(someConnectionString)) 
{
    try {
        myConn.Open();
        using (SqlCommand myComm = new SqlCommand(myQuery, myConn)) 
        {
            myComm.Parameters.AddWithValue("@admin", int.Parse(admin.Text));
            myComm.Parameters.AddWithValue("@subscribed", int.Parse(subscription.Text));
            myComm.Parameters.AddWithValue("@newsletter", int.Parse(newsletter.Text));
        }
    }
    catch (Exception ex) 
    {
        MessageBox.Show(ex.Message);
    }
}

但是,这将不适用于 CheckedListBox . 我怎样才能通过一个 CheckedListBox 只更新 Permissions table?

mwyxok5s

mwyxok5s1#

如果需要更新此条目的值,其中其字段名称是checkedlistbox控件的项。
你可以创建 UPDATE 语句并按如下方式执行:

var sql = string.Concat("UPDATE Permissions SET ",
    string.Join(", ", checkedListBox1.Items.Cast<string>()
    .Select((x, i) =>
    $"{x} = {Convert.ToInt32(checkedListBox1.GetItemChecked(i))}")),
    @" WHERE Name = @name");

try
{
    using (var con = new SqlConnection(someConnectionString))
    using (var cmd = new SqlCommand(sql, con))
    {
        con.Open();

        cmd.Parameters.AddWithValue("@Name", "John");
        //Using the Add(..) method instead is highly recommended...
        //Select the correct SqlDbType and length for this field in the DB.
        //cmd.Parameters.Add("@name", SqlDbType.VarChar, 100).Value = "John";

        cmd.ExecuteNonQuery();
    }
}
catch ( Exception ex)
{
    MessageBox.Show(ex.Message);
}

另一种方法是,创建一个sqlparameter类型的数组并使用它来形成 UPDATE 语句,然后将其添加到sqlcommand对象的parameters属性:

var param = checkedListBox1.Items.Cast<string>()
    .Select((x, i) => new SqlParameter
    {
        ParameterName = $"@{x}",
        SqlDbType = SqlDbType.Bit,
        Value = Convert.ToInt32(checkedListBox1.GetItemChecked(i)),
    }).Append(new SqlParameter("@name", "John")).ToArray();

var sql = string.Concat("UPDATE Permissions SET ",
    string.Join(", ",
    param.Take(param.Count() -1)
    .Select(x => $"{x.ParameterName.Substring(1)} = {x.ParameterName}")),
    $@" WHERE Name = {param.Last().ParameterName}");

try
{
    using (var con = new SqlConnection(someConnectionString))
    using (var cmd = new SqlCommand(sql, con))
    {
        con.Open();

        cmd.Parameters.AddRange(param);
        cmd.ExecuteNonQuery();
    }
}
catch ( Exception ex)
{
    MessageBox.Show(ex.Message);
}

另外,考虑使用 WHERE 子句,而不是字符串字段。想象一下当你执行 UPDATE 命令,则在数据库中有多个条目具有相同的值 Name 菲尔德(“约翰”)。

相关问题