【问题标题】:insert into database from json if id exists如果 id 存在,则从 json 插入数据库
【发布时间】:2017-08-03 12:57:46
【问题描述】:

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

我想根据这些 id 将此 json 数据添加到 sql server 数据库中。如果 id 存在,不要创建一个新的,使用现有的(来自 json)...如果它不存在,创建一个新的 id。 (指导)

当我运行我的代码时,我收到错误 insert is not a valid number 错误。

这是我的存储过程

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 序列化和反序列化方法,因为当我调试它们时它们工作得很好

【问题讨论】:

  • 首先,您在插入语句中漏掉了一个逗号:INSERT INTO [Book] (Id, Title, Author)
  • 也在这里,我认为您的 sql 格式不正确:INSERT INTO (Book, Title, Author) OUTPUT INSERTED.Id INTO @pkTable
  • 这只是从一种语言翻译成英文时打错了@alaa_sayegh
  • 你能描述一下你的存储过程应该做什么吗?如果找不到id??
  • 插入相同的数据,但创建新的 guid @alaa_sayegh

标签: c# json stored-procedures serialization deserialization


【解决方案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。

并且插入应该非常简单。您编写插入语句并调用执行 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

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

希望对你有帮助

【讨论】:

  • 你从字面上复制了我的代码,基本上没有添加任何东西。关键是我的这个基本程序,无论如何它总是进入新的 guid,这意味着我不能在上面试图实现的目标上使用它,因为它会试图覆盖它。我还在许多不同的领域使用我的程序,这意味着我更容易获得一次程序,而不是在所有其他领域更改代码
  • 是的,我复制了您的代码,并且只对存储过程进行了 2 处小的更改,我没有说您的代码有误,我只是建议您这样做。处理代码中的 id 检查,如果存在,则创建一个新的,然后调用插入存储过程。你不需要改变你当前的SP,你可以用我上面写的代码添加一个新的SP。亲爱的,这只是一个建议:)!
  • 我并不想冒犯或任何事情,我的错。我感谢任何意见,但我不认为你的不是我要找的...希望它会帮助其他人寿!再次感谢
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-24
    • 2016-11-19
    • 2020-06-17
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多