如何使用 Web API 将数组从 SQL 服务器数据库传递?
How to pass an array from to SQL Server database using Web API?
我试图将我的数组传递给 SQL 服务器,但我只能得到一个 NULL 值,如果我试图添加一个 table 行并传递它,我只会收到数据库中有 1 行。
Here is the console log when I pass the array to SQL
这是我 post 我的数组 SQL:
postButton(data) {
return this.http.post(environment.baseURL + 'PropertyTransactionDetails/Add', data)
}
这是我的模型:
public class PropertyTransactionDetailsDTO
{
public int Id { get; set; }
public string PropertyNumber { get; set; }
public string PropertyDescription { get; set; }
public string DeliveryReceiptNumber { get; set; }
}
这是我的存储库:
public async Task<PropertyTransactionDetailsDTO> Insert(PropertyTransactionDetailsDTO item)
{
PROPERTYTRANSACTIONDETAILS data = MapToEntity(item);
_ctx.Entry(data).State = EntityState.Added;
await _ctx.SaveChangesAsync();
return item;
}
还有我的控制器:
[HttpPost("Add")]
public async Task<ActionResult<PropertyTransactionDetailsDTO>> Add([FromBody] PropertyTransactionDetailsDTO item)
{
if (item == null)
item = new PropertyTransactionDetailsDTO();
return Ok(await _PropertyTransactionDetailsRepository.Insert(item));
}
This is what I get
从您共享的代码来看,您正在向后端发送一个数组,但后端需要一个对象。
从前端解决这个问题的一种方法是(假设数据确实是一个数组,并且您正在订阅 pushButton 的结果):
function pushButton(data){
let tasks: Observable<any>[] = [];
data.ItemRec.forEach((item, index) => {
tasks.push(this.http.post(environment.baseURL + 'PropertyTransactionDetails/Add', item))
});
return concat(...tasks)
}
如果您在 Angular 项目中定义了类型,那么您可以将任何类型更改为该类型。
希望对您有所帮助。
最小工作示例:https://stackblitz.com/edit/typescript-dspi9k?file=index.ts
根据讨论,向前迈出的最小一步是将 onSave() 函数更改为:
onSave(){
console.log("onSave():",this.receivedPropertyForm.value);
this.receivedPropertyForm.value.ItemRec.forEach(prop=>{
this.micro.pushButton(prop).subscribe({next:(res)=>{console.log("After storing record:",res) } })
});
}
在值 属性 中,您有一个 ItemRec 数组。使用 forEach() 您将寻址该数组中的每个 属性 并将其发送到数据库。请注意,这不是所需的最终状态,但它会起作用。看看 RxJS:https://rxjs.dev/guide/overview
我试图将我的数组传递给 SQL 服务器,但我只能得到一个 NULL 值,如果我试图添加一个 table 行并传递它,我只会收到数据库中有 1 行。
Here is the console log when I pass the array to SQL
这是我 post 我的数组 SQL:
postButton(data) {
return this.http.post(environment.baseURL + 'PropertyTransactionDetails/Add', data)
}
这是我的模型:
public class PropertyTransactionDetailsDTO
{
public int Id { get; set; }
public string PropertyNumber { get; set; }
public string PropertyDescription { get; set; }
public string DeliveryReceiptNumber { get; set; }
}
这是我的存储库:
public async Task<PropertyTransactionDetailsDTO> Insert(PropertyTransactionDetailsDTO item)
{
PROPERTYTRANSACTIONDETAILS data = MapToEntity(item);
_ctx.Entry(data).State = EntityState.Added;
await _ctx.SaveChangesAsync();
return item;
}
还有我的控制器:
[HttpPost("Add")]
public async Task<ActionResult<PropertyTransactionDetailsDTO>> Add([FromBody] PropertyTransactionDetailsDTO item)
{
if (item == null)
item = new PropertyTransactionDetailsDTO();
return Ok(await _PropertyTransactionDetailsRepository.Insert(item));
}
This is what I get
从您共享的代码来看,您正在向后端发送一个数组,但后端需要一个对象。
从前端解决这个问题的一种方法是(假设数据确实是一个数组,并且您正在订阅 pushButton 的结果):
function pushButton(data){
let tasks: Observable<any>[] = [];
data.ItemRec.forEach((item, index) => {
tasks.push(this.http.post(environment.baseURL + 'PropertyTransactionDetails/Add', item))
});
return concat(...tasks)
}
如果您在 Angular 项目中定义了类型,那么您可以将任何类型更改为该类型。
希望对您有所帮助。
最小工作示例:https://stackblitz.com/edit/typescript-dspi9k?file=index.ts
根据讨论,向前迈出的最小一步是将 onSave() 函数更改为:
onSave(){
console.log("onSave():",this.receivedPropertyForm.value);
this.receivedPropertyForm.value.ItemRec.forEach(prop=>{
this.micro.pushButton(prop).subscribe({next:(res)=>{console.log("After storing record:",res) } })
});
}
在值 属性 中,您有一个 ItemRec 数组。使用 forEach() 您将寻址该数组中的每个 属性 并将其发送到数据库。请注意,这不是所需的最终状态,但它会起作用。看看 RxJS:https://rxjs.dev/guide/overview