oledb извлекает всю запись и возвращает из .accdb

#c# #.net #oledb

#c# #.net #oledb

Вопрос:

пример функции возврата, которая возвращает только строковое значение, как мне вернуть несколько значений, состоящих из разных типов данных, в одной записи, просто вызвав одну функцию?

     public static string selectPassword(string user)
    {
        using (var connection = new OleDbConnection(connectionString))
        using (var command = connection.CreateCommand())
        {
            command.Parameters.AddWithValue("@user", user);
            command.CommandText = "SELECT [Password] FROM [Password_Table] WHERE Password_ID = [@user]";
            command.CommandType = CommandType.Text;

            connection.Open();

            var value = command.ExecuteScalar();

            return value == DBNull.Value ? null : value.ToString();
        }
    }
  

в моей записи будет выполняться поиск по имени участника, и ей потребуется вернуть поля Participant_Name, Participant_ID, Address, Contact_Number amp; Gender, Все из которых состоят из строки, целых чисел и т. Д..

Ответ №1:

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

Заполните экземпляр этого типа в вашем методе и верните его.

Что-то вроде этого, например:

 public class Participant
{
   public int Id { get; private set; }
   public string Name {get; set;}
   public string Address {get; set; }


   public Participant( int id, string name, string address )
   {
       this.Id = id;
       this.Name = name;
       this.Address = address;
   }
}

public Participant GetParticipant( string name )
{
    using( var conn = new OleDbConnection (connectionString) )
    {
        using( var cmd = connection.CreateCommand() )
        {
              command.CommandText = "SELECT [Id], [Name], [Address] FROM Participant WHERE [name] LIKE @p_name";


               command.Parameters.Add ("@p_name", OleDbType.VarChar).Value = name   "%";

               using( var reader = command.ExecuteReader() )
               {
                    if( !reader.HasRows() ) return null;

                    reader.Read();

                    return new Participant (reader.GetString("Id"), reader.GetString("name"), reader.GetString("address"));
               }
        }
    }

}
  

Примечание: могут быть синтаксические ошибки, поскольку я не проверял это через компилятор, но я думаю, вы поймете, в чем дело.

Комментарии:

1. это блестяще, если у него есть определенная сущность, это лучшее решение. Или он также может вернуть DataRow или его itemArray напрямую. но 1 для вас, поскольку я написал свой ответ, имея в виду и thin. В реальных приложениях всегда должна быть бизнес-сущность для каждого типа записи в любом случае.

2. Должно быть, я пропустил это! Это потрясающее решение, я не знал, что это может быть простым, но элегантным решением! Я не говорю, что другие ответы неверны, но это мне больше всего нравится в том, что я знаю в настоящее время! спасибо всем!

Ответ №2:

для ваших нужд вы должны вернуть DataRow объект или массив объектов, который вы можете получить, вызвав .ItemArray DataRow

что вам нужно изменить в вашем методе выше, так это использовать a DataAdapter и вызвать его Fill метод для заполнения таблицы данных, а затем вернуть первую строку такой таблицы данных, если присутствует какая-либо строка.

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

Комментарии:

1. быстрее кодировать, но имхо не так удобно в использовании, поскольку простой поток данных не вводится.