2017-08-03 18 views
1

我有從外部文件中讀取的json數據。有時json已經有了一個特定的id,有時候不是。如果id存在,從json插入數據庫

我想添加此json數據到sql server數據庫,基於這些id的。如果id存在,不要創建一個新的,使用現有的(從json)...如果它不存在,創建一個新的id。 (guid)

當我運行我的代碼時,我收到錯誤插入不是有效數字錯誤。

這是我的存儲過程

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 

我的代碼添加數據

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

      }); 
     } 

假名單與一些隨機數據

public List<Book> listOfBooks() 
    { 

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

在這種情況下,加控制

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

,_b是循環值(的foreach書)

我不知道我做錯了,但我肯定需要幫助。

可能是程序有問題,也許這甚至不是一個好方法來檢查後端(json文件)的id是否存在..我真的不知道,我對SQL還不是很好。

任何幫助表示讚賞!

PS - 我不張貼JSON序列化和反序列化的方法,當我調試他們,他們的工作只是罰款

+0

首先,你錯過了在INSERT語句中逗號:INSERT INTO [圖書](ID,標題,作者) –

+0

也是在這裏,我想你的SQL是格式不正確:INSERT INTO(圖書,標題,作者)OUTPUT INSERTED.Id INTO @pkTable –

+0

將一種語言翻譯爲英文只是一個錯字@alaa_sayegh – aiden87

回答

0

找到解決自己。基本上非常簡單。而不是檢查數據庫中是否存在id(經過一分鐘的思考,現在還不是很明顯),則檢查id是否存在於@openjson(book)中。希望將來這可以幫助任何人。

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

您可以在代碼中做它在您檢查是否存在的ID,在你這裏循環

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

如果存在,則創建一個新的guid。

而插入應該很簡單。你寫你的INSERT語句並調用執行SQL語句,或者您還可以通過存儲過程插入和你到底傳遞你的參數,你現在所做的:

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 

正如我所說,你可以添加錯誤處理您的代碼捕獲異常並返回適當的錯誤消息。

希望這有助於

+0

你從字面上複製我的代碼,基本上沒有添加任何東西。關鍵是我的這個基本程序,它總是進入新的指導,無論如何,這意味着我不能用它在上面試圖達到什麼,因爲它會試圖覆蓋它。我也在很多不同的領域使用我的過程,這意味着我更容易一次偶然過程,而不是在其他所有區域更改代碼 – aiden87

+0

是的,我拷貝了你的代碼,並且只做了2個存儲過程中的小改動,不要說你的代碼錯了,我只是建議你這樣做。在代碼中處理id檢查,如果存在,創建一個新的,然後調用插入存儲過程。你不需要改變你當前的SP,你可以用我上面寫的代碼添加一個新的SP。這只是一個建議親愛的:)! –

+0

我不想冒犯任何東西,我的壞處。我很欣賞任何輸入,但我認爲你不是我想要的......希望它能幫助其他任何人!再次感謝 – aiden87

相關問題