我有一个从外部文件中读取的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序列化和反序列化方法,因为我调试它们时工作得很好
答案 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)