ASP.NET uygulamasını Azure SQL Veritabanı'na bağlama
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 CommandType
Text
ö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()}");
}
}
}