如何使用 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&lt;string&gt;(),然后对照null 进行检查(如果没有返回默认值)。最后一种方法的优点是,如果需要,还可以从数据库中获取大小写更正的版本。

【讨论】:

以上是关于如何使用 ADO.NET 从数据库中获取对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 asmx Web 服务管理多个 ado.net 数据库连接

如何使用 ADO.net 在视图中包含相关对象

如何在 ADO.NET 中安全地创建从更改中选择的表的查询?

使用 ADO.NET、Generic 从不同的表中获取 SQL 数据

使用ado.net 如何获取新添记录的自增id值?

ADO.net 如何将数据库单元格变成整数?