返回具有空值的条目的存储过程(如果不是)
Stored procedure returning an entry with null values (when it's not)
出于某种原因,当我尝试使用条目的 ID 执行查询(通过 API)时,我获得了包含空属性的访问权限。但是,如果我使用其他属性(除了 ID)执行问题,它具有正确的值。
例如:当我执行(实际存储过程代码)时:
CREATE PROCEDURE [dbo].[spClient_GetById]
@Id int
AS
BEGIN
SELECT *
FROM dbo.Client
WHERE Id = @Id;
END
我得到条目
{
"id": 2,
"firstName": null,
"lastName": null,
"email": null,
"phoneNumber": null,
"houseNum": "1212",
"street": "Downtown",
"state": "WA",
"city": "Vancouver",
"cost": 12000.0000,
"status": "Started",
"eta": 0,
"startDate": null,
"completeDate": null,
"contractorID": 0
}
但是当我在同一数据库上执行以下查询时,
CREATE PROCEDURE [dbo].[spClient_GetByHouse]
@HouseNum nvarchar(10),
@Street nvarchar(50) = null
AS
IF @Street IS NULL
BEGIN
SELECT *
FROM dbo.Client
WHERE HouseNum = @HouseNum;
END
ELSE
BEGIN
SELECT *
FROM dbo.Client
WHERE HouseNum = @HouseNum AND Street LIKE @Street;
END
我得到以下条目(顺便说一句,相同的条目):
{
"id": 2,
"firstName": "This",
"lastName": "That",
"email": "qwe@yahoo.com",
"phoneNumber": "3603602334",
"houseNum": "1212",
"street": "Downtown",
"state": "WA",
"city": "Vancouver",
"cost": 12000.0000,
"status": "Started",
"eta": 0,
"startDate": null,
"completeDate": null,
"contractorID": 1
}
此外,如果我在 SQL 服务器中执行 SQL 代码,它会 returns 所有正确的值。所以,问题是当我通过 API 调用该存储过程时,它在应该的时候返回空值。
此外,名字、姓氏和 phone 数字定义为不允许在架构中出现空值
更多信息:这里是调用查询我的ID存储过程的函数:
public async Task<ClientModel> GetProjectById(int id)
{
var records = await _dataAccess.LoadData<ClientModel, dynamic>("dbo.spClient_GetById", new { Id = id },
_connectionString.SqlConnectionName);
return records.FirstOrDefault();
}
这里是通过其他属性调用查询的函数:
public async Task<ClientModel> GetProjectByHouse(string house, string? street)
{
var p = new { HouseNum = house, Street = street };
var records = await _dataAccess.LoadData<ClientModel, dynamic>("dbo.spClient_GetByHouse", p,
_connectionString.SqlConnectionName);
return trimValues(records.FirstOrDefault());
// return records.FirstOrDefault();
}
这里是 API 函数,用于调用之前的任一函数:
public async Task<IActionResult> Get(int? projectId, string? house, string? street)
{
if (projectId != null)
{
var project = await _clientData.GetProjectById(projectId ?? default(int));
if (project == null)
return NotFound();
return Ok(project);
}
else if (house != null)
{
if (house.Length < 2)
return BadRequest();
var project = await _clientData.GetProjectByHouse(house, street);
if (project == null)
return NotFound();
return Ok(project);
}
else
{
return BadRequest();
}
}
不确定这是否解决了问题(但问题已解决)。我不得不删除旧数据库并重新发布一个新数据库。
出于某种原因,当我尝试使用条目的 ID 执行查询(通过 API)时,我获得了包含空属性的访问权限。但是,如果我使用其他属性(除了 ID)执行问题,它具有正确的值。
例如:当我执行(实际存储过程代码)时:
CREATE PROCEDURE [dbo].[spClient_GetById]
@Id int
AS
BEGIN
SELECT *
FROM dbo.Client
WHERE Id = @Id;
END
我得到条目
{
"id": 2,
"firstName": null,
"lastName": null,
"email": null,
"phoneNumber": null,
"houseNum": "1212",
"street": "Downtown",
"state": "WA",
"city": "Vancouver",
"cost": 12000.0000,
"status": "Started",
"eta": 0,
"startDate": null,
"completeDate": null,
"contractorID": 0
}
但是当我在同一数据库上执行以下查询时,
CREATE PROCEDURE [dbo].[spClient_GetByHouse]
@HouseNum nvarchar(10),
@Street nvarchar(50) = null
AS
IF @Street IS NULL
BEGIN
SELECT *
FROM dbo.Client
WHERE HouseNum = @HouseNum;
END
ELSE
BEGIN
SELECT *
FROM dbo.Client
WHERE HouseNum = @HouseNum AND Street LIKE @Street;
END
我得到以下条目(顺便说一句,相同的条目):
{
"id": 2,
"firstName": "This",
"lastName": "That",
"email": "qwe@yahoo.com",
"phoneNumber": "3603602334",
"houseNum": "1212",
"street": "Downtown",
"state": "WA",
"city": "Vancouver",
"cost": 12000.0000,
"status": "Started",
"eta": 0,
"startDate": null,
"completeDate": null,
"contractorID": 1
}
此外,如果我在 SQL 服务器中执行 SQL 代码,它会 returns 所有正确的值。所以,问题是当我通过 API 调用该存储过程时,它在应该的时候返回空值。
此外,名字、姓氏和 phone 数字定义为不允许在架构中出现空值
更多信息:这里是调用查询我的ID存储过程的函数:
public async Task<ClientModel> GetProjectById(int id)
{
var records = await _dataAccess.LoadData<ClientModel, dynamic>("dbo.spClient_GetById", new { Id = id },
_connectionString.SqlConnectionName);
return records.FirstOrDefault();
}
这里是通过其他属性调用查询的函数:
public async Task<ClientModel> GetProjectByHouse(string house, string? street)
{
var p = new { HouseNum = house, Street = street };
var records = await _dataAccess.LoadData<ClientModel, dynamic>("dbo.spClient_GetByHouse", p,
_connectionString.SqlConnectionName);
return trimValues(records.FirstOrDefault());
// return records.FirstOrDefault();
}
这里是 API 函数,用于调用之前的任一函数:
public async Task<IActionResult> Get(int? projectId, string? house, string? street)
{
if (projectId != null)
{
var project = await _clientData.GetProjectById(projectId ?? default(int));
if (project == null)
return NotFound();
return Ok(project);
}
else if (house != null)
{
if (house.Length < 2)
return BadRequest();
var project = await _clientData.GetProjectByHouse(house, street);
if (project == null)
return NotFound();
return Ok(project);
}
else
{
return BadRequest();
}
}
不确定这是否解决了问题(但问题已解决)。我不得不删除旧数据库并重新发布一个新数据库。