2017-08-03 16 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

相关问题