Поиск…


Связи ADO.NET

Соединения ADO.NET - один из простейших способов подключения к базе данных из приложения C #. Они полагаются на использование провайдера и строку подключения, которая указывает на вашу базу данных для выполнения запросов.

Общие классы поставщиков данных

Многие из следующих относятся к классам, которые обычно используются для запросов к базам данных и связанным с ними пространствам имен:

  • SqlConnection , SqlCommand , SqlDataReader из System.Data.SqlClient
  • OleDbConnection , OleDbCommand , OleDbDataReader из System.Data.OleDb
  • MySqlConnection , MySqlCommand , MySqlDbDataReader из MySql.Data

Все они обычно используются для доступа к данным через C # и обычно встречаются во всех приложениях, ориентированных на данные. Многие другие классы, которые не упомянуты, которые реализуют те же FooConnection , FooCommand , FooDataReader можно ожидать, что они будут вести себя одинаково.

Общий шаблон доступа для подключений ADO.NET

Общая схема, которая может использоваться при доступе к вашим данным через соединение ADO.NET, может выглядеть следующим образом:

// This scopes the connection (your specific class may vary)
using(var connection = new SqlConnection("{your-connection-string}")
{
    // Build your query
    var query = "SELECT * FROM YourTable WHERE Property = @property");
    // Scope your command to execute
    using(var command = new SqlCommand(query, connection))
    {
         // Open your connection
         connection.Open();

         // Add your parameters here if necessary

         // Execute your query as a reader (again scoped with a using statement)
         using(var reader = command.ExecuteReader())
         {
               // Iterate through your results here
         }
    }
}

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

using(var connection = new SqlConnection("{your-connection-string}"))
{
     var query = "UPDATE YourTable SET Property = Value WHERE Foo = @foo";
     using(var command = new SqlCommand(query,connection))
     {
          connection.Open();
          
          // Add parameters here
          
          // Perform your update
          command.ExecuteNonQuery();
     }
}

Вы даже можете программировать против набора общих интерфейсов и не беспокоиться о конкретных классах провайдера. Основными интерфейсами, предоставляемыми ADO.NET, являются:

  • IDbConnection - для управления соединениями с базой данных
  • IDbCommand - для выполнения команд SQL
  • IDbTransaction - для управления транзакциями
  • IDataReader - для чтения данных, возвращаемых командой
  • IDataAdapter - для направления данных в и из наборов данных
var connectionString = "{your-connection-string}";
var providerName = "{System.Data.SqlClient}"; //for Oracle use "Oracle.ManagedDataAccess.Client"
//most likely you will get the above two from ConnectionStringSettings object

var factory = DbProviderFactories.GetFactory(providerName);

using(var connection = new factory.CreateConnection()) {
    connection.ConnectionString = connectionString;
    connection.Open();

    using(var command = new connection.CreateCommand()) {
        command.CommandText = "{sql-query}";    //this needs to be tailored for each database system

        using(var reader = command.ExecuteReader()) {
            while(reader.Read()) {
                ...
            }
        }
    }
}

Подключения к платформе Entity Framework

Entity Framework предоставляет классы абстракции, которые используются для взаимодействия с базовыми базами данных в виде классов, таких как DbContext . Эти контексты обычно состоят из DbSet<T> которые раскрывают доступные коллекции, которые могут быть запрошены:

public class ExampleContext: DbContext 
{ 
    public virtual DbSet<Widgets> Widgets { get; set; } 
}

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

public class ExampleContext: DbContext 
{ 
    // The parameter being passed in to the base constructor indicates the name of the 
    // connection string
    public ExampleContext() : base("ExampleContextEntities")
    {
    }

    public virtual DbSet<Widgets> Widgets { get; set; } 
}

Выполнение запросов платформы Entity

Фактически выполнение запроса Entity Framework может быть довольно простым и просто требует, чтобы вы создавали экземпляр контекста, а затем использовали доступные ему свойства для вытягивания или доступа к своим данным

using(var context = new ExampleContext())
{
      // Retrieve all of the Widgets in your database
      var data = context.Widgets.ToList();
}

Entity Framework также предоставляет обширную систему отслеживания изменений, которая может использоваться для обработки обновлений записей в вашей базе данных путем простого вызова метода SaveChanges() для изменения изменений в базе данных:

using(var context = new ExampleContext())
{
      // Grab the widget you wish to update
      var widget = context.Widgets.Find(w => w.Id == id);
      // If it exists, update it
      if(widget != null)
      {
           // Update your widget and save your changes
           widget.Updated = DateTime.UtcNow;
           context.SaveChanges();
      }
}

Строки подключения

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

Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;

Сохранение строки подключения

Как правило, строка соединения будет храниться в файле конфигурации (например, app.config или web.config в приложениях ASP.NET). Ниже приведен пример того, как локальное соединение может выглядеть в одном из этих файлов:

<connectionStrings> 
   <add name="WidgetsContext" providerName="System.Data.SqlClient"  connectionString="Server=.\SQLEXPRESS;Database=Widgets;Integrated Security=True;"/> 
</connectionStrings>

<connectionStrings> 
   <add name="WidgetsContext" providerName="System.Data.SqlClient"  connectionString="Server=.\SQLEXPRESS;Database=Widgets;Integrated Security=SSPI;"/> 
</connectionStrings>

Это позволит вашему приложению получать доступ к строке подключения программно через WidgetsContext . Хотя и Integrated Security=SSPI и Integrated Security=True выполняют одну и ту же функцию; Integrated Security=SSPI предпочтительнее, поскольку работает как с поставщиком SQLClient, так и с OleDB, где в качестве Integrated Security=true генерирует исключение при использовании с поставщиком OleDb.

Различные подключения для разных поставщиков

Каждый поставщик данных (SQL Server, MySQL, Azure и т. Д.) Имеет свой собственный синтаксис для своих строк подключения и предоставляет различные доступные свойства. ConnectionStrings.com - невероятно полезный ресурс, если вы не уверены в том, что должно выглядеть так.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow