【问题标题】:duplicate key value violates unique constraint (primary key)重复键值违反唯一约束(主键)
【发布时间】:2015-07-28 05:43:24
【问题描述】:

您好,我这里有一个程序,它将检查列表框中的检查值存储到数据库中。问题是我总是遇到一个异常,说“重复键值违反了唯一约束 pk_famcon”。我已经尝试过其他替代方案,但它总是会以这种方式结束。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Npgsql;

namespace WindowsFormsApplication1
{
    public partial class Form8 : Form
    {
        public Form8()
        {
            InitializeComponent();
            this.Load += Form8_Load;
            button1.Click += button1_Click;
        }

            DataSet ds = new DataSet();

        private void Form8_Load(object sender, EventArgs e)
        {
            Populate_DataSet();
            FillCheckListBox();
        }

        private void Populate_DataSet()
        {
            string connstring = "Server=localhost;Port=5432;User Id=postgres;Password=021393;Database=postgres;";
            using (NpgsqlConnection conn = new NpgsqlConnection(connstring))
            {
                string conditionName = "SELECT * FROM condition";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(conditionName, conn);
                da.Fill(ds, "conname");
                da.Fill(ds, "conid");
            }
        }

        private void FillCheckListBox()
        {
            DataRow row1 = null;
            int iRowCnt = 0;

            checkedListBox1.Items.Clear();

            foreach (DataRow row_1 in ds.Tables["conname"].Rows)
            {
                row1 = row_1;
                checkedListBox1.Items.Add(ds.Tables["conname"].Rows[iRowCnt][1]);
                iRowCnt = iRowCnt + 1;     
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Data has been saved");
          if (checkedListBox1.Items.Count > 0)
          {
              string connstring = ("Server=localhost;Port=5432;User Id=postgres;Password=021393;Database=postgres;");
              NpgsqlConnection conn = new NpgsqlConnection(connstring);
              conn.Open();

              for (int i = 0; i <= checkedListBox1.CheckedItems.Count - 1; i++)
              {
                  NpgsqlCommand cmd = new NpgsqlCommand("Insert into famhistory(famcon) Values (@famcon)", conn);
                  cmd.Parameters.AddWithValue("@famcon", checkedListBox1.Text);
                  cmd.ExecuteNonQuery();
                  string value = checkedListBox1.CheckedItems[i].ToString(); 
              }
              MessageBox.Show("Data has been saved");
              conn.Close();
          }

        }
    }
}

【问题讨论】:

  • 我必须为此使用分配外键吗?

标签: c# checkedlistbox


【解决方案1】:

看看这个循环:

for (int i = 0; i <= checkedListBox1.CheckedItems.Count - 1; i++)
{
    NpgsqlCommand cmd = new NpgsqlCommand("Insert into famhistory(famcon) Values (@famcon)", conn);
    cmd.Parameters.AddWithValue("@famcon", checkedListBox1.Text);
    cmd.ExecuteNonQuery();
    string value = checkedListBox1.CheckedItems[i].ToString(); 
}

您在循环的每次迭代中都将相同的值 (checkedListBox1.Text) 插入到主键字段中,听它的声音。在最后一条语句之前,您不会使用 i (循环中的索引) - 这只是声明并为立即超出范围的局部变量赋予值。我怀疑你的意思是:

for (int i = 0; i <= checkedListBox1.CheckedItems.Count - 1; i++)
{
    NpgsqlCommand cmd = new NpgsqlCommand("Insert into famhistory(famcon) Values (@famcon)", conn);
    string value = checkedListBox1.CheckedItems[i].ToString(); 
    cmd.Parameters.AddWithValue("@famcon", value);
    cmd.ExecuteNonQuery();
}

除此之外,还有一些值得改变的地方:

  • 循环条件可以更常规地写成:

    for (int i = 0;i

... 或使用 foreach 循环。

  • 您应该每次都使用using 语句来处理您的命令
  • 显式指定参数类型,然后用Value属性设置参数值,一般比较简洁

把这些放在一起,你就有了:

foreach (var item in checkedListBox1.CheckedItems)
{
    using (var cmd = new NpgsqlCommand("Insert into famhistory(famcon) Values (@famcon)", conn)
    {
        cmd.Parameters.Add("@famcon", NpgsqlDbType.Varchar).Value = item.ToString();
        cmd.ExecuteNonQuery();
    }
}

【讨论】:

  • @s_tee 如果答案对您有帮助,请接受。我访问了你的个人资料,你没有接受你收到的任何答案。
猜你喜欢
  • 2011-06-26
  • 2019-05-03
  • 2022-01-13
  • 2020-03-27
  • 2013-06-23
  • 2016-06-12
  • 2013-03-15
  • 2016-11-27
  • 2018-03-14
相关资源
最近更新 更多