如果id存在,则从json插入数据库

时间:2017-08-03 12:57:46

标签: c# json stored-procedures serialization deserialization

我有一个从外部文件中读取的json数据。有时json已经有了特定的id,有时候没有。

我想根据这些id将这个json数据添加到 sql server 数据库中。如果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 book)

我不知道我做错了什么,但我肯定需要帮助。

程序可能有问题,也许这甚至不是检查来自后端(json文件)的id是否存在的好方法..我真的不知道,我对SQL还不是很好。

感谢任何帮助!

PS - 我没有发布JSON序列化和反序列化方法,因为我调试它们时工作得很好

2 个答案:

答案 0 :(得分: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语句并只调用了execute 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

正如我所提到的,您可以在代码中添加错误处理以捕获异常并返回正确的错误消息。

希望这有帮助

答案 1 :(得分:0)

自己找到解决方案。基本上很简单。而不是检查数据库中是否存在id(经过一分钟的思考后很明显它还没有),你检查@openjson(book)中是否存在id。希望这有助于将来的任何人。

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