【问题标题】:How to get object from database using ADO.NET?如何使用 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

标签: c# sql ado.net


【解决方案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 进行检查(如果没有返回默认值)。最后一种方法的优点是,如果需要,还可以从数据库中获取大小写更正的版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    相关资源
    最近更新 更多