Подтвердить что ты не робот

Как заполнить DataTable из хранимой процедуры

Возможный дубликат:
Как получить таблицу из хранимой процедуры в datatable

Я пытаюсь заселить свой datatable. Я создал datatable tmpABCD, но мне нужно заполнить это значениями из хранимой процедуры. Я не могу продолжать дальше.

SqlConnection sqlcon = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString);
sqlcon.Open();
SqlCommand cmd = new SqlCommand("usp_GetABCD", sqlcon);

DataTable dt = new DataTable("tmpABCD");

dt.Columns.Add(new DataColumn("A"));
dt.Columns.Add(new DataColumn("B"));
dt.Columns.Add(new DataColumn("C"));
dt.Columns.Add(new DataColumn("D"));
4b9b3361

Ответ 1

Вам не нужно добавлять столбцы вручную. Просто используйте DataAdapter и просто:

DataTable table = new DataTable();
using(var con = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString))
using(var cmd = new SqlCommand("usp_GetABCD", con))
using(var da = new SqlDataAdapter(cmd))
{
   cmd.CommandType = CommandType.StoredProcedure;
   da.Fill(table);
}

Обратите внимание, что вам даже не нужно открывать/закрывать соединение. Это будет сделано неявно DataAdapter.

Объект соединения, связанный с оператором SELECT, должен быть действительный, но он не должен быть открытым. Если соединение закрыто до вызова Fill, он открывается для извлечения данных, затем закрывается. Если соединение открыто до вызова Fill, оно остается открытым.

Ответ 2

Вместо этого используйте SqlDataAdapter, это намного проще, и вам не нужно определять имена столбцов самостоятельно, они получат имена столбцов из результатов запроса:

using (SqlConnection sqlcon = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString))
{
    using (SqlCommand cmd = new SqlCommand("usp_GetABCD", sqlcon))
    {
        cmd.CommandType = CommandType.StoredProcedure;

        using (SqlDataAdapter da = new SqlDataAdapter(cmd))
        {
            DataTable dt = new DataTable();

            da.Fill(dt);
        }
    }
}

Ответ 3

Используйте SqlDataAdapter, это упростит все.

//Your code to this point
DataTable dt = new DataTable();

using(var cmd = new SqlCommand("usp_GetABCD", sqlcon))
{
  using(var da = new SqlDataAdapter(cmd))
  {
      da.Fill(dt):
  }
}

и ваш DataTable будет иметь информацию, которую вы ищете, до тех пор, пока сохраненная процедура вернет набор данных (курсор).

Ответ 4

Вы можете использовать SqlDataAdapter:

    SqlDataAdapter adapter = new SqlDataAdapter();
    SqlCommand cmd = new SqlCommand("usp_GetABCD", sqlcon);
    cmd.CommandType = CommandType.StoredProcedure;
    adapter.SelectCommand = cmd;
    DataTable dt = new DataTable();
    adapter.Fill(dt);