带有using关键字的SqlDataAdapter

use*_*873 4 c# ado.net dispose using sqldataadapter

这是以下代码健康吗?或者我不需要使用using关键字作为SqlDataAdapter将处理关闭连接?

public static DataSet Fetch(string sp, SqlParameter [] prm)
{
    using (SqlConnection con = new SqlConnection(ConStr))
    {
        using (SqlCommand cmd = con.CreateCommand())
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = sp;
            cmd.Parameters.AddRange(prm);

            using (SqlDataAdapter dta = new SqlDataAdapter(cmd))
            {
                DataSet dst = new DataSet();
                dta.Fill(dst);

                return dst;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

@MarkGravell我在这里需要一个建议,我真的很想使用DataReader,但我一直在寻找使用该using关键字以确保关闭连接.在哪里DataReader我们不能使用它,因为如果我们想要返回DataReader某个方法,它将关闭连接.所以你认为以下技术DataReaderusing关键字一样好:

public static SqlDataReader Fetch(string sp, SqlParameter [] prm)
{
    SqlCommand cmd = new SqlConnection(ConStr).CreateCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = sp;
    cmd.Parameters.AddRange(prm);
    cmd.Connection.Open();

    return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}

using (SqlDataReader dtrPrize = Sql.Fetch("SelectPrize", new SqlParameter[] { new SqlParameter("id", id) }))
{
    dtrPrize.Read();

    Prize prize = new Prize();
    prize.id = (int)dtrPrize[dtrPrize.GetOrdinal("id")];
    prize.artitle = (string)dtrPrize[dtrPrize.GetOrdinal("artitle")];
    prize.entitle = (string)dtrPrize[dtrPrize.GetOrdinal("entitle")];
    prize.ardetail = (string)dtrPrize[dtrPrize.GetOrdinal("ardetail")];
    prize.endetail = (string)dtrPrize[dtrPrize.GetOrdinal("endetail")];
    prize.image = (string)dtrPrize[dtrPrize.GetOrdinal("image")];
    prize.theme = (string)dtrPrize[dtrPrize.GetOrdinal("theme")];
    prize.price = (int)dtrPrize[dtrPrize.GetOrdinal("price")];
    prize.audience = (int)dtrPrize[dtrPrize.GetOrdinal("audience")];
    prize.type = (byte)dtrPrize[dtrPrize.GetOrdinal("type")];
    prize.status = (byte)dtrPrize[dtrPrize.GetOrdinal("status")];
    prize.voucher = (string)dtrPrize[dtrPrize.GetOrdinal("voucher")];
    prize.supplierid = (int)dtrPrize[dtrPrize.GetOrdinal("supplierid")];
    prize.created = (DateTime)dtrPrize[dtrPrize.GetOrdinal("created")];
    prize.updated = (DateTime)dtrPrize[dtrPrize.GetOrdinal("updated")];

    return prize;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 6

健康十岁上下; 我个人想说的不健康位是它利用了比特DataSetDataAdapter,但是这也许是只是我个人的偏见.

是的,你应该在这里处理适配器等(using显然这对你有用).

作为一个无关紧要的小事,你可以叠加usings - 只是让它变得不那么冗长:

using (SqlConnection con = new SqlConnection(ConStr))
using (SqlCommand cmd = con.CreateCommand())
{
Run Code Online (Sandbox Code Playgroud)

  • @voo因为它实现了`IDisposable`,我们已经完成了它.这是足够的理由.除此之外的任何事情都将进入实现细节,我们应该避免.作为一个消费者,它需要归结为:"它是否实现了'IDisposable`?我完成了吗?" (3认同)