Правильно ли написан мой фрагмент данных DataTable? - PullRequest
0 голосов
/ 04 января 2011
   public static DataTable GetDataTable(SqlCommand sqlCmd)
    {
        DataTable tblMyTable = new DataTable();
        DataSet myDataSet = new DataSet();

        try
        {
            //1. Create connection
            mSqlConnection = new SqlConnection(mStrConnection);

            //2. Open connection
            mSqlConnection.Open();

            mSqlCommand = new SqlCommand();
            mSqlCommand = sqlCmd;

            //3. Assign Connection   
            mSqlCommand.Connection = mSqlConnection;

            //4. Create/Set DataAdapter
            mSqlDataAdapter = new SqlDataAdapter();
            mSqlDataAdapter.SelectCommand = mSqlCommand;

            //5. Populate DataSet    
            mSqlDataAdapter.Fill(myDataSet, "DataSet");

            tblMyTable = myDataSet.Tables[0];
        }
        catch (Exception ex)
        {

        }
        finally
        {
            //6. Clear objects
            if ((mSqlDataAdapter != null))
            {
                mSqlDataAdapter.Dispose();
            }

            if ((mSqlCommand != null))
            {
                mSqlCommand.Dispose();
            }

            if ((mSqlConnection != null))
            {
                mSqlConnection.Close();
                mSqlConnection.Dispose();

            }
        }

        //7. Return DataSet
        return tblMyTable;
    }
  • Я использую приведенный выше код для возврата записей из базы данных.

  • Приведенный выше фрагмент будет работать в веб-приложении, которое ежедневно будет посещать около 5000 человек.

  • Количество возвращенных записей достигает 20 000 или более.

  • Возвращенные записи просматриваются (только для чтения) в выгружаемом GridView.

Было бы лучше использовать DataReader вместоDataTable?

ПРИМЕЧАНИЕ. Два столбца в GridView имеют гиперссылки.

Ответы [ 4 ]

1 голос
/ 04 января 2011

Если вы хотите использовать DataTable, то вам следует:

  • всегда поместите ваши объекты SqlConnection и SqlCommand в блоки using(..) { ... }, чтобы обеспечить правильное удаление

  • откройте SqlConnection как можно позже и снова закройте его сразу

  • и с SqlDataAdapter вам даже не нужно явно открывать / закрывать ваше соединение - адаптер данных сделает это за вас

  • не используйте ненужные дополнительные объекты, такие как DataSet - просто заполните DataTable напрямую!

Итак, ваш код должен быть:

public static DataTable GetDataTable(SqlCommand sqlCmd)
{
    DataTable tblMyTable = new DataTable();

    try
    {
        // Create connection
        using(SqlConnection mSqlConnection = new SqlConnection(mStrConnection))
        {
           // Assign Connection   
           sqlCmd.Connection = mSqlConnection;

           // Create/Set DataAdapter
          using(SqlDataAdapter mSqlDataAdapter = new SqlDataAdapter(sqlCmd))
          {
              mSqlDataAdapter.Fill(tblMyTable);
          }
        }
     }
    catch (Exception ex)
    {
       // handle exception
    }

    // Return DataTable
    return tblMyTable;
}

Как и некоторые другие респонденты уже упоминали:

  • не возвращать 20'000 строк ..... возвращать столько, сколько может показать ваша сетка, все, что больше - пустая трата времени, места и вычислительной мощности

  • также: мне не особо нравится идея передачи SqlCommand - если бы я написал этот метод, я передал бы SQL-запрос в виде строки и создал бы только SqlCommand внутри этого метода

Последняя рекомендация: в наше время я бы попытался отойти от модели программирования, основанной на строках / столбцах - это так 20-го века ... вам определенно стоит взглянуть на ORM - Object -Реляционные сопоставители - которые могут превратить строки / столбцы базы данных в удобные для программирования объекты , а затем использовать их для программирования.

Проверьте NHibernate, Linq-to-SQL, Entity Framework v4 или другие ... необходимость все еще возиться с DataTable и DataRow очень низкоуровневая и не очень продуктивная!

0 голосов
/ 04 января 2011

1-Если ваши данные не зависят от пользователя и не являются статичными, даже если они статичны в течение нескольких часов (что, я думаю, имеет место здесь), вы можете извлечь данные и сохранить их в кеше и представить их кэшированные данные для пользователя, таким образом, вы можете уменьшить повторное заполнение таблицы данных для каждого запроса пользователя.

2 - Если вышеупомянутая точка не относится к вашим случаям, чем считывать данные по частям и использовать подкачку для уменьшения количества возвращаемых данных, потому что ни один пользователь не увидит более 20000 строк подряд, используйте подкачку страниц, это заставит ваше приложение быстрее отвечать ,

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

0 голосов
/ 04 января 2011

Почему вам возвращают 20 000 или более записей из базы данных. Я думаю, что вы должны получать записи в соответствии с вашим размером страницы GridView.

например, если размер вашей страницы GridView равен 10, вы можете получить только 10 записей из базы данных.

0 голосов
/ 04 января 2011

Ваш фрагмент в целом не так уж и плох, но несколько замечаний.

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

2) Вы используете ужасную форму венгерской нотации.Вы должны избавиться от этой привычки в интересах других разработчиков C #, с которыми вы можете работать сейчас или в будущем.

3) Отображение 20K записей пользователю - безумие.Это будет медленное рендеринг и почти полностью бесполезное, так как ни один человек не будет проходить через такое количество записей.Обеспечьте более умный интерфейс, используя поиск, фильтр или их комбинацию.

Что касается вопроса DataAdapter / DataReader;на самом деле это не имеет значения, поскольку адаптер данных в любом случае использует устройство чтения данных.Лучшим вопросом может быть «Должен ли я использовать DataSet или мой собственный объект для представления записей?»и ответом будет то, что вам следует использовать DataSet, если требуется дополнительная функциональность, которую он предоставляет (например, поддержание состояния каждой записи).В вашем случае, когда записи просто извлекаются для отображения в сетке, я бы, наверное, не догадался.

...