c# - 如何使用 ADO.NET 从数据库中获取对象?
问题描述
我想使用 ASP.NET WebAPI 中的 ADO.NET 通过 SQL 查询的用户名检查用户是否存在于数据库中。
就像在实体中一样,有 Any() 调用可以完成工作。
private async Task<bool> UserExists(string username)
{
return await context.Contacts.AnyAsync(x => x.UserId == username.ToLower());
}
if (await UserExists(createUserDto.Username))
return BadRequest("Username is taken");
我想做同样的工作,但手动使用 SQL 查询并将该对象存储在 var user 中,最后询问 DB 中是否有用户......(并与该用户进行其他编码)。
我正在传递我想要创建的 CreateUserDtO,以便在 getUserByUserName 的正文中进一步使用属性字符串 userId。UserId 是字符串。
var user = await accountRepository.GetUserById(createUserDto.UserId);
我在 GetUserById(string username) 中打开连接、执行查询、提交/回滚事务和关闭连接。我只想知道我的查询应该如何返回该用户的对象。
public Task<bool> GetUserById(string username)
{
int result = 0;
bool success = false;
string usernameCheck = username.ToLower();
try
{
OpenConnection();
BeginTransaction();
string query = "...";
SqlCommand command = new SqlCommand(query, connection, transaction);
result = "..."
}
catch (Exception ex)
{
_ = log.WriteLine("ERROR : " + ex.Message + "\nStackTrace : " + ex.StackTrace);
}
finally
{
if (result == 1)
{
CommitTransaction();
success = true;
}
else
{
RollbackTransaction();
}
CloseConnection();
}
return success;
}
}
那可能吗?
解决方案
首先,注意 SQL 会因 RDBMS 而异;例如,让我们使用 SQL Server;您想要的查询可能是:
select count(1)
from Users
where UserId = @userId
它将返回匹配记录的数量,@userId
我们想要的参数在哪里。现在; ADO.NET 原始 API 很复杂- 老实说,您最好的选择可能是使用原始 SQL APIcontext.Something
或 Dapper 之类的工具;例如,使用 Dapper:
using var connection = OpenConnection();
var count = await connection.QuerySingleAsync<int>(@"
select count(1)
from Users
where UserId = @userId", new { userId = username.ToLower() });
return count != 0;
请注意,这里我保留ToLower()
了调用站点的语义;中的所有内容都是new {...}
Dapper 传递给 ADO.NET 的参数。
如果更可取,您也可以在exists
SQL 中执行类似的操作;或者你可以select top 1 UserId
使用QuerySingleOrDefaultAsync<string>()
, 并检查它null
(如果没有返回默认值)。最后一种方法的优点是,如果需要,还可以从数据库中获取大小写更正的版本。
推荐阅读
- c++ - 以毫秒为单位将字符串解析为 boost::posix_time::ptime
- jquery - 哪个前端框架适合单页搜索应用?
- python - 具有多个值 Python 的参数
- mysql - SQL LEFT JOIN 与可能的连接条件重复匹配
- azure - 回收时 Azure Web 应用程序密钥保管库异常
- regex - 正则表达式匹配字符串而不是 1
- node.js - SameSite Cookie 属性问题
- php - 批量创建多个 tar 文件的持续时间随着每个批次的增加而增加
- python-3.x - 使用 Keras 的模型类将代码从 TensorFlow 1.x 迁移到 TensorFlow 2.x
- visual-studio-code - VSCode 远程容器开发中的 postCreateCommand 不显示 Azure Cli 输出