Programlama da altın kural bir şeyleri parça parça bilmekten çok parça parça bildiğin şeyleri bir bütün olarak nerede ve nasıl kullanacağını bilmendir. Bu yazımızda, daha önce ki yazımızda bulduğumuz indexleri bir kayıt veya güncellemede unique olan alanlardan daha önce kayıt alınmış mı diye sorgulama yapacağız. Örneğin bir kişinin TC kimlik numarası uniquetır. Dolayısıyla yeni bir kayıtta aynı kimlik numarasının daha önce kaydedilip kaydedilmediğinin sorgulanması gerekmektedir. Tabi her zaman durum sadece kimlik numarası ile sınırlı değil 🙂 bunun için parametre olarak verdiğimiz tabloda bu işi yapan bir fonksiyon yazacağız:
Sorgulamayı yapan asıl metodumuz:
İşlem sırasıyla şu şekilde yapılmaktadır:
GetIndex metodu ile indexler alınıyor daha sonra alınan index kolonları üzerinde şu sorgu çalıştırılmaktadır.
“Id değeri farklı olmak üzere bu değere sahip bir kayıt var mı?”
Not: Kod içerisinde geçen metot ve sınıflar kodun en altında ayrıca verilmiştir.
[csharp]
public static ProcessResult IsAlreadyFound(object o, string table)
{
ProcessResult result = new ProcessResult();
List<string> indexs = DatabaseSql.GetIndexs(table);
if (!indexs.HasItems())
{
result.Result = BLLResult.Success;
return result;
}
using (LibraryContext ctx = new LibraryContext())
{
if (ctx.DatabaseError)
{
result.Result = BLLResult.ServerDisable;
result.MessagesList.Add(StaticStrings.ServerDisable);
return result;
}
string Id = o.GetType().GetProperty("Id").GetValue(o, null).ToString();
foreach (string s in indexs)
{
string value = o.GetType().GetProperty(s).GetValue(o, null).ToString();
int count = ctx.Database.SqlQuery<int>(String.Format("SELECT COUNT(*) FROM {0} WHERE Id != @Id AND {1} = @value", table, s),
new SqlParameter("@Id", Id),
new SqlParameter("@value", value)).Single();
if (count <= 0) continue;
result.Result = BLLResult.AlreadyFound;
result.MessagesList.Add(value +" zaten var"));
}
}
if (result.Result == BLLResult.AlreadyFound) return result;
result.Result = BLLResult.Success;
result.MessagesList.Clear();
return result;
}
public static List<string> GetIndexs(string tableName, bool isPrimary = false, bool isUnique = true)
{
List<string> strings = new List<string>();
string s = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
SqlConnection connection = new SqlConnection(s);
SqlCommand command = new SqlCommand("SELECT COL_NAME(ic.object_id,ic.column_id) AS column_name FROM sys.indexes AS i INNER JOIN sys.index_columns AS ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id WHERE i.object_id = OBJECT_ID(@table) AND i.is_primary_key = @primary AND i.is_unique = @unique", connection);
command.Parameters.AddWithValue("@table", tableName);
command.Parameters.AddWithValue("@primary", isPrimary);
command.Parameters.AddWithValue("@unique", isUnique);
try
{
connection.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
strings.Add(reader.GetString(0));
}
return strings;
}
catch
{
return null;
}
finally
{
if (connection.State != ConnectionState.Closed)
connection.Close();
}
}
// ProcessResult classı
public class ProcessResult
{
#region Members
public BLLResult Result { get; set; }
public List<string> MessagesList { get; set; }
#endregion
#region Constructors
public ProcessResult()
{
MessagesList = new List<string>();
Result = BLLResult.Information;
}
#endregion
}
public enum BLLResult
{
Success, // 0
NotVerified, // 1
InnerException, // 2
Verified, // 3
AlreadyFound, // 4
Referanced, // 5
NotFound, // 6
Error, // 7
ServerDisable, // 8
Information
}
[/csharp]