Get a single record from SQL Server the correct way

前端 未结 3 1531
孤独总比滥情好
孤独总比滥情好 2021-02-15 16:52

I\'m using Ado to retrieve a single record by id. Observe:

public async Task GetImage(int id)
{
    var image = new Image();

    using (SqlConnecti         


        
3条回答
  •  心在旅途
    2021-02-15 17:08

    I would go with your current approach, except that I'd eliminate the while loop. If you want to ensure that only one record is returned, perform an extra Read to ensure it returns false. This is similar to the semantics of the LINQ Single operator.

    if (!reader.Read())        
        throw new InvalidOperationException("No records were returned.");
    
    image.Id = reader.GetInt32(ordId);
    image.Name = reader.GetString(ordName);
    image.Path = reader.GetString(ordPath);
    
    if (reader.Read())
        throw new InvalidOperationException("Multiple records were returned.");
    

    Assuming that the id column in your database is a primary key (unique), there is no need to specify a TOP clause in the SQL query; the SQL Server query optimizer would deduce that only at most one record is returned due to the WHERE clause. However, if you don't have a primary key or unique index/constraint on the id column, then you should issue a TOP (2) clause to restrict the number of returned rows. You should avoid using TOP (1) because you would be unable to detect (and raise an error for) extra matches.

    string sql = @"SELECT TOP (2) * FROM Images WHERE id = @id"
    

提交回复
热议问题