我有一个SQL Server和c# (ASP. net)之间的日期时间问题。. NET Core Web API)模型
这是我的模型:public string Text { get; set; }
public int StatusId { get; set; }
public DateTime CreatedAt { get; set; }
下面是我的SQL查询:
SELECT
StatusId,
(FORMAT(DS.CreatedAt, 'dd/MM/yyyy - hh:mm:ss')) AS CreatedAt,
DS.CreatedBy, S.[Text]
FROM
[Inspection].[Dossier_Status] DS
INNER JOIN
[DT_Inspection].[Status] S ON S.Id = StatusId
WHERE
DossierId = 'efb8702d-15cc-4503-8198-1dbca3f28bc6'
ORDER BY
DS.CreatedAt DESC
在控制器中运行此查询后,CreatedAt
属性将具有如下值:
0001-01-01T00:00:00
但是我们应该有
06/09/2021 - 12:00:02
最后,在控制器中完成工作的方法,
string Sql = "SELECT StatusId, (FORMAT(DS.CreatedAt, 'dd/MM/yyyy - hh:mm:ss')), DS.CreatedBy, S.[Text] " +
" FROM[Inspection].[Dossier_Status] DS " +
"INNER JOIN [DT_Inspection].[Status] S ON S.Id = StatusId " +
"WHERE DossierId = '" + DossierId + "' " +
"ORDER BY DS.CreatedAt DESC";
using var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled);
await using var sqlConnection = new SqlConnection(configuration.GetConnectionString("DefaultConnection"));
var result = await sqlConnection.QueryAsync<Dossier_StatusVUE>(Sql);
如何以所需的格式返回SQL属性CreatedAt
?
不存在"格式化日期时间"这回事。如果格式化一个DateTime值,它不再是一个DateTime;它只是一个字符串。通常,您应该从数据库返回一个普通的(无格式的)DateTime值到模型中,并让视图处理任何格式化需求。即使对于Web API场景也是如此,其中视图可能只是JSON。
因此,在问题中,您看到坏值,因为模型期望DateTime
,但我们提供了一个字符串,它无法解析它。我们可以通过从SQL中删除FORMAT
调用来修复此问题,并让它返回实际的DateTime,如下所示:
string Sql = "SELECT StatusId, DS.CreatedAt, DS.CreatedBy, S.[Text] " +
" FROM[Inspection].[Dossier_Status] DS " +
"INNER JOIN [DT_Inspection].[Status] S ON S.Id = StatusId " +
"WHERE DossierId = @Dossier_ID " +
"ORDER BY DS.CreatedAt DESC";
using var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled);
await using var sqlConnection = new SqlConnection(configuration.GetConnectionString("DefaultConnection"));
var result = await sqlConnection.QueryAsync<Dossier_StatusVUE>(Sql, new {Dossier_ID = DossierID});
现在正确的值应该进入result
变量,同时我们修复了讨厌的sql注入问题。