Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重复的键值违反唯一约束(主键)_C#_Checkedlistbox - Fatal编程技术网

C# 重复的键值违反唯一约束(主键)

C# 重复的键值违反唯一约束(主键),c#,checkedlistbox,C#,Checkedlistbox,嗨,我这里有一个程序,它将checkedlistbox中的选中值存储到数据库中。问题是我总是会遇到一个异常,说“重复的键值违反了唯一约束pk_famcon”。我已经尝试过其他替代方法,但最终总是会出现这种情况 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using Sy

嗨,我这里有一个程序,它将checkedlistbox中的选中值存储到数据库中。问题是我总是会遇到一个异常,说“重复的键值违反了唯一约束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();
          }

        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Forms;
使用Npgsql;
命名空间Windows窗体应用程序1
{
公共部分类表单8:表单
{
公共表格8()
{
初始化组件();
此.Load+=表格8_Load;
按钮1.点击+=按钮1\u点击;
}
数据集ds=新数据集();
私有void Form8_加载(对象发送方、事件参数e)
{
填充_数据集();
FillCheckListBox();
}
私有void填充_数据集()
{
string connstring=“服务器=本地主机;端口=5432;用户Id=postgres;密码=021393;数据库=postgres;”;
正在使用(NpgsqlConnection conn=新的NpgsqlConnection(connstring))
{
string conditionName=“选择*来自条件”;
NpgsqlDataAdapter da=新的NpgsqlDataAdapter(conditionName,conn);
da.填写(ds,“conname”);
da.填充(ds,“圆锥曲线”);
}
}
私有void FillCheckListBox()
{
DataRow row1=null;
int-iRowCnt=0;
checkedListBox1.Items.Clear();
foreach(ds.表[“conname”]中的数据行第1行)
{
第1行=第1行;
checkedListBox1.Items.Add(ds.Tables[“conname”].Rows[iRowCnt][1]);
iRowCnt=iRowCnt+1;
}
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
MessageBox.Show(“数据已保存”);
如果(checkedListBox1.Items.Count>0)
{
字符串connstring=(“服务器=本地主机;端口=5432;用户Id=postgres;密码=021393;数据库=postgres;”);
NpgsqlConnection conn=新的NpgsqlConnection(connstring);
conn.Open();
对于(int i=0;i请看这个循环:

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(); 
}
除此之外,还有一些值得改变的事情:

  • 循环条件将更常规地写为:

    对于(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如果答案对您有帮助,请接受。我访问了您的个人资料,您没有接受任何您收到的答案。
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();
    }
}