2017-08-03 1 views
1

Ich habe eine JSON-Daten, die ich von externen Dateien gelesen. Manchmal hat JSON bereits eine spezifische ID, manchmal nicht.einfügen in die Datenbank von JSON, wenn ID existiert

Ich möchte diese JSON-Daten in SQL Server Datenbank, basierend auf diesen IDs hinzufügen. Wenn die ID existiert, erstellen Sie keine neue, verwenden Sie eine existierende (aus json) ... wenn sie nicht existiert, erstellen Sie eine neue ID. (guid)

Wenn ich meinen Code ausführen, bekomme ich Fehler einfügen ist keine gültige Nummer Fehler.

Das ist meine gespeicherte Prozedur

CREATE PROCEDURE dbo.Book_Insert 
    @book NVARCHAR(MAX), 
    @id uniqueidentifier 
AS 
BEGIN 
    --if id exists from json (backend code) 
    IF EXISTS (SELECT * FROM [Book] WHERE Id = @id) 
    BEGIN  
     INSERT INTO [Book] (Id, [Title], Author) 
     SELECT Id, [Title], Author 
      FROM OPENJSON(@book) 
      WITH (Id uniqueidentifier, 
       [Title] nvarchar(255), 
       Author nvarchar (255)) 
    END 
    ELSE 
    --if id doesn't exist yet 
     BEGIN 
     DECLARE @book_Id char(36) 
     DECLARE @pkTable TABLE (NewPK UNIQUEIDENTIFIER) 

     INSERT INTO [Book] (Title], Author) OUTPUT INSERTED.Id INTO @pkTable 
     SELECT [Title], Author 
      FROM OPENJSON(@book) 
      WITH ([Title] nvarchar(255), 
       Author nvarchar (255),) 
      SET @book_Id = (SELECT * FROM @pkTable) 
      SELECT @book_Id as ID; 
     END 
END 

Mein Code für das Hinzufügen von Daten

public Task<Book> InsertBook(Book book) 
     { 
      return _dbManager.ExecuteStoredProcedureAsync<Book>("Book_Insert", new Dictionary<string, object>() { 
       { "@book", JsonConvert.SerializeObject(book, jsonSerializerSettings)}, 
       { "@id", book.Id}, 

      }); 
     } 

gefälschte Liste mit einigen Zufallsdaten

public List<Book> listOfBooks() 
    { 

     var bookList = new List<Book> 
     { 
      new Book 
      { 
       Id = Guid.NewGuid(), 
       Title = "Song of ice and fire", 
       Author = "unknown" 
      } 
     }; 
     return bookList; 
    } 
hinzufügen

Steuer

Book _book = new Book(); 
_book = await _bookInterface.InsertBook(new Book() 
       { 
        Id = _b.Id, //id exists here 
        Title = _b.Title, 
        Author = _b.Author, 
       }); 

in diesem Fall _b geschlungen Wert (foreach Buch)

Ich weiß nicht, was ich falsch mache, aber ich definitiv Hilfe benötigen.

Vielleicht etwas falsch mit der Prozedur, vielleicht ist dies nicht einmal eine gute Möglichkeit zu überprüfen, ob ID aus Backend (JSON-Datei) existiert..ich weiß nicht wirklich, ich bin nicht so gut mit SQL noch.

Jede Hilfe wird geschätzt!

PS - Ich bin Entsendung nicht JSON Serialisierung und Deserialisierung Methoden wie wenn ich sie debuggen sie gut funktionieren

+0

vor allem, verpassten Sie ein Komma in der Insert-Anweisung: INSERT INTO [Buch] (Id, Titel, Autor) –

+0

hier auch, ich glaube, Ihre SQL nicht gut formatiert ist: INSERT INTO (Buch, Titel , Autor) OUTPUT INSERTED.Id IN @pkTable –

+0

es ist nur ein Tippfehler beim Übersetzen von einer Sprache in Englisch @alaa_sayegh – aiden87

Antwort

0

Gefunden Lösung selbst. Grundsätzlich sehr einfach. Anstatt zu überprüfen, ob die ID in der Datenbank existiert (was nach einer Minute des Nachdenkens offensichtlich war), überprüfen Sie, ob die ID in @openjson (book) existiert. Hoffe das hilft in Zukunft jedem.

DECLARE 
    @id UNIQUEIDENTIFIER, 
    SELECT @id =Id 
    FROM OPENJSON(@book) 
     WITH (Id uniqueidentifier) 
1

Sie es in dem in Code tun können Sie überprüfen, ob die ID, hier in der Schleife vorhanden

Book _book = new Book(); 
_book = await _bookInterface.InsertBook(new Book() 
       { 
        Id = _b.Id, //id exists here 
        Title = _b.Title, 
        Author = _b.Author, 
       }); 

Und wenn es existiert, dann erstellen Sie eine neue Guid.

Und einfügen sollte sehr einfach sein. Sie schreiben Ihre Insert-Anweisung und rufen Sie einfach SQL-Anweisung ausführen, oder Sie können nach wie vor eine gespeicherte Prozedur einfügen durch und Sie geben Ihre Parameter genau so, wie Sie jetzt gerade sind:

CREATE PROCEDURE dbo.Book_Insert 
    @title NVARCHAR(MAX), 
    @author NVARCHAR(MAX), 
    @id uniqueidentifier 
AS 
BEGIN  
     INSERT INTO dbo.[Book] (Id, Title, Author) values (@id, @title, @author) 
END 

Wie bereits erwähnt, können Sie Fehler hinzufügen, im Umgang mit Ihr Code, um die Ausnahmen abzufangen und die korrekten Fehlermeldungen zurückzugeben.

this helps

+0

Sie buchstäblich meinen Code kopiert und im Grunde nichts hinzugefügt. Der Punkt ist diese grundlegende Prozedur von mir, es tritt immer neue Guid ein, egal was, was bedeutet, dass ich es nicht verwenden kann, was ich versuche, oben zu erreichen, weil es versuchen wird, es zu überschreiben. Ich benutze auch meine Prozedur in vielen verschiedenen Bereichen, was bedeutet, dass es für mich einfacher ist, einmal zu verfahren, als Code in allen anderen Bereichen zu ändern. – aiden87

+0

ja, ich habe Ihren Code kopiert und nur 2 kleine Änderungen in der gespeicherten Prozedur, ich didn sag nicht, dass dein Code falsch ist, ich habe dir nur vorgeschlagen, es auf diese Weise zu machen. Behandeln Sie die ID-Prüfung im Code und erstellen Sie, falls vorhanden, eine neue und rufen Sie dann die gespeicherte Prozedur insert auf. Sie müssen Ihren aktuellen SP nicht ändern, Sie können einen neuen SP mit dem oben beschriebenen Code hinzufügen. Es ist nur ein Vorschlag, liebe :)! –

+0

Ich habe nicht versucht, beleidigend oder so zu sein, mein Schlechter. Ich schätze jede Eingabe, aber ich glaube nicht, dass deins nicht das ist, wonach ich suche ... hoffentlich wird es jedem anderen helfen, tho! Danke noch einmal – aiden87

Verwandte Themen