ahmed_sa Ответов: 2

Как изменить возврат функции из строки в общий список ?


проблема
How to change return of function from string to return generic list by using csharp ?

У меня есть хранимая процедура name getcompanies return list of companies id следующим образом
create proc getcompannies
as
select compnyid from companes where compnyid > 10

таким образом, этот результат будет следующим
11
12
13
14
15
и т.д...
так что мне нужно изменить функцию ниже из строки, чтобы вернуть общий список для динамического использования

Что я уже пробовал:

public static string ExecuteProcedureReturnString(string connString, string procName,
           params SqlParameter[] paramters)
       {
           string result = "";
           using (var sqlConnection = new SqlConnection(connString))
           {
               using (var command = sqlConnection.CreateCommand())
               {
                   command.CommandType = System.Data.CommandType.StoredProcedure;
                   command.CommandText = procName;
                   if (paramters != null)
                   {
                       command.Parameters.AddRange(paramters);
                   }
                   sqlConnection.Open();
                   var ret = command.ExecuteScalar();
                   if (ret != null)
                       result = Convert.ToString(ret);
               }
           }
           return result;
       }

2 Ответов

Рейтинг:
2

Afzaal Ahmad Zeeshan

Это потребовало бы введения в дженерики здесь и изменения результата, который вы вернете в конце концов. Но вот кое-что, что может помочь вам начать:

// Add the T for type annotation.
public static List<T> ExecuteProcedureReturnString<T>(string connString, string procName, params SqlParameter[] paramters)
{
   List<T> result = new List<T>(); // Change the variable.
   using (var sqlConnection = new SqlConnection(connString))
   {
       using (var command = sqlConnection.CreateCommand())
       {
           command.CommandType = System.Data.CommandType.StoredProcedure;
           command.CommandText = procName;
           if (paramters != null)
           {
               command.Parameters.AddRange(paramters);
           }
           sqlConnection.Open();

           // This would change from scalar to query; ExecuteQuery()
           var ret = command.ExecuteQuery();
           if (ret != null)
               // Fill in the results.
       }
   }
   return result;
}
Эта страница поможет вам в запросе данных и создании пользовательского списка для входных данных. Я не стал изменять большую часть кода, так как это только нарушило бы сборку и вызвало бы еще большую путаницу. Ты можешь позаботиться об этом.

Извлечение данных с помощью DataReader | Microsoft Docs[^]

Подробнее о дженерики в C# здесь, Generics - Руководство По Программированию На C# | Microsoft Docs[^], было бы удивительно, если бы вы могли создать Тип C# и использовать его вместо дженериков — так как это очистило бы много путаницы в коде для начала.

Это будет работать просто отлично, так как вы возвращаете список целых чисел,
public static List<int> ExecuteProcedureReturnString(string connString, string procName, params SqlParameter[] paramters)
{
Затем верните список целых чисел из вашего кода.


ahmed_sa

спасибо Вам большое но оставшиеся некоторые моменты не понимаю о втором ответе или посте
на самом деле мне нужна функция generic в качестве второго потока, но что-то не ясно
1 - что вы имеете в виду под executequery
команды нет запроса запустите
2 - Как заполнить данные или результат, пожалуйста
можете ли вы выполнить вторую функцию, если это возможно

Afzaal Ahmad Zeeshan

Существует разница в ExecuteScalar и ExecuteQuery, пожалуйста, прочитайте их документацию, чтобы узнать об этой разнице — быстрый ответ заключается в том, что ExecuteQuery вернет записи, а ExecuteScalar вернет количество обработанных строк.

Чтобы заполнить данные в строки, вы используете DataReader, а затем вы можете просто использовать индексаторы ([]) для доступа к значению столбца. Пожалуйста, проверьте ссылку, которую я предоставил для DataReader, в ней есть ответ на ваш вопрос. :-)

phil.o

Точнее, ExecuteScalar возвращает первый столбец первой строки. Он часто используется для возврата результата функции count, но это не значит, что он всегда будет возвращать количество строк.

Рейтинг:
1

OriginalGriff

Начните с изменения подписи:

public static string ExecuteProcedureReturnString(string connString, string procName,
           params SqlParameter[] paramters)
Становится
public static List<string> ExecuteProcedureReturnString(string connString, string procName,
           params SqlParameter[] paramters)
А потом начинается работа.
Ваш метод не имеет дело с несколькими значениями: он вызывает хранимую процедуру, которая возвращает одно значение, которое может быть строкой, а может и не быть строкой - у нас нет доступа к SP или коду во время его выполнения, поэтому мы не можем сказать точно. Вполне возможно, что он возвращает строку значений с разделителем-запятой или что-то подобное, но мы не можем сказать точно.

Поэтому начните с рассмотрения того, что именно возвращается и что делает SP.
Извините, но мы ничего не можем сделать для вас!