Как лучше всего получить данные sql из C # - PullRequest
6 голосов
/ 28 января 2010

Я пытаюсь найти оптимальный (быстрый и самый простой) способ доступа к коду SQL Server через код в c #.

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

Например (не смейтесь, некоторому коду около 2 лет), я даже написал специальную функцию для передачи sqlQueryResult и проверки, является ли он нулевым или нет):

public static void exampleByColumnNumber(string varValue) {

        string preparedCommand = @"SELECT TOP 1 [SomeColumn],[SomeColumn2]

                                  FROM [Database].[dbo].[Table]
                  WHERE [SomeOtherColumn] = @varValue";
        SqlCommand sqlQuery = new SqlCommand(preparedCommand, Locale.sqlDataConnection);
        sqlQuery.Prepare();
        sqlQuery.Parameters.AddWithValue("@varValue) ", varValue);

        SqlDataReader sqlQueryResult = sqlQuery.ExecuteReader();
        if (sqlQueryResult != null) {
            while (sqlQueryResult.Read()) {
                string var1 = Locale.checkForNullReturnString(sqlQueryResult, 0);
            string var2 = Locale.checkForNullReturnString(sqlQueryResult, 1);
            }
            sqlQueryResult.Close();
        }
    }

Позже я узнал, что это возможно через имена столбцов (которые, кажется, легче читать с несколькими столбцами и множеством изменяющихся порядков и т. Д.):

    public static void exampleByColumnNames(string varValue) {

        string preparedCommand = @"SELECT TOP 1 [SomeColumn],[SomeColumn2]

                                  FROM [Database].[dbo].[Table]
                  WHERE [SomeOtherColumn] = @varValue";
        SqlCommand sqlQuery = new SqlCommand(preparedCommand, Locale.sqlDataConnection);
        sqlQuery.Prepare();
        sqlQuery.Parameters.AddWithValue("@varValue) ", varValue);

        SqlDataReader sqlQueryResult = sqlQuery.ExecuteReader();
        if (sqlQueryResult != null) {
            while (sqlQueryResult.Read()) {
                string var1 = (string) sqlQueryResult["SomeColumn"];
            string var2 = (string) sqlQueryResult["SomeColumn2"];
            }
            sqlQueryResult.Close();
        }
    }

И третий пример - это сделать это по именам столбцов, но с помощью .ToString (), чтобы убедиться, что это не нулевое значение, или выполнить If / else для проверки на ноль.

    public static void exampleByColumnNamesAgain(string varValue) {

        string preparedCommand = @"SELECT TOP 1 [SomeColumn],[SomeColumn2], [SomeColumn3]

                                  FROM [Database].[dbo].[Table]
                  WHERE [SomeOtherColumn] = @varValue";
        SqlCommand sqlQuery = new SqlCommand(preparedCommand, Locale.sqlDataConnection);
        sqlQuery.Prepare();
        sqlQuery.Parameters.AddWithValue("@varValue) ", varValue);

        SqlDataReader sqlQueryResult = sqlQuery.ExecuteReader();
        if (sqlQueryResult != null) {
            while (sqlQueryResult.Read()) {
                string var1 = (string) sqlQueryResult["SomeColumn"].ToString();
            DateTime var2;
        DateTime.TryParse(sqlQueryResult["SomeColumn2"].ToString());

        int varInt = ((int) sqlQueryResult["SomeColumn3"] == null ? 0 : (int) sqlQueryResult["SomeColumn3"];

            }
            sqlQueryResult.Close();
        }
    }

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

Вскоре мне придется начать / переписать некоторую часть моего маленького 90-килобайтового приложения, в котором, по крайней мере, эти 3 примера широко используются, поэтому я хотел бы получить лучший метод для скорости и, желательно, самый простой в обслуживании (надеюсь, он будет таким же Подход).

Возможно, есть и лучшие варианты, поэтому, пожалуйста, поделитесь?

Ответы [ 7 ]

7 голосов
/ 28 января 2010

Похоже, вы смотрите на старые книги. Если вы собираетесь делать это «старомодным способом», то вам следует хотя бы использовать блоки using Краткое описание:

using (var connection = new SqlConnection(connectionString))
{
    using (var command = new SqlCommand(commandString, connection))
    {
        using (var reader = command.ExecuteReader())
        {
             // Use the reader
        }
    }
}

Еще лучше, загляните в Entity Framework .

Ссылки: Центр разработки данных

2 голосов
/ 28 января 2010

вы должны взглянуть на эти уроки,

[http://www.asp.net/learn/data-access/][1]

Вся запланированная работа уже выполнена.

взгляните на этот способ делать то же, что и вы

  string preparedCommand =
  @"SELECT TOP 1 [SomeColumn],[SomeColumn2], [SomeColumn3]    
  FROM [Database].[dbo].[Table]
  WHERE [SomeOtherColumn] = @varValue";
  [1]: http://www.asp.net/learn/data-access/

Более лучший способ сделать то же самое выше - использовать LINQ TO SQL

var result = from someObject in SomeTable
             where SomeColumnHasValue == ValueToCompare
             select new { SomeColumn, SomeColumn1, SomeColumn2};
  • Нет вопросов безопасности типа
  • Визуализируйте базу данных в C #, пока вы работать над этим
  • во время компиляции меньше ошибок
  • меньше кода
  • более продуктивно

Ниже приведены некоторые важные ресурсы для LINQ, если вы заинтересованы

Надеюсь, это поможет

2 голосов
/ 28 января 2010

Если это просто , что вы ищете, вы не можете добиться большего успеха, чем Linq-to-SQL:

http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx

Если ваша база данных SQL уже существует, вы можете начать работу в считанные секунды.

В противном случае, я согласен с Джоном.

1 голос
/ 28 января 2010

Не конвертируйте данные в строки только для того, чтобы попытаться их проанализировать; DataReaders имеет методы для преобразования данных SQL в типы данных .Net:

using (var connection = new SqlConnection(Locale.sqlDataConnection))
using (var command = new SqlCommand(preparedCommand, connection))
using (var reader = command.ExecuteReader())
{
    int stringColumnOrdinal = reader.GetOrdinal("SomeColumn");
    int dateColumnOrdinal = reader.GetOrdinal("SomeColumn2");
    int nullableIntColumnOrdinal = reader.GetOrdinal("SomeColumn3");
    while (reader.Read())
    {
        string var1 = reader.GetString(stringColumnOrdinal);
        DateTime var2 = reader.GetDateTime(dateColumnOrdinal);
        int? var3 = reader.IsDBNull(nullableIntColumnOrdinal) ? null : (int?)reader.GetInt32(nullableIntColumnOrdinal);
    }
}
1 голос
/ 28 января 2010

На мой взгляд, самый простой способ доступа к данным в C # - это использование типизированных DataSets.Многие из них действительно перетаскиваются, и в .NET 2.0+ это даже проще, чем в .NET 1.0 / 1.1.

Ознакомьтесь с этой статьей, в которой говорится об использовании типизированных DataSets и TableAdapters.:

Создание DAL с использованием строго типизированных адаптеров таблиц и таблиц данных в VS 2005 и ASP.NET 2.0

Типизированный DataSet - это, по сути, контейнер для ваших данных.Вы используете TableAdapter, чтобы заполнить его (что происходит с SQL или хранимыми процессами, в зависимости от того, что вы предпочитаете) и впоследствии обновить данные.Имена столбцов в каждой DataTables в вашем DataSet генерируются автоматически из SQL, используемого для их заполнения;и отношения между таблицами базы данных отражаются отношениями между DataTables в DataSet.

1 голос
/ 28 января 2010

Если вы хотите использовать только прямой ADO.net, вы можете выйти и найти блок приложения доступа к данным Microsoft Enterprise Library. У Дэвида Хейдена есть достойная статья , в которой подробно рассказывается об ее использовании.

Удачи и надеюсь, что это поможет некоторым.

0 голосов
/ 05 июля 2017

Я тестирую множество различных способов получения данных из базы данных сервера SQL, и я столкнулся и обнаружил, что самый быстрый способ заключается в следующем:

Прежде всего создайте класс с параметризованным методом "IDataRecord" согласно вашим обязательным свойствам.

       class emp
        {
            public int empid { get; set; }
            public string name { get; set; }
            public static emp create(IDataRecord record)
            {
                return new emp
                {
                    empid = Convert.ToInt32(record["Pk_HotelId"]),
                    name = record["HotelName"].ToString()
                };
            }
        }

Теперь создайте метод для получения данных, как показано ниже:

public List<S> GetData<S>(string query, Func<IDataRecord, S> selector)
        {
            using (var cmd = conn.CreateCommand())
            {
                cmd.CommandText = query;
                cmd.Connection.Open();
                using (var r = cmd.ExecuteReader())
                {
                    var items = new List<S>();
                    while (r.Read())
                        items.Add(selector(r));
                    return items;
                }
            }
        }

А затем вызвать функцию как:

var data = GetData<emp>("select * from employeeMaster", emp.create);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...