2009-05-13 6 views
4

Ich versuche, einen Datensatz in eine Tabelle mit Linq einzufügen, aber die gefürchteten Kann nicht eine Einheit mit einem Schlüssel hinzufügen, die Verwendung Fehler zu erhalten, ist bereits inInsertOnSubmit = Kann nicht eine Einheit mit einem Schlüssel hinzufügen, die bereits in Gebrauch ist

'If the same data exists for the same patient in a record less that 21 days old then drop it 
Dim RecordLookup As Integer = 0 
RecordLookup = (From rc In CDEvodb.RISKCHANGEs _ 
    Where rc.NHI = tmpNHI And _ 
    rc.RECDATE > Date.Now.AddDays(-21) And _ 
    rc.BPSYS = Convert.ToDecimal(Drow.Item("BPSYS")) And _ 
    rc.CHOL = Convert.ToDecimal(Drow.Item("CHOL")) And _ 
    rc.HDL = Convert.ToDecimal(Drow.Item("HDL"))).Count() 
If (RecordLookup = 0) Then 
Dim riskchange As New RISKCHANGE 
    riskchange.NHI = Drow.Item("NHI") 
    riskchange.RECDATE = Date.Now.Date() 
    riskchange.RISK = CalculatedRisk 
    riskchange.BPSYS = Drow.Item("BPSYS") 
    riskchange.CHOL = Drow.Item("CHOL") 
    riskchange.HDL = Drow.Item("HDL") 

    Try 
     CDEvodb.RISKCHANGEs.InsertOnSubmit(riskchange) 
    Catch ex As Exception 
     myLogging.OutputError("<" & DateTime.Now.ToString & "> " & "Error - creating risk change record in dataset for patient " & Drow.Item("NHI").ToString() & " - " & ex.Message) 
    End Try 

End If 

Grundsätzlich ich für einen passenden Datensatz auf die Suche in einer Tabelle (nicht das Identity-Feld einschließlich), die weniger als 21 Tage alt ist. Wenn ich keinen finde, erstelle ich eine Instanz einer Zeile und setze sie, um sie einzufügen.

Die Funktion SubmitChanges ruft einige Zeilen ab.

Drow ist eine DataRow aus einem Dataset, das zuvor mit einer SQLClient-Verbindung befüllt wurde (der Grund dafür ist, dass ich noch nicht vollständig auf Linq konvertiert habe, sondern erst jetzt neue Funktionen).

Prost im Voraus.


das ist das erstellen Skript für die Tabelle:

USE [CDEvolution] 

GO

/****** Objekt:. Tabelle [dbo] [RISKCHANGES] Script Date: 05/14.40.15 13/2009 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

SET ANSI_PADDING ON

GO

CREATE TABLE GO [DBO]. [RISKCHANGES] (

[NHI] [varchar](7) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 

[RECDATE] [datetime] NOT NULL, 

[RISK] [numeric](15, 0) NOT NULL, 

[BPSYS] [numeric](15, 0) NOT NULL, 

[CHOL] [numeric](15, 1) NOT NULL, 

[HDL] [numeric](15, 1) NOT NULL, 

[POSTED] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 

[IDENTITY] [uniqueidentifier] NOT NULL CONSTRAINT [DF_RISKCHANGES_IDENTITY] 

DEFAULT (newid()) ,

CONST Raint [PK_RISKCHANGES] PRIMARY KEY CLUSTERED

(

[IDENTITY] ASC 

) MIT (PAD_INDEX = AUS, IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

GO

SET ANSI_PADDING OFF

+0

können Sie das Tabellenschema posten? – RobS

Antwort

9

Wenn Sie Ihren DBML aktualisieren, fügen Sie diese (IsDbGenerated = "true") an das PK Mitglied:

<Column Name="[IDENTITY]" Member="IDENTITY" Type="System.Guid" 
      DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" 
      CanBeNull="false" IsDbGenerated="true"/> 

Es wird SQL zuweisen den Standardwert (newid()) lassen.

Sonst wird es die nicht initialisierte GUID ('00000000-0000-0000-0000-000000000000') senden, was das Problem verursacht, soweit ich das beurteilen kann.

Der andere Option könnte sein, die partielle Klasse zu erweitern und die GUID in der OnCreated() Ereignis initialisieren (was nicht die newid der Säulen nicht verwenden() Standard, aber löst das Problem:

partial class RISKCHANGE 
    { 
     partial void OnCreated() 
     { 
      _IDENTITY = Guid.NewGuid(); 
     } 
    } 

Beachten Sie, dass dieser Wert für bestehende unternehmen (durch eine Abfrage gefüllt) wird mit dem richtigen Wert überschrieben werden, wenn OnLoaded() verarbeitet wurde.

+0

Legende! Arbeitete ein Vergnügen. Dank denen, die beigetragen haben :-) –

0

hey Kevin, schnelle Frage, könnte du sein mb, aber nur, um eine bessere Idee zu bekommen ...

sind irgendwelche der Eigenschaften, die Sie auf Ihrem neuen riskchange-Objekt die Primärschlüsseleigenschaft einstellen?

Was tun Sie noch, bevor Sie SubmitChanges() aufrufen?

prost

EDIT:

dank Kevin. Was ist los mit dieser Linie hier ?:

[IDENTITY] [uniqueidentifier] NOT NULL CONSTRAINT [DF_RISKCHANGES_IDENTITY] 

welche Art von Einschränkung haben Sie auf dem PK ...? Warum sieht es nicht so:

[IDENTITY] [int] IDENTITY(1,1) NOT NULL 

?

BEARBEITEN Hey Kevin. Ich denke, das Problem besteht darin, dass Sie Ihr PK nicht als Identity Specifier festgelegt haben, und so wird das PK nicht automatisch inkrementiert.

das Problem zu beheben, entweder neu erstellen die Tabelle, indem Sie diese Zeile zu ändern:

[IDENTITY] [uniqueidentifier] NOT NULL CONSTRAINT [DF_RISKCHANGES_IDENTITY] 

dazu:

[IDENTITY] [int] IDENTITY(1,1) NOT NULL 

oder, wenn Ihr Mangement Studio verwenden, gehen Sie einfach in das Design von diesem Tisch. Wechseln Sie zu den Eigenschaften dieses Felds und legen Sie im Eigenschaftenfenster (das normalerweise unten angezeigt wird) "Identity Specification" (Is Identity) auf YES fest.

Vergessen Sie nicht, Ihre LINQ 2 SQL DBML auch

+0

Hallo, ich nicht Legen Sie beliebige Eigenschaften für das neue RISKCHANGE-Objekt fest. vor dem SubmitChange() Ich aktualisiere den RISK-Wert in dem anderen Datensatz. Auch der obige Code ist in einer Schleife. Die Idee ist, dass ich alle Zeilen im anderen DataSet durchsuche und sehe, ob ich in der Linq DataContext-Tabelle eine passende Zeile finden kann, die weniger als 21 Tage alt ist.Wenn ich kann dann füge ich die Zeile ein. Hoffe, das hilft –

+0

Oh und die SubmitChange() wird aufgerufen, sobald die Schleife –

+0

gerade Ihre Frage wieder zu lesen ist: wie Sie sehen können, das Skript unten musste ich einen Primärschlüssel so ein Identity-Feld verwendet erstellen. Ich verweise nicht darauf, wenn ich in die Tabelle abfrage und schreibe, soweit ich weiß, wird dies automatisch generiert, wie es als GUIDRow festgelegt ist. –

0

Was ist Ihr Primärschlüssel zu aktualisieren? Und haben Sie noch andere Schlüssel/Einschränkungen auf dem Tisch? Es ist wahrscheinlich einer von denen, die das Problem verursacht. Ich empfehle, die Suche nach übereinstimmenden Datensätzen zu erweitern oder Ihre Einschränkungen zu ändern.

Verwandte Themen