ASP.NET uygulamasını Azure SQL Veritabanı'na bağlama

Tamamlandı

Bir uygulamadan Azure SQL Veritabanı hizmetinin içindeki veritabanlarına çeşitli yollarla bağlanabilirsiniz. .NET uygulamaları için System.Data.SqlClient kitaplığını kullanabilirsiniz.

Üniversitenin web uygulaması, SQL veritabanınıza yüklediğiniz verileri getirmeli ve görüntülemelidir. Bu ünitede, bir web uygulamasından veritabanına bağlanmayı ve verileri işlemek için kitaplığı kullanmayı System.Data.SqlClient öğreneceksiniz.

System.Data.SqlClient kitaplığına genel bakış

System.Data.SqlClient kitaplığı, şirket içinde veya bulutta SQL Veritabanı'nda çalıştırılan bir SQL Server veritabanına bağlanmak için kullanabileceğiniz türler ve yöntemler koleksiyonudur. Kitaplık, verileri almak ve tutmak için genel bir arabirim sağlar. Transact-SQL (T-SQL) komutlarını ve işlem işlemlerini çalıştırmak ve verileri almak için kitaplığı kullanabilirsiniz System.Data.SqlClient . SQL ekleme saldırılarıyla ilişkili sorunları önlemek için bu işlemleri parametreleştirebilirsiniz. Bir işlem başarısız olursa System.Data.SqlClient kitaplığı, özelleştirilmiş özel durum ve hata sınıflarıyla hata bilgileri sağlar. Bu özel durumları .NET uygulamasının diğer türlerdeki özel durumlarıyla aynı şekilde işlersiniz.

System.Data.SqlClient kitaplığı System.Data.SqlClient NuGet paketinde sağlanır.

Tek veritabanına bağlanma

SqlConnection nesnesini kullanarak bir veritabanı bağlantısı oluşturursunuz. Veritabanının adıyla konumunu, kullanılacak kimlik bilgilerini ve bağlantıyla ilgili diğer parametreleri belirten bir bağlantı dizesi sağlarsınız. Tek veritabanı için tipik bir bağlantı dizesi aşağıdakine benzer:

Server=tcp:myserver.database.windows.net,1433;Initial Catalog=mydatabase;Persist Security Info=False;User ID=myusername;Password=mypassword;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;

Tek veritabanınızın bağlantı dizesini Azure portalında, veritabanınızın Bağlantı dizeleri sayfasında bulabilirsiniz.

Aşağıdaki kod örneği, SqlConnection nesnesinin nasıl oluşturulacağını gösterir:

using System.Data.SqlClient;

...

string connectionString = "Server=tcp:myserver.database.windows.net,...";
SqlConnection con = new SqlConnection(connectionString);

Siz bağlantıyı açana kadar veritabanı bağlantısı kurulmaz. Genellikle bir T-SQL komutu veya sorgusu çalıştırmadan hemen önce bağlantıyı açarsınız.

con.Open();

Bazı veritabanları yalnızca sınırlı sayıda eş zamanlı bağlantıyı destekler. Bu nedenle, bir komutu çalıştırıp sonuçları aldıktan sonra bağlantıyı kapatmanız ve tutulan tüm kaynakları serbest bırakmanız doğru olabilir.

con.Close();

Bir diğer yaygın yaklaşım da using deyiminde bağlantı oluşturmaktır. Bu strateji, using deyimi tamamlandığında otomatik olarak bağlantıyı kapatır. Ancak Close yöntemini açıkça da çağırabilirsiniz.

using (SqlConnection con = new SqlConnection(connectionString))
{
    // Open and Use the connection here
    con.Open();
    ...
}
// Connection is now closed

T-SQL komutu veya sorgusu tanımlama

Çalıştırılacak T-SQL komutunu veya sorgusunu belirtmek için bir SqlCommand nesne oluşturun. Aşağıdaki örnekte, belirli bir müşterinin satırlarını tablodan kaldıran bir T-SQL DELETE deyimi gösterilmektedir dbo.Orders . Komutları parametreleştirebilirsiniz. Bu örnekte değer için CustomerID CustID adlı bir parametre kullanılır. nesnesinin CommandTypeText özelliğini SqlCommand olarak ayarlayan satır, komutun bir T-SQL deyimi olduğunu gösterir. T-SQL deyimi yerine saklı yordam da çalıştırabilirsiniz. Bu durumda, CommandType öğesini StoredProcedure olarak ayarlarsınız.

SqlCommand deleteOrdersForCustomer = new SqlCommand("DELETE FROM Orders WHERE CustomerID = @custID", con);
deleteOrdersForCustomer.CommandType = CommandType.Text;
string customerID = <prompt the user for a customer to delete>;
deleteOrdersForCustomer.Parameters.Add(new SqlParameter("custID", customerID));

Bu örnekte SqlCommand oluşturucusunun son parametresi, komutu çalıştırmak için kullanılan bağlantıdır.

Sonraki örnekte, müşteri adlarının ve siparişlerinin listesini oluşturmak için ve dbo.Orders tablolarını birleştiren dbo.Customers bir sorgu gösterilmektedir.

SqlCommand queryCmd = new SqlCommand(
                    @"SELECT c.FirstName, c.LastName, o.OrderID
                      FROM Customers c JOIN Orders o
                      ON c.CustomerID = o.CustomerID", con);
queryCmd.CommandType = CommandType.Text;

Komut çalıştırma

Nesneniz SqlCommand sonuç kümesi döndürmeyen bir T-SQL deyimine başvuruda bulunursa yöntemini kullanarak ExecuteNonQuery komutunu çalıştırın. Komut başarılı olursa, işlemden etkilenen satır sayısını döndürür. Sonraki örnekte daha önce gösterilen komutun deleteOrdersForCustomer nasıl çalıştırıldığı gösterilmektedir.

int numDeleted = deleteOrdersForCustomer.ExecuteNonQuery();

Komutun çalışmasının biraz zaman almasını bekliyorsanız, işlemi zaman uyumsuz olarak gerçekleştirmek için ExecuteNonQueryAsync yöntemini kullanabilirsiniz.

Sorgu yürütme ve verileri getirme

T-SQL SqlCommand SELECT deyiminiz varsa yöntemini kullanarak ExecuteReader bunu çalıştırırsınız. Bu yöntem sonuçlarda yinelemek ve her satırı sırayla işlemek için kullanabileceğiniz SqlDataReader nesnesini döndürür. Read yöntemini kullanarak SqlReader nesnesinden verileri alırsınız. Bu yöntem, satır bulunduğunda true ve okunacak başka satır kalmadığında false değerini döndürür. Bir satır okunduktan sonra o satırın verileri, SqlReader nesnesindeki alanlarda kullanılabilir. Her alan, özgün SELECT deyiminde bu alana karşılık gelen sütunla aynı adı paylaşır. Öte yandan her alandaki veriler türü belirtilmemiş bir object olarak alındığından, kullanmadan önce bu verileri uygun türe dönüştürmeniz gerekir. Aşağıdaki kod, verileri bir kerede queryCmd bir satır getirmek için daha önce gösterdiğimiz komutun nasıl çalıştırıldığını gösterir.

SqlDataReader rdr = queryCmd.ExecuteReader();

// Read the data a row at a time
while (rdr.Read())
{
    string firstName = rdr["FirstName"].ToString();
    string lastName = rdr["LastName"].ToString();
    int orderID = Convert.ToInt32(rdr["OrderID"]);

    // Process the data
    ...
}

Özel durumları ve hataları işleme

Bir veritabanı kullanırken çeşitli nedenlerle özel durumlar ve hatalar oluşabilir. Örneğin, artık mevcut olmayan bir tabloya erişmeye çalışmış olabilirsiniz. türünü kullanarak SqlException T-SQL hatalarını yakalayabilirsiniz.

Veritabanındaki çeşitli olaylar veya sorunlar bir özel durum tetikleyebilir. SqlException nesnesinin, SqlError nesneleri koleksiyonunu içeren bir Errors özelliği vardır. Bu nesneler her hatayla ilgili ayrıntıları sağlar. Aşağıdaki örnekte, SqlException hatasının yakalanması ve bunun içerdiği hataların işlenmesi gösterilmektedir.

...
using (SqlConnection con = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand("DELETE FROM ...", con);
    try
    {
        con.Open();
        command.ExecuteNonQuery();
    }
    catch (SqlException ex)
    {
        for (int i = 0; i < ex.Errors.Count; i++)
        {
            Console.WriteLine($"Index # {i} Error: {ex.Errors[i].ToString()}");
        }
    }
}