C#如何使用主键在数据库中插入多行

时间:2011-04-16 12:09:30

标签: c# database

每月一次,我会收到一个xml文件,其中包含上个月的客户账单。我需要将这些信息存储在数据库中。我有一个名为transactions的表。我的主要关键是customers_nr。目前,当我插入数据时,我收到错误

  

violoation to primary key ......

我正在使用桌面适配器进行插入。基本上我只需要用信息来填充数据库。那么有没有处理这个的命令?或者我应该怎么做

信息的例子

customer_nr: 12345
Billing_name: Microsoft
Billing_city: Seattle
Billing_amount 300
Billing_name: Mcdonalds
Billing_city: Seattle
Billing_amount 25

customer_nr: 4321
Billing_name: Ikea
Billing_city: New York
Billing_amount 1200

3 个答案:

答案 0 :(得分:2)

错误表示您的主键至少有两个记录的重复值。

请记住,主键强制其中的数据具有唯一性。

因此您无法在具有相同主键值的表中插入两条记录。您可以将主键更改为新字段(例如自动编号字段),以便从旧的主键字段中删除唯一性约束,然后可以在其中插入重复项!

答案 1 :(得分:0)

使用客户编号显然不是唯一值,这意味着它不能用作主键。

创建IDENTITY列,或使用GUID newsequentialid()(首先作为字段默认值)来获得表格中的唯一键。


示例:

您的数据库结构如下:

  • TransactionID(这是新字段uniqueidentifer,其中newsequentialid()为默认值)
  • Customer_Nr
  • Billing_name
  • Billing_city
  • Billing_amount
  • Billing_name
  • Billing_city
  • Billing_amount

然后你会按如下方式进行:

INSERT INTO transactions (Customer_Nr, Billing_name, Billing_city, Billing_amount)
VALUES ('12345', 'Microsoft', 'Seattle', 300);

如您所见,由于自动生成(唯一)主键值,您无需更改任何带代码的代码。


关于newsequentialid()的说明是,如果您的数据需要安全/隐私,请不要使用newsequentialid(),因为猜测序列是微不足道的。

答案 2 :(得分:0)

结算日期时间我更适合此关系中的主键,alt。 customer_nr + billing_datetime。

如果您没有任何日期和时间进行结算,或者只知道月份,则可以将customer_nr,year,month用作复合主键。