Создание класса для использования в C # в раскрывающихся списках, сетках и т. Д. - PullRequest
0 голосов
/ 10 февраля 2009

Пожалуйста, имейте в виду, что я новичок в C # и ООП, поэтому я прошу прощения заранее, если для некоторых это кажется легким вопросом. Я возвращаюсь к своему коду и ищу способы объективизировать повторяющийся код и создать для него класс, чтобы я мог просто повторно использовать этот класс. При этом я пока не собираюсь изучать NHibernate или другие ORM. Я даже не хочу изучать LINQ. Я хочу взломать это, чтобы узнать.

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

   protected void LoadSchools()
    {
        SqlDataReader reader;

        var connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
        var conn = new SqlConnection(connectionString);
        var comm = new SqlCommand("SELECT * FROM [Schools] ORDER BY [SchoolName] ASC", conn);

        try
        {
            conn.Open();
            reader = comm.ExecuteReader();
            cmbEditSchool.DataSource = reader;
            cmbEditSchool.DataBind();


            cmbEditSchool.Text = "Please select an existing school to edit...";
            if (reader != null) reader.Close();
        }

        finally
        {
            conn.Dispose();
        }
    }

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

Мой вопрос: как я могу создать класс, который позволит мне вызывать хранимую процедуру вместо того, чтобы вручную использовать запросы, подобные моему примеру, и заполнять мои различные элементы управления? Можно ли обойтись только одним методом? Мне нужно только начать с выбора. Я читал об IEnumerable, который кажется подходящим интерфейсом для использования, но как мне его использовать?

Отредактировано, чтобы добавить:

Я отметил ответ Роршаха как ответ, потому что он / она обратился к моему многочисленному вопросу. Я также понимаю необходимость правильного слоя DAL и, возможно, BLL. То, к чему я пытался добраться, это было. Я могу создать DAL, используя наборы данных и адаптеры таблиц, что в итоге дает мне строго типизированный набор данных. Тем не менее, я чувствую себя немного удаленным из кода. Я искал простой способ создания DAL, начиная с кода, который я дал выше. Возможно, я не правильно формулирую свой вопрос или то, что мне нужно.

Во всяком случае, Роршах подошел ближе всего к ответу на мой настоящий вопрос. Благодаря.

Ответы [ 3 ]

2 голосов
/ 10 февраля 2009

Это простой и грязный метод уменьшения дублирования кода. Это не совсем правильный способ настройки уровня доступа к данным (DAL) и уровня бизнес-логики (BLL), о котором я бы посоветовал узнать.

protected void FillFromDatabase( string sql, BaseDataBoundControl dataControl)
{
SqlDataReader reader = null;

var connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
var conn = new SqlConnection( connectionString );
var comm = new SqlCommand( sql, conn );

try
{
    conn.Open();
    reader = comm.ExecuteReader();
    dataControl.DataSource = reader;
    dataControl.DataBind();
}

finally
{
    if( reader != null )
        reader.Dispose();

    conn.Dispose();
}
}

тогда вы могли бы назвать это как

const string sql = "SELECT * FROM [Schools] ORDER BY [SchoolName] ASC";
FillFromDatabase( sql, cmbEditSchool );
2 голосов
/ 10 февраля 2009

Вы можете создать класс, который позволит вам вызывать хранимые процедуры (это называется классом компонента доступа к данным (DAC), на который обычно ссылается класс Business Component (BC), но это выходит за рамки вашего вопроса) ).

Есть несколько объектов, которые вы захотите использовать в этом новом классе: Microsoft.Practices.EnterpriseLibrary.Data.Database Microsoft.EnterpriseLibrary.Data.DatabaseFactory System.Data.Common.DBCommand

Класс ЦАП будет выглядеть так же, как у вас:

public class DataAccess
{
    public DataAccess()
    {
    }
    public System.Collections.IEnumerable GetSchoolData()
    {
        string connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
        Database db = DatabaseFactory.CreateDatabase(connectionString);
        string sqlCommand = "GetSchoolData";
        DbCommand comm = db.GetStoredProcCommand(sqlCommand);
        //db.AddInParameter(comm, "SchoolId", DbType.Int32); // this is in case you want to add parameters to your stored procedure

        return db.ExecuteDataSet(comm);
    }
}

И код вашей страницы будет выглядеть так:

public class SchoolPage : Page
{
  public void Page_Init(object sender, EventArgs e)
  {
    DataAccess dac = new  DataAccess();
    cmbEditSchool.DataSource = dac.GetSchoolData();
    cmbEditSchool.DataBind();
  }
}

Обратите внимание, что это просто, чтобы помочь вам узнать, как это сделать. Это не очень хороший подход к разработке, потому что вы открываете свой уровень доступа к данным для внешнего мира (что плохо).

0 голосов
/ 10 февраля 2009

Вы должны взглянуть на ADO.NET и использовать такие вещи, как DataSets. Linq-to-SQL, вероятно, также будет полезен для вас. Но я боюсь, что вам, вероятно, не удастся выполнить всего один вызов метода, чтобы заменить все ваши операции с данными.

...