首页 > 解决方案 > 如何使用 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;
        }

}

那可能吗?

标签: c#sqlado.net

解决方案


首先,注意 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 的参数。

如果更可取,您也可以existsSQL 中执行类似的操作;或者你可以select top 1 UserId使用QuerySingleOrDefaultAsync<string>(), 并检查它null(如果没有返回默认值)。最后一种方法的优点是,如果需要,还可以从数据库中获取大小写更正的版本。


推荐阅读