• 22 Kasım 2024 04:56

Sait ORHAN

Öğretmek için Öğrenin- Öğrenmek için Öğretin

Kayıt ve Güncellemeden Önce Unique Olan Alanların Kontrolü

BySait ORHAN

Nis 2, 2015

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]

 

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.