如何使用 ADO.NET 从数据库中获取对象?
Posted
技术标签:
【中文标题】如何使用 ADO.NET 从数据库中获取对象?【英文标题】:How to get object from database using ADO.NET? 【发布时间】:2021-11-11 07:22:24 【问题描述】:我想在 ASP.NET WebAPI 中使用 ADO.NET 通过 SQL 查询的用户名检查用户是否存在于数据库中。
就像在 Entity 中一样,有 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,但是我上面没有看到SQL。您确定要 SQL 语言 答案吗? 听起来您需要一个 ADO.NET 教程,而不仅仅是一个查询。 ADO.NET 返回行结果,而不是对象。这段代码已经有严重的错误,它甚至不执行任何查询 例如,连接是短暂的。检索单行根本不需要事务。此代码会泄漏连接并导致大范围阻塞 检查 Basics of ADO.NET 以了解 ADO.NET 的工作原理。 之后你检查Basics of Dapper看看如何简化 感谢您的建议@PanagiotisKanavos 【参考方案1】:首先,请注意 SQL 会因 RDBMS 而异;例如,让我们使用 SQL Server;您想要的查询可能是:
select count(1)
from Users
where UserId = @userId
这将返回匹配记录的数量,其中@userId
是我们想要的参数。现在; ADO.NET 原始 API 复杂 - 老实说,您最好的选择可能是使用 context.Something
上的原始 SQL API 或像 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 的参数。
您可以也在 SQL 中使用exists
做类似的事情,如果这样更可取的话;或者您可以select top 1 UserId
并使用QuerySingleOrDefaultAsync<string>()
,然后对照null
进行检查(如果没有返回默认值)。最后一种方法的优点是,如果需要,还可以从数据库中获取大小写更正的版本。
【讨论】:
以上是关于如何使用 ADO.NET 从数据库中获取对象?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 asmx Web 服务管理多个 ado.net 数据库连接
如何在 ADO.NET 中安全地创建从更改中选择的表的查询?