C# 从DataReader正确加载DataGridView

C# 从DataReader正确加载DataGridView,c#,datagridview,sqldatareader,sqldataadapter,C#,Datagridview,Sqldatareader,Sqldataadapter,阅读文档时,我的印象是以下代码可以工作: using (SqlConnection con = new SqlConnection(Properties.Settings.Default.C_Str)) { try { using (SqlCommand cmd = new SqlCommand("PerformSearch", con)) { cmd.CommandT

阅读文档时,我的印象是以下代码可以工作:

    using (SqlConnection con = new SqlConnection(Properties.Settings.Default.C_Str))
    {
        try
        {
            using (SqlCommand cmd = new SqlCommand("PerformSearch", con))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                string SearchString = textBoxSearchSting.Text;
                cmd.Parameters.Add("SearchString", SqlDbType.VarChar).Value = SearchString;

                con.Open();

                dataGridView1.DataSource = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
        }
        catch (Exception) { throw; }
        finally { con.Close(); }
    }
或者我至少可以使用以下内容:

        using (SqlConnection con = new SqlConnection(Properties.Settings.Default.C_Str))
        {
            try
            {
                using (SqlCommand cmd = new SqlCommand("PerformSearch", con))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    string SearchString = textBoxSearchSting.Text;
                    cmd.Parameters.Add("SearchString", SqlDbType.VarChar).Value = SearchString;

                    con.Open();

                    SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    dataGridView1.DataSource = reader;
                }
            }
            catch (Exception) { throw; }
            finally { con.Close(); }
        }
但是尼瑟没有完成上述工作。使用下面的代码确实有效,但使用相同的搜索值,下面的代码是用我的查询填充datagridview的最佳方法吗?为什么上述两种方法都不行呢

        using (SqlConnection con = new SqlConnection(Properties.Settings.Default.C_Str))
        {
            try
            {
                using (SqlCommand cmd = new SqlCommand("PerformSearch", con))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    string SearchString = textBoxSearchSting.Text;
                    cmd.Parameters.Add("SearchString", SqlDbType.VarChar).Value = SearchString;

                    con.Open();                           

                    DataTable dt = new DataTable();
                    dt.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection));

                    if (dt.Rows.Count > 0 && dt != null)
                    {
                        dataGridView1.DataSource = dt;
                    }
                }
            }
            catch (Exception) { throw; }
            finally { con.Close(); }
        }
下面的方法同样有效,出于任何原因,使用数据适配器会更好吗

        using (SqlConnection con = new SqlConnection(Properties.Settings.Default.C_Str))
        {
            try
            {
                using (SqlCommand cmd = new SqlCommand("PerformSearch", con))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    string SearchString = textBoxSearchSting.Text;
                    cmd.Parameters.Add("SearchString", SqlDbType.VarChar).Value = SearchString;

                    DataTable dt = new DataTable();

                    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                    {
                        con.Open();

                        da.Fill(dt);

                        if (dt.Rows.Count > 0 && dt != null)
                        {
                            dataGridView1.DataSource = dt;
                        }
                    }
                }
            }
            catch (Exception) { throw; }
            finally { con.Close(); }
        }

提示一下,我想using语句会关闭连接。@krekkon在这种情况下,它会,但我只是喜欢在任何时候都保留一个封闭的语句,以防将来我更改某些内容或停止使用这些语句,我不想意外地忘记这一切。对于第一个有效的解决方案,您需要两个
using
语句。对于第二个,您需要
三个
。User214。。。正如您所想,如果这对您更好,那么好吧;)