【发布时间】: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