【问题标题】:saving multiple checkedlistbox values in one single row database using c#使用c#将多个checkedlistbox值保存在一个单行数据库中
【发布时间】:2015-08-04 12:47:28
【问题描述】:

是否可以在数据库的一个单元格中存储多个值? 根据下图famcon列,即使用户选择了多个值,也只能插入checkedlistbox中的一个值。

这是我对该表的查询:

foreach (DataRowView item in this.checkedListBox1.CheckedItems)
            {
                NpgsqlCommand cmd = new NpgsqlCommand("Insert into name (eid, name, famcon) SELECT @eid, @name, @famcon", conn);
                cmd.Parameters.AddWithValue("@eid", textBox1.Text);
                cmd.Parameters.AddWithValue("@name", textBox2.Text);
                string[] value = item.Row[0].ToString().Split(',');
                cmd.Parameters.AddWithValue("@famcon", value);

                cmd.ExecuteNonQuery();
            }

【问题讨论】:

  • 您有 2 个解决方案:1) 将所有 CheckedListBox Checked 值存储为字符串(如果项目数低于 32,则存储为整数)。 2) 创建一个辅助表来为每条记录存储一个值,外键引用表的主键 (eid)。
  • @Graffito 我应该在查询中使用 INSERT..SELECT 吗?
  • 获取数据库服务器分配的AutoIncrement值的SQL语句不同。你用的是什么数据库?
  • 我正在使用 postgresql 数据库
  • 还将 ExecuteNonQuery() 替换为 ExecuteScalar() 并将结果转换为 int。

标签: c# postgresql


【解决方案1】:

您没有将string[] value 的元素添加到您的字段中。试试:

string[] value = item.Row[0].ToString().Split(',');
string insert="";
foreach (string s in value)
{
  insert=" "+s;
}    
cmd.Parameters.AddWithValue("@famcon", insert);

【讨论】:

  • 出现错误:重复键违反唯一约束“pk_eid”。我忘了提到'eid'是一个主键。对此感到抱歉。
  • 如果您的主键是 autoIncrement,请不要将其包含在 INSERT 命令中,而是根据数据库(Oracle、MsAccess、MySQL、SQL Server 等)通过 SQL 语句获取它
【解决方案2】:

您可以使用bitset 类型,它在字符串中设置位置标志。

每个位都代表一个单独的值,但您必须维护位和值之间的链接 - 即哪个位是哪个。

也可以使用空格或逗号分隔的字符串。每个字符串都是一个人类可读的代码,代表一个值。您必须解析字符串,但它比位值更容易阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2016-01-26
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2020-02-02
    相关资源
    最近更新 更多