14 Mayıs 2016 Cumartesi

DbCommand Sınıfı

Giriş
OleDBCommand, SqlCommand, SqlCeCommand, OracleCommand, MySqlCommand gibi veritabanı türüne göre kullanılan sınıflar var. Örneği SqlCeCommand .sdf dosya uzantılı SQL Server Compact Edition için kullanılıyor.

Veritabanından tam bağımsız olmak için IDbCommand arayüzünü kullanmak daha iyi.

Alanlar
Connection Alanı
Normalde constructor ile kullanılacak connection nesnesi de sağlanır.
SqlConnection con = new SqlConnection("ConnectionString");
SqlCommand cmd = new SqlCommand("query", con); 
Ancak böyle yapmak istemezsek connection alanını kullanarak bu nesneyi atamak mümkün.
cmd.Connection = con;
Parameters Alanı
Command nesnesinin en önemli alanı Parameters. Bu alana Add() veya AddWithValue() metodları ile değer eklemek mümkün.

Metodlar

AddWithValue metodu
SQL'deki pametrik alana isimle erişmek istersek AddWithValue() metodu kullanılır. AddWithValue Object alır ancak veritabanı sütunundaki doğru tipi kullanmamız gerekir. Veritabanı sütunu INT ise biz string verirsek hata alırız.

String olarak kullanımı. Burada NO alanının INT olmadığını varsaydım
String query = "Delete FROM TB WHERE NO=@number";
OleDbCommand cmd = new OleDbCommand(query, con);
cmd.Parameters.AddWithValue("@number", TextBox2.Text);
Eğer INT olsaydı şöyle yapmak gerekirdi.
cmd.Parameters.AddWithValue("@number", Convert.ToInt32(TextBox2.Text.Trim()));
Date olarak kullanımı
SqlCommand scmd1 = new SqlCommand("select count(*) from c
where requestdate between @dateStart and @dateEnd", sc);

DateTime dtStart = ...;
DateTime dtEnd = ...;

cmd.Parameters.AddWithValue("dateStart", dtStart);
cmd.Parameters.AddWithValue("dateEnd", dtEnd);

Add metodu
Bu metod ile daha fazla kontrole sahibiz. Dolayısıyla AddWithValue yerine Add() kullanılması öneriliyor.

Add metodu - Date Değer Ekleme
Şöyle yaparız.
cmd.Parameters.Add("@date", SqlDbType.Date, 100).Value = date;
Add metodu - Numeric Değer ekleme
OleDB kullanıyorsak şöyle yaparız.
String query = "Delete FROM TB WHERE NO=@number";
OleDbCommand cmd = new OleDbCommand(query, con);
cmd.Parameters.Add("@number", OleDbType.Numeric, 30).Value=TextBox2.Text;
SQL Server kullanıyorsak şöyle yaparız
cmd.Parameters.Add("@number", SqlDbType.Int).Value = number;
Oracle kullanıyorsak şöyle yaparız.
var param = new OracleParameter(":pEmpNo1", OracleType.Number);
param.Value = 1;
cmd.Parameters.Add(param);
Add metodu - Varchar Değer Ekleme
Varchar sütunlara şöyle yapabiliyoruz.
cmd.Parameters.Add("@name",SqlDbType.VarChar,30).Value=varName;
Ayrıca Stored Proc. kullanırken parametrenin out olduğunu belirtmek için illaki Add() kullanmak gerek.

ExecuteNonQuery - Stored Proc Çağırmak
Stored Procedure çağırmak için kullanılabilir. Nesnenin CommandType alanını ve Stored Proc ismini atamamız gerekir.
using System.Data.SqlClient;

using (SqlConnection conn = new SqlConnection("connectionString"))
{
    SqlCommand cmd = conn.CreateCommand();
    cmd.CommandType = System.Data.CommandType.StoredProcedure;
    cmd.CommandText = "StoredProcedureName";
    cmd.ExecuteNonQuery();
}
Parametre alan Stored Proc için girdi alanları AddWithValue ile atanır. Storec Proc'tan gelmesi beklenen output alanları Direction ile belirtilir.Yukarıdaki örnekten farklı olarak çağrılacak Stored Proc. ismi SqlCommand nesnesi constructor'ına geçiliyor.

var cmd = new SqlCommand("StoredProcedureName", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Parameter", inputValue);

// add the output parameter
cmd.Parameters.Add("@Parameter1", SqlDbType.NVarChar).Direction =
    ParameterDirection.Output;

cmd.ExecuteNonQuery();

string parameter1 = (string)cmd.Parameters["@Parameter1"].Value;

ExecuteNonQuery - Satır Eklemek
Normalde Command nesnesinin CommandType alanına değer atamamız gerekmez. Ancak istenirse şöyle de yapılabilir.
cmd.CommandType = CommandType.Text;
Daha sonra şöyle yaparız.
using(var connection = new OleDbConnection(ConnectionStringStatic()))
using(var cmd = connection.CreateCommand())
{
  cmd.CommandText = @"INSERT INTO tbl_Clients (ipAddress, macAddress, machineName)
                          VALUES (?, ?, ?)";
  cmd.Parameters.Add("@ip", ipAddress);
  cmd.Parameters.Add("@mac", macAddrress);
  cmd.Parameters.Add("@name", machineName);
  connection.Open();
  cmd.ExecuteNonQuery();
} // <-- Both connection and command are disposed here
ExecuteScalar
Açıklaması şöyle
ExecuteScalar will Executes the query, and returns the first column of the first row in the result set returned by the query. Additional columns or rows are ignored.
Dolayısıyla döndürülen nesneyi istediğimiz tipe çevirmemiz gerekir.
int count = Convert.ToInt32(cmd.ExecuteScalar());
Para okumak için şöyle yaparız.
cmd.CommandText = "Select Price from mytable where productBrand = @brand";
cmd.Parameters.AddWithValue("@brand", "...");
decimal price = (decimal)cmd.ExecuteScalar();
Select cümlesinin kaç satır döndürdüğünü saymak için şöyle yaparız.
var cmd = new SqlCommand("select DISTINCT max(billno) AS bill from sale", con))
int count = (int)cmd1.ExecuteScalar();
ExecuteScalar - Stored Proc Çağırmak
ExecuteNonQuery ile aynı. Tek fark ExecuteScalar() metodu bir değer dönüyor. Şöyle yaparız.
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "StoredProcedureName";
con.Open();
var x = cmd.ExecuteScalar();





Hiç yorum yok:

Yorum Gönder