2013-09-19 4 views
21

Я пишу хранимую процедуру, которая в настоящее время содержит только запрос SELECT. Он будет расширен, чтобы сделать ряд других вещей, поэтому он должен быть хранимой процедурой, но на данный момент это простой запрос.Возврат результата из запроса запроса в хранимой процедуре в список

Что-то вроде этого:

SELECT name, occupation, position 
FROM jobs 
WHERE ... 

Я ищу, чтобы вернуть результаты этого запроса для использования в C#. Я хочу добавить его в список, чтобы связать его с компонентом GridView.

Я не знаю, как это сделать. Если мне нужно вставить его в список после возвращения всех выбранных данных, тогда все в порядке, мне просто нужно знать, как правильно возвращать данные, чтобы я мог это сделать.

Если я могу вернуть его в формате, который может быть вставлен прямо в список, тем не менее, это было бы идеально.

+3

Почему это должен быть список? Верните стандартный компонент ADO.NET (DataTable, DataReader) и привяжите к нему свою сетку. Есть много учебников онлайн, как это сделать. Например. https://www.google.com/search?q=C%23+ADO.NET+GridView+Bind вы увидите много вещей, таких как http://www.java2s.com/Code/ASP/ADO. net-Database/BindSqlDataReadertoGridView.htm –

+0

Это было бы гораздо лучшим решением! Однако мне придется посмотреть, как вернуть эти строки из хранимой процедуры. Знаете ли вы, как это сделать? – muttley91

+0

Просто посмотрите на пример во второй ссылке - он делает именно это - открывает соединение, извлекает данные и связывает их с GridView1. Он использует запрос SELECT, но его легко настроить для обработки хранимой процедуры. –

ответ

28

В хранимой процедуре, вам просто нужно написать запрос на выборку, как ниже:

CREATE PROCEDURE TestProcedure 
AS 
BEGIN 
    SELECT ID, Name 
    FROM Test 
END 

На стороне C#, вы можете получить доступ с помощью считывателя, DataTable адаптер.

Использование адаптера только что объяснено Susanna Floora.

Использование Читатель:

SqlConnection connection = new SqlConnection(ConnectionString); 

command = new SqlCommand("TestProcedure", connection); 
command.CommandType = System.Data.CommandType.StoredProcedure; 
connection.Open(); 
reader = command.ExecuteReader(); 

List<Test> TestList = new List<Test>(); 
Test test; 

while (reader.Read()) 
{ 
    test = new Test(); 
    test.ID = int.Parse(reader["ID"].ToString()); 
    test.Name = reader["Name"].ToString(); 
    TestList.Add(test); 
} 

gvGrid.DataSource = TestList; 
gvGrid.DataBind(); 

Использование DataTable:

SqlConnection connection = new SqlConnection(ConnectionString); 

command = new SqlCommand("TestProcedure", connection); 
command.CommandType = System.Data.CommandType.StoredProcedure; 
connection.Open(); 

DataTable dt = new DataTable(); 

dt.Load(command.ExecuteReader()); 
gvGrid.DataSource = dt; 
gvGrid.DataBind(); 

Я надеюсь, что это поможет. :)

+0

Я бы добавил 'reader.Close()', иногда открытый читатель вызывает исключения в следующем коде. –

+0

Это всего лишь пример, однако вы всегда должны убирать такие вещи в блоке finally, включая sqlconnection. –

2
SqlConnection con = new SqlConnection("Data Source=DShp;Initial Catalog=abc;Integrated Security=True"); 
SqlDataAdapter da = new SqlDataAdapter("data", con); 

da.SelectCommand.CommandType= CommandType.StoredProcedure; 

DataSet ds=new DataSet(); 

da.Fill(ds, "data"); 
GridView1.DataSource = ds.Tables["data"]; 
GridView1.DataBind(); 
2
SqlConnection connection = new SqlConnection(ConnectionString); 

command = new SqlCommand("TestProcedure", connection); 
command.CommandType = System.Data.CommandType.StoredProcedure; 

connection.Open(); 

DataTable dt = new DataTable(); 

dt.Load(command.ExecuteReader()); 

gvGrid.DataSource = dt; 
gvGrid.DataBind(); 
0

У меня был тот же вопрос, мне потребовались годы, чтобы найти простое решение.

Использование ASP.NET MVC 5 и EF 6:

При добавлении хранимой процедуры в вашей .edmx модели, результат хранимой процедуры будет доставлен через автоматически генерируемой объект под названием yourStoredProcName_result.

Этот объект _result содержит атрибуты, соответствующие столбцам в базе данных, выбранным вашей хранимой процедурой.

_result класс может быть просто конвертированы в список:

yourStoredProcName_result.ToList() 
0

Может быть это поможет:

Получение строки из БД:

public static DataRowCollection getAllUsers(string tableName) { 


     DataSet set = new DataSet(); 

     SqlCommand comm = new SqlCommand(); 

     comm.Connection = DAL.DAL.conn; 

     comm.CommandType = CommandType.StoredProcedure; 

     comm.CommandText = "getAllUsers"; 

     SqlDataAdapter da = new SqlDataAdapter(); 

     da.SelectCommand = comm; 

     da.Fill(set,tableName); 

     DataRowCollection usersCollection = set.Tables[tableName].Rows; 

     return usersCollection; 

     } 

Populating DataGridView из DataRowCollection:

public static void ShowAllUsers(DataGridView grdView,string table, params string[] fields) { 


      DataRowCollection userSet = getAllUsers(table); 
      foreach (DataRow user in userSet) 
      { 

       grdView.Rows.Add(user[fields[0]], 
        user[fields[1]], 
        user[fields[2]], 
        user[fields[3]]); 

      } 


     } 

Реализация:

BLL.BLL.ShowAllUsers(grdUsers,"eusers","eid", 
       "euname", 
       "eupassword", 
       "eposition"); 
Смежные вопросы