SPRING JDBC ile SQL SERVER KULLANARAK VERİTABANI İŞLEMLERİ

1-)Kodumuzu geliştirmeye başlamadan sql server configuration managera gelerek tcp/ip ve tcpport ayarlarımızı kontrol ediyoruz.Ayarlarda bir değişiklik yaptık isek geçerli olması için sql serverın servisini stop start etmemiz gerekiyor.

springsql1springsql2

2-)Microsoft Sql servera maven central üstünden dependency olarak mssql-jdbcyi eklemek için pom.xmlemize aşağıdaki satırları ekliyoruz

<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>7.2.1.jre11</version>
</dependency>

3-)String connectionUrl =“jdbc:sqlserver://DESKTOP-myinstance\\SQLEXPRESS;databaseName=AddressBook;integratedSecurity=true;portNumber=1433″; integratedSecurity şeklinde bir bağlantı yapmak isterseniz aşağıdaki ayarları yapmamız gerekmektedir aksi takdirde driver konfigürasyonu yok hatası alırsınız

This driver is not configured for integrated authentication. ClientConnectionId:3070320f-113f-4ffc-a526-444abeba90a2

https://docs.microsoft.com/en-us/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-2017 sitesinden kullandığınız jreye göre driverı download edin indirdiğiniz zipin içindeki sqljdbc_auth.dll bu dlli uygulamanızın calıştıgı java pathindeki C:\java\jdk-11.0.2\bin jrenin bini içine kopyalayın(64 bit veya 32 bit olarak calısma mantığına göre ilgili dlli bin altına kopyalamanız gerekecektir.)

springsql3

4-)Eğer springboot kullanıyorsak applicationproperties tanımlarında default olarak belirteceksek aşağıdaki örnekteki gibi driverClassName ve urli ayrıca verebiliyoruz.

spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.url=jdbc:sqlserver://DESKTOP-myinstance\SQLEXPRESS;databaseName=AddressBook;integratedSecurity=true;portNumber=1433

 

5-)Temel olarak connectionı yarattıktan sonra ExecuteQuery diyerek sorgumuzu çalıştırıp dönen değeri bir resulsete alıyoruz.Aşağıdaki örnek java ile sadece jdbc kullanarak sqlservera bağlanıp sonuçları ceken örnek bir kod bloğudur.

 

public  static  void ConnectSqlServerWithPureJDBC()
{
String connectionUrl =“jdbc:sqlserver://DESKTOP-myinstance\\SQLEXPRESS;databaseName=AddressBook;integratedSecurity=true;portNumber=1433″;

try (Connection connection = DriverManager.getConnection(connectionUrl);) {
Statement stmt = connection.createStatement();
String SQL = “SELECT  * FROM PersonTable”;
ResultSet rs = stmt.executeQuery(SQL);

while (rs.next()) {
System.out.println(rs.getString(“Name”) + ” ” + rs.getString(“Surname”));
}
// Code here.
String a=“”;
}
// Handle any errors that may have occurred.
catch (SQLException e) {
e.printStackTrace();
}

}

springsql4

6-)Peki Spring JDBC nedir?Temel olarak jdbc kullanan ama üstüne bir katman daha eklenerek jdbcde kodla yapılan pek cok işlemi soyutlaştırarak bize daha az kod ile daha cok iş yapabileceğimiz ,ayrıca veritabanı işlemlerimizi daha kolay ve nesneye dayalı proglama şeklinde yapmamızı olanak sağlayan bir frameworktür

https://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/jdbc.html

SpringJDBCnin bizim için temel olarka yapabildiği işlemler örneği

springsql5

7-)öncelikle pom.xmlimize spring-jdbc yide dependecy olarak ekleyelim

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>LATEST</version>
</dependency>

 

 

Select işlemlerimiz için JdbcTemplate bloğunu kullanabiliriz burada RowMapper mantığı yardımı ile işlemlerimizi nesneye dayalaı modelleme şeklinde getirebiliriz

 

public  static void ConnectandSelectSpringJDBC()
{
String connectionUrl =“jdbc:sqlserver://DESKTOP-myinstance\\SQLEXPRESS;databaseName=AddressBook;integratedSecurity=true;portNumber=1433″;
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
dataSource.setUrl(connectionUrl);

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String query = “SELECT * FROM PersonTable WHERE ID = ?”;
Person person = jdbcTemplate.queryForObject(
query,new Object[] { 1 }, new PersonRowMapper());

System.out.println(person.getName());

}

springsql6

public class PersonRowMapper implements RowMapper<Person> {
@Override
public Person mapRow(ResultSet resultSet, int i) throws SQLException {
Person p = new Person();

p.setID(resultSet.getInt(“ID”));
p.setName(resultSet.getString(“Name”));
p.setSurname(resultSet.getString(“Surname”));

return p;
}
}

 

 

8-) SimpleJdbcInsert ile insert işlemlerizi kolayca yapabiliyoruz ,eğer ID alanı otomatik artan bir değer ise dönüş değerinide usingGeneratedKeyColumns(“ID”); işaretleyerek simpleJdbcInsert.executeAndReturnKey kolayca alabiliyoruz

 

public  static  void InsertSpringJDBC()
{
String connectionUrl =“jdbc:sqlserver://DESKTOP-myinstance\\SQLEXPRESS;databaseName=AddressBook;integratedSecurity=true;portNumber=1433″;
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
dataSource.setUrl(connectionUrl);

SimpleJdbcInsert simpleJdbcInsert = new SimpleJdbcInsert(dataSource)
.withTableName(“PersonTable”)
.usingGeneratedKeyColumns(“ID”);

Map<String, Object> parameters = new HashMap<String, Object>();
// parameters.put(“ID”, 5);
parameters.put(“Name”, “Ali”);
parameters.put(“Surname”, “Güven”);

Number id = simpleJdbcInsert.executeAndReturnKey(parameters);
System.out.println(“Generated id – ” + id.longValue());

}

 

9-)SimpleJdbcCall ile de storedprocedure örneklerini springjdbc metolodojisinde kullanabiliyoruz

 

10-)update işlemleri için ise JdbcTemplatein update özelliğini kullanabiliriz

 

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update(“update PersonTable set name = ? where ID = ?”,
new Object[] {“Ali Veli “, 1002});

11-)delete işlemleri için yine jdbctemplatein update fonksiyonelitisi kullanabiliyoruz

 

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update(“delete PersonTable where ID = ?”,
1002);

 

12-) NamedParameterJdbcTemplate ile parametre isimlerinide belirleyerek daha kontrollü sorgularda oluşturabiliriz,dikkat edilmesi gereken nokta sorgu parametreleri : nokta ile belirtmektir.
String connectionUrl =“jdbc:sqlserver://DESKTOP-myinstance\\SQLEXPRESS;databaseName=AddressBook;integratedSecurity=true;portNumber=1433″;
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
dataSource.setUrl(connectionUrl);

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
// jdbcTemplate.update(“delete PersonTable where ID = ?”,1002);

NamedParameterJdbcTemplate namedTemplate=new NamedParameterJdbcTemplate(jdbcTemplate);
Map namedParameters = new HashMap();
namedParameters.put(“ID”, 1003);
namedTemplate.update(“delete PersonTable where ID = :ID”,namedParameters);

 

Genel kategorisine gönderildi | Yorum bırakın

AngularJs Giriş 2

Bu yazımızda anguların özelliklerini görmeye devam ediyor olacağız.

Dinamik CSS Kullanımı (ng-class)

ng-class yardımıyla koşullara bağlı olarak farklı css atamaları yapabiliriz

İlk önce MyDesign.css adlı bir css dosyası oluşturarak aşağıdaki gibi iki stil ekleyelim

 

.HasCar {
background-color:green;
}

.NoCar {
background-color:red;
}

 

Daha sonra Sayfamızda bir tablo oluşturarak dinamik bir şekilde kişinin arabasının olup olmamasına göre tablodaki o satırın arkaplan rengini değiştirilelim

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script src="Scripts/angular.min.js"></script>
<link href="MyDesign.css" rel="stylesheet" />
</head>
<body>

<div ng-app="" ng-init="persons=[
{name:'Bilgehan',hascar:'no'},
{name:'Tayfun',hascar:'yes'},
{name:'Harun',hascar:'no'}]" >

<table>

<tr ng-repeat="person in persons" ng-class="person.hascar=='yes' ? 'HasCar' : 'NoCar'">
<td>{{person.name}}</td>
<td>{{person.hascar}}</td>
</tr>

</table>

</div>
</body>
</html>

ng-class=”person.hascar==’yes’ ? ‘HasCar’ : ‘NoCar'” burada gördüğümüz üzere eğer kişinin hascar propertisinin değeri yes ise HasCar stili değilse NoCar stili işletilerek koşula bağlı css ekleme yapılabilir.

angular1

Angularjs Filter
Gelen veriyi tarih formatına veya para formatına veya çeşitli string formlarına dönüştürebilmemize olanak sağlar.Ayrıca gelen verileri sıralama ve gösterilecek datayı limitleme konularında kullanabiliriz

Örnek olarak bir dizi tanımlayalım ve bunun ilk elemanını tüm harflerini büyük yapalım filter kullanmak icin sadece | işaretinden sonra gerekli keywordü veya expressionı yazmak yeterli olacaktır

<span>{{persons[0].name | uppercase}}</span>
Sıralama yapmak için orderby keywordünü kullanıyoruz

<tr ng-repeat=”person in persons | orderBy:’Age'”>

Descending yani tersten sıralama yapmak için ise orderby ile propertden önce – işaretini kullanabiliriz

<tr ng-repeat=”person in persons | orderBy:’-Age'”>
Gösterilecek kayıt sayısını sınırlamak için limitTo

<tr ng-repeat=”person in persons | limitTo:2″>
Tarih formatlamak için date keywordünü kullanabiliriz
{{ ‘2015-10-04T17:57:28.556094Z’ | date : ‘dd/MM/yyyy @ HH:mm’}}

Aşağıda kod olarak örnekleri mevcuttur

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <script src="Scripts/angular.min.js"></script>
    <link href="MyDesign.css" rel="stylesheet" />
</head>
<body>

    <div ng-app="" ng-init="persons=[
{name:'Bilgehan',hascar:'no',Age:'29'},
{name:'Tayfun',hascar:'yes',Age:'28'},
{name:'Harun',hascar:'no',Age:'27'}]">

        <h2>Tüm Karakterler Büyük</h2>
        <span>{{persons[0].name | uppercase}}</span>

      <h2>  Sıralama olmadan</h2>
        <table>
            <tr ng-repeat="person in persons ">
                <td>{{person.name}}</td>
                <td>{{person.hascar}}</td>
                <td>{{person.Age}}</td>
            </tr>
        </table>

        <h2> Yaşa Göre Artan Sırada</h2>
        <table>
            <tr ng-repeat="person in persons | orderBy:'Age'">
                <td>{{person.name}}</td>
                <td>{{person.hascar}}</td>
                <td>{{person.Age}}</td>
            </tr>
        </table>

      <h2>   Yaşa Göre Azalan Sırada</h2>
        <table>
            <tr ng-repeat="person in persons | orderBy:'-Age'">
                <td>{{person.name}}</td>
                <td>{{person.hascar}}</td>
                <td>{{person.Age}}</td>
            </tr>
        </table>


        <h2>ilk iki kayıt gözüksün,Görünecek dataya sayısını limitleme </h2>
        <table>
            <tr ng-repeat="person in persons | limitTo:2">
                <td>{{person.name}}</td>
                <td>{{person.hascar}}</td>
                <td>{{person.Age}}</td>
            </tr>
        </table>

         <h2>  Tarih Formatlama örneği </h2>

      Tarih:  {{ '2015-10-04T17:57:28.556094Z' | date : 'dd/MM/yyyy @ HH:mm'}}
    </div>


</body>
</html>

angular2

.NET kategorisine gönderildi | Yorum bırakın

AngularJS Kavramına Giriş – 1

AngularJs Nedir

Web uygulamalarında hız ve kolaylık sağlamak amacıyla ortaya çıkmış google tarafından desteklenen bir javascript frameworktür.

Angularjs daha iyi anlayabilmek icin bazı temel kavramlara değinelim

DOM(Document Object Model):Html DOM yapısı sayesinde bir sayfa yüklendiğinde html elemanlarını birer object olarak modelleyip,bunların propertyleri eventleri ve methodlarına erişip değiştirebileceğimiz bir programmatik interface sunar bize.

Örnek olarak bu şekilde demo adlı paragraf elementimizin özelliğini değiştirmiş olduk.

<p id="demo "></p>
<script>
document.getElementById("demo").innerHTML = "Hello World!";
</script>

 

MVC(Model View Controller):Yazılım mühendisliğinde kullanılan mimari bir desendir.Amaç katmanları birbirini etkilemeyecek şekilde bir yapı kurmaktır

• Model:İş mantığının oluştugu veriye erişim ve validasyon işlemlerinin oldugu katmandır.Genelde databaseden veri atma ve veri alma işlemleri yapan katmandır
• Controller:Viewle model arasındaki köprüdür.kullanıcılardan gelen requestleri değerlendirerek hangi işlemlerin yapılıp kullanıcıya hangi viewin döneceğini belirler.
• View:Uygulamanın arabirimine ait her şey htlm,css view içine girer.Kısaca kullanıcının gördüğü kısımdır.Burada herhangi bir business logic bulunmaz.

Angular JS Temel Özellikleri

1-)Rest Uyumlu:Rest servicelerinden aldıgınız dataları kolayca işleyebilirsiniz

2-)MVW: (Sitesindeki tabirle J Model View Whatever)Yani mvc veya mvvm patternlerine uyumlu mimari tasarımdadır.

3-)Dependency Injection:Yazılımı oluşturan bağların birbirleri ile olan bağlılıgını minimuma indirerek,uygulamalarda değişiklikleri kolayca yapabilecek bir yapı kurmayı sağlayan yazılım patternidir.Angularjs componentler create edip bu komponent arası dependcyleri çözerek başka componentlerinde kullanılmasına olanak sağlar

4-)İki yönlü data binding:Model ve view componentleri arasındaki senkronizasyonu otomatik sağlama.Ng-Model kullanımı.

5-)Template

Yukarıdaki gibi özelliklerde olan bir frameworktür.Bu özellikleri nasıl sağladıgı örneklerle ilerleyen aşamalarda anlatacağız

ANGULARJS Visual STUDIO Ayarları

Öncelikle boş bir web projesi açalım ve Tools à manage nuget packages dan angularjs kütüphanemizi projemize install edelim

 

angular1

angular2

Görüldüğü gibi angularjs le alakalı tüm dosyalarımız geldi.Projemize bir tane html sayfa ekleyelim ve ilk angular kodumuzu yazalım.Öncelikle yapmamız gereken şey angular.min.js scriptini sayfamıza atamak.

angular3

Angularjs DIRECTIVE:ng önekiyle başlayan html attributeları angular js html compiler ile yorumlanarak çalıştırılır.

Yukarıdaki örnekte

ng-app hangi angularjs applicationına ait oldugunu belirttik
ng-init le angularjs application seveyisinde bir tane değişken tanımladık
ng-bind ile oluşturdugumuz parametreyi set ederek değerini labelin inner htmline atamıs olduk

Angular js DATA BINDING(Datanın model ve view arası senkrozisyonu)

Alttaki örnekte ise ilk olarak directive olarak ng-model görmekteyiz

ng-model: Bu model sayesinde html bir kontrolün (input vs…) değerini bir parametreye atıyoruz.bizim örneğimizde surname parametresine

ve {{ surname }} diyerekte bu değeri ekranı yazdırıyoruz.

{{parametre adı}} bu şekilde yazıma angular js databinding expression denir .

Bu şekilde

angular4

Angular JS ng-repeat

Bir foreach yapısı gibi diziler arası gezinmemizi sağlar.Örneğimizde initde bir tane json array de nesneler tanımladık ve ng-repeat ile foreach mantıgında bu nesneler arasında dönerek ekrana yazdırdık

angular5

.NET kategorisine gönderildi | Yorum bırakın

MONGODB .NET (C#) ENTEGRASYONU

Öncelikle C# entegrasyonu için kendiniz mongodb driverlarını kullanarak geliştirme yapabileceğiniz gibi mongorepository gibi open source kütüphanelerde mevcuttur.Codeplextten mongorepository ait dllleri indirerek bizim kendi örneğimizde yapacağımız pek çok işlemi yapabilirsiniz.

https://mongorepository.codeplex.com/SourceControl/latest

Ancak biz hem esneklik hem öğrenme amaçlı olarak bu makalede kendi sınıflarımızı yazacağız ama pek çok noktada mongorepository yazılmışı var cümlesini karşılamaktadır :)

Öncelikle mongodb .net driverlarını projemize eklememiz gerekiyor

Bunun için birkaç yöntem kullanabiliriz

İlk olarak github tan gerekli dllleri indirebilirsiniz.(En son release dosyalarını indirmeye dikkat edin)

https://github.com/mongodb/mongo-csharp-driver/releases

Ya da mongo dbnin nuget desteğide mevcuttur

Install-Package mongocsharpdriver

Biz kendi örneğimiz için bir tane Windows application projesi açarak nuget yardımıyla güncel driverımızı indirelim

mongonet1

Nuget ile dlleri kendimizi aldıgımızda proje referanslarımızda mongodb dllerini görüyor olacağız.

mongonet2

Ancak yinede kendi mongo db kütüphanemizi yazarken githubta bulunan örnek repositorylerden faydalanıyor olacağız.

https://github.com/rsingh85/MongoDbRepository

Öncelikle bir tane base nesne classı oluşturalım,mongo dbye gidecek bütün nesnelerimiz entitybase türetiyor olacağız.Mongodb collectionda bulunan her bir documentin bir idsi vardır ve deserialize edilirken bu idde deserialize edilir.Bsonid attribute ile ilgili propertimizin bu dökümana ait identification alanı oldugunu belirttik

namespace MongoDbSample.MongoRepository
{
    public  class EntityBase
    {
        [BsonId]
        public string Id { get; set; }
    } 
}

Not: Esasta bson attribute yerine direkt Objectid kullanabilirdik ancak json deserialize ederken bu şekilde kullanım size sorun çıkartıyor.Bu yüzden biz serialize işlemlerinde sorun yaşamamak için string bir alan tanımladık.ve bunu BsonId attribute ile işaretledik.

public ObjectId Id { get; set; }
İkinci olarak repository pattern yapısına uygun olarak bir tane repository interface hazırlayım.Bu interfacede temel crud işlemleri ve search ve getbyid gibi detay getiren fonksiyonlarımız olsun.

namespace MongoDbSample.MongoRepository
{
    public interface IRepository<TEntity> where TEntity : EntityBase
    {
        WriteConcernResult Insert(TEntity entity);
        WriteConcernResult Update(TEntity entity);
        WriteConcernResult Delete(TEntity entity);
        IList<TEntity>
            SearchFor(Expression<Func<TEntity, bool>> predicate);
        IList<TEntity> GetAll();
        TEntity GetById(string id);
    } 
}

Bu interfacede değişik olarak dikkatinizi çeken nokta WriteConcernResult olmuştur.WriteConcernResult ile mongodbden işleminize ait dönüş bilgisini alabilirsiniz.
WriteConcernResultla mongodb de hata oluşmussa nedenini vs gibi bilgilerini elde edebilirsiniz

mongonet3

Şimdide bu interfaceden türeyecek kendi repositorymizi MongoDbRepository ismiyle oluşturalım

using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Builders;
using MongoDB.Driver.Linq;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace MongoDbSample.MongoRepository
{
    public class MongoDbRepository<TEntity> :IRepository<TEntity> where TEntity : EntityBase
    {
        private MongoDatabase database;
        private MongoCollection<TEntity> collection;

        public MongoDbRepository()
        {
            GetDatabase();
            GetCollection();
        }

        public WriteConcernResult Insert(TEntity entity)
        {
            entity.Id = ObjectId.GenerateNewId().ToString();
            WriteConcernResult result = collection.Insert(entity);
            return result;
        }

        public WriteConcernResult Update(TEntity entity)
        {
            if (entity.Id == null)
                return Insert(entity);

           WriteConcernResult result=collection
                .Save(entity);
           return result;
                  
        }

        public WriteConcernResult Delete(TEntity entity)
        {
            WriteConcernResult result=collection
                .Remove(Query.EQ("_id", entity.Id));
            return result;
                    
        }

        public IList<TEntity>
            SearchFor(Expression<Func<TEntity, bool>> predicate)
        {
            return collection
                .AsQueryable<TEntity>()
                    .Where(predicate.Compile())
                        .ToList();
        }

        public IList<TEntity> GetAll()
        {
            return collection.FindAllAs<TEntity>().ToList();
        }

        public TEntity GetById(string id)
        {
            return collection.FindOneByIdAs<TEntity>(id);
        }

        #region Private Helper Methods
        private void GetDatabase()
        {
            var client = new MongoClient(GetConnectionString());

            var server = client.GetServer();

            database = server.GetDatabase(GetDatabaseName());
            }

        private string GetConnectionString()
        {
            return ConfigurationManager
                .AppSettings
                    .Get("MongoDbConnectionString")
                        .Replace("{DB_NAME}", GetDatabaseName());
        }

        private string GetDatabaseName()
        {
            return ConfigurationManager
                .AppSettings
                    .Get("MongoDbDatabaseName");
        }

        private void GetCollection()
        {
            collection = database
                .GetCollection<TEntity>(typeof(TEntity).Name);
        }
        #endregion
    } 
}

Repositorymizi yukarıdaki gibi yazdıktan sonra database bağlantı bilgilerimizi aşağıdaki gibi app.configimize ekleyelim

mongonet4

Şimdi bir kişi ve bu kişiye ait mailleri tutan model sınıflarımızı yazalım.Burda kilit nokta eklemek istediğimiz ana nesnenin EntityBaseden türeyerek bir bsonid yani mongodb id alanına sahip olmasıdır.

namespace MongoDbSample.Model
{
    public class Person:EntityBase
    {
        public string Name { get; set; }

        public string Surname{get;set;}

        public List<Mail> Mails { get; set; }
    }
}

namespace MongoDbSample.Model
{
    public class Mail
    {
        public string MailAddress { get; set; }

        public bool IsBusiness{get;set;}
    }
}

Sınıflarımızı oluşturdak sonra ui projemize bir tane button ekleyip mongo dbye ilk kaydımızı ekleyelim

private void btnInsert_Click(object sender, EventArgs e)
        {
            Person p = new Person();
            p.Name = "Bilgehan";
            p.Surname = "Yıldız";
            p.Mails = new List<Mail>()
            {
            new Mail(){ IsBusiness=true, MailAddress="abc@d.com"},
            new Mail(){ IsBusiness=false, MailAddress="e@f.com"},
            };

            MongoDbRepository<Person> Repository = new MongoDbRepository<Person>();
           WriteConcernResult result= Repository.Insert(p);
           if (!result.HasLastErrorMessage)
           {
               MessageBox.Show("Kayıt başarı ile eklendi");
           }
        }

mongodb de bakalım
mongonet5

Görüldüğü üzere oluşturdugumuz sınıfın adında ve sınıftaki propertylere göre veritabanımıza kayıt eklendi peki biz eğer veritabanındaki kolonlarla .net sınıfmızdaki alanların farklı olmasını istersek.

Temelde baktıgımızda mongodbye kayıt atmak ve kaydı okumak serialization işlemleri dolayısıyla burada nasıl ki datacontract serializerda propertylere alias vermek için [DataMember(Name=”xxxxx “)] gibi yöntemler kullanıyorsak ise BsonElement kavramı devreye
devreye giriyor örneğimizi test etmek amaclı Mail sınıfında bulunan IsBusiness alanını IsBusinessMail yapalım ama geçmiş kayıtlarla uyumlu olması açısından database bu alanın eski adıyla IsBusiness olarak atılmasını istiyorum BsonElementin attributeın name özelliği burada devreye giriyor

public class Mail
    {
        public string MailAddress { get; set; }
        [BsonElement("IsBusiness")] 
        public bool IsBusinessMail{get;set;}
    }

Şimdi Windows applicationdaki kayıt ekleme örneğimizdede alanın adını IsBusinesstan IsBusinessMaile çevirelim ve tekrar çalıştıralım.

private void btnInsert_Click(object sender, EventArgs e)
        {
            Person p = new Person();
            p.Name = "Ümit";
            p.Surname = "Gündüz";
            p.Mails = new List<Mail>()
            {
            new Mail(){ IsBusinessMail=true, MailAddress="mybusinessmail@d.com"},
            new Mail(){ IsBusinessMail=false, MailAddress="mypersonelmail@f.com"},
            };

            MongoDbRepository<Person> Repository = new MongoDbRepository<Person>();
           WriteConcernResult result= Repository.Insert(p);
           if (!result.HasLastErrorMessage)
           {
               MessageBox.Show("Kayıt başarı ile eklendi");
           }
        }

 

 

mongonet6

Görüldüğü üzere propertyimize bir nevi alias vermiş olduk.Bu şekilde serializable işlemlerinde size yardımcı olabilecek farklı attributelarda mevcuttur

mongonet7

Örnek olarak .net classınıza koydugunuz ancak database kaydının atılması istediğiniz alan varsa BsonIgnore attribute kullanabilirsiniz tıpkı xml serialization işlemlerinde kullandınız XmlIgnore attribute gibi

mongonet8

Veritabanında hangi alana collectiona kayıt atacağımız ise repositorydeki getcollection metodundan kalıyor bizim mantıgımızda classın adı collectionın adına eşit oluyor ancak isterseniz custom attributelar yapıp bu metodu değiştirerek istediğiniz collection adına göre kayıt işlemi yapmanızda mümkün.

Mesela mongorepository kütüphanesinde CollectionName diye bir attribute yaratıp bu attribute varsa collection adını buradan al yoksa sınıf adından al gibi bir yöntem geliştirmişler ,kendi mongo kütüphanenizi yazacaksanız bile mongorepository open source açıp kodlarına bakmak faydalı olabilir.

[AttributeUsage(AttributeTargets.Class, Inherited = true)]
    public class CollectionName : Attribute
    {

…………


  private static string GetCollectioNameFromInterface<T>()
        {
            string collectionname;

            // Check to see if the object (inherited from Entity) has a CollectionName attribute
            var att = Attribute.GetCustomAttribute(typeof(T), typeof(CollectionName));
            if (att != null)
            {
                // It does! Return the value specified by the CollectionName attribute
                collectionname = ((CollectionName)att).Name;
            }
            else
            {
                collectionname = typeof(T).Name;
            }

            return collectionname;
        }




Diğer metodlarımızada kısaca göz atalım
Örnek search metodumuz linq sorgusu yazar gibi kullanabiliyoruz

private void btnSearch_Click(object sender, EventArgs e)
        {

            MongoDbRepository<Person> Repository = new MongoDbRepository<Person>();

           var Searchlist =  Repository.SearchFor(p=>p.Name.Contains("Bilgehan"));
        }

mongonet9

Örnek olarak mongodbde bir kayıt güncelleme kaydın son halini çekip yeni bir mail ekleme örneği yapalım

private void btnUpdate_Click(object sender, EventArgs e)
        {
            MongoDbRepository<Person> Repository = new MongoDbRepository<Person>();
          Person p=  Repository.GetById("553365800529210aa0a24054");
          p.Mails.Add(new Mail() { IsBusinessMail = false, MailAddress = "extraaddedmail@f.com" });
          WriteConcernResult result = Repository.Update(p);
          if (!result.HasLastErrorMessage)
          {
              MessageBox.Show("Kayıt başarı ile güncellendi");
          }
        }

 

mongonet10

Bu şekilde de bu yazımızda mongodb c# entegrasyonun temel halini görmüş olduk.

.NET, MONGODB kategorisine gönderildi | 10 yorum

MONGODB GİRİŞ

Yazıya başlamadan önce bu makalede bazı noktalar Sayın Tolga Yıkılmaz’ın  akademik amaçlı yazdıgı BigData çalışmasından alıntılar içermektedir,kendisine teşekkür ederiz.

Bu yazımızda nosql ne oldugu,mongodbnin genel tanımı,mongodbde database design konusu ve mongodbnin kurulumu gibi konuları ele alıyor olacağız.

NOSQL NEDİR?

İlişkisel veritabanı sistemlerine (RDBMS) alternatif olarak ortaya çıkan, aslen internetin gün geçtikçe artan verisini depolayabilmek ve yüksek trafiğe sahip sistemlerin ihtiyaçlarına cevap verebilmek amacıyla ortaya çıkmış yatay olarak ölçeklendirilebilen sistemlere verilen genel addır.NoSQL sistemlerinde RDBMS’de kullanılan SQL dili kullanılmadığı için “No SQL” adı verilmiştir. Kendini kanıtlamış bir çok örneği olmasına rağmen henüz endüstri standardı olarak kabul görmemesinden dolayı kimi zaman ”Not Only SQL” olarak da adlandırılır.

RDBMS’ler işlem (transaction) tabanlı çalışan sistemlerdir. Bu işlemlerin stabil çalışması ve veri bütünlüğü için ACID (Atomicity, Consistency, Isolation, Durability) kuralları bulunur. NoSQL sistemleri bu kuralların tamamına uymaz.

RDBMS’lerde veriler tablolarda, tanımlı sütunlarda satır satır bulunurken, NoSQL sistemler sabit tablo tanımlarına bağımlı değillerdir. Yani daha sonradan özel bir işlem yapmadan yeni kolonlar eklenebildiği gibi, kayıtlar arasında kolon farklılıkları olabilir. Örneğin 1. satırda a ve b kolonları varken 2. satırda bambaşka kolonlar bulunabilir. Bu esnek yapı bize denormalizasyon kolaylığı sağlar. RDBMS’lerde veriler ilişkilerine göre ayrı tablolara düzenli bir şekilde yerleştirilerek normalize edilirken, verilere erişim için birleştirme (join) kullanılır.

Dağıtık sistemlerde birleştirme operasyonu sıkıntılara sebep olur. Çünkü birleştirilmek istenen veriler farklı parçalarda olabilir. Bu yüzden dağıtık sistemlerde birleştirme işlemi elle yapılmalıdır. Yani önce a verisi çekilir, sonra bununla ilişkili b verisi çekilip programatik olarak birleştirilme yapılır. Normal sistemlerde bu işlemler performans kaybına sebep olurken, dağıtık sistemlerde bu performans kaybı sistemin genel performansı yanında önemsizdir. İşte bu sebeple dağıtık sistemlerde birleştirme operasyonu yapmak yerine veri denormalize tutularak verilere erişim kolaylaştırılır.

NoSQL sistemleri yüksek erişilebilirlik sunarlar. Okuma ve yazma performansları olarak RDBMS’lerden göreceli olarak daha performanslı olabilirler.

MONGODB NEDİR?

MongoDB döküman tabanlı bir NoSQL veritabanı sistemidir. MongoDB yapısal verileri JSON benzeri dökümanlarlarda (BSON= Binary JSON) tutar. Her türlü sorgulama ve yönetim işleri JavaScript formatında yapılır.Bu yüzden asp.net wep api gibi rest tabanlı uygulamalar geliştirirken kolaylık sağlar.

MongoDB  2007 yılında 10gen firması tarafından geliştirilmeye başlandı.MongoDB ücretsiz olarak sitesinden indirilip kullanılabiliyor.

Arşivleme ve loglama uygulamalarında, dinamik veriyapısı ihtiyacı duyan sistemlerde, yüksek miktarda veri okuma ve yazma ihtiyacı olan uygulamalarda, ilişkisel olmayan basit veri yapılarında RDBMS yerine MongoDB kullanmak daha uygun olabilir.

Diğer NoSQL çözümleri ile karşılaştırıldığında MongoDB barındırdığı özellikler ile öne çıkıyor. Bu özellikleri şöyle özetleyebiliriz:

Sorgu (query) desteği sayesinde RDBMS’lerde olduğu gibi istenilen alanlara göre, belirli aralıklara göre (range query) ve düzenli ifadelerle (regular expression) sorgu yazılabiliyor. Birçok NoSQL çözümü sadece anahtarlar (key) üzerinden veri sorgulamasına izin verdiğinden bu çok önemli bir avantaj.

İstenilen alanlara göre sorgu yapabilen MongoDB ayrıca bu alanlara indeks (secondary index) oluşturarak daha performanslı çalışabilme imkanı sağlıyor.

MongoDB ölçeklenebilirliği sağlamak için Master-Slave Replication desteği sunuyor. Bu modelde yazma işlemleri master sunucuya yapılırken okuma işlemleri slave sunuculardan yapılarak ölçeklendirme sağlanıyor. Master sunucuya herhangi bir şekilde erişilemez ise slave sunuculardan birisi yeni master olarak çalışmaya başlıyor ve sistem kesintisiz bir şekilde devam edebiliyor.

C, C++, C#, Java, PHP, Python, Erlang birçok dil için sürücü (driver) desteği sunuyor. Bu kütüphaneler gerçekten basit ve güzel tasarlanmış. Hızlı bir şekilde hemen geliştirmeye başlayabiliyorsunuz.Mongodb ile alakalı ikinci yazımızda c# entegrasyonu noktasını ele alıyor olacağız.

MongoDB’de veriler Document‘lar halinde Collection‘lar içerisinde bulunur. Veri yapısı açısından RDBMS sistemlerle karşılaştırıldığında Collection tabloya, bir Document ise tablodaki bir satıra denk gelir diyebiliriz. Ancak bir tablo içerisindeki kolonlar aynı iken bir Collection içerisindeki farklı Document’lar farklı alanlar barındırabilir.

MONGODB Kurulumu

Öncelikle mongodb nin sitesinden kurulum dosyalarımızı indirelim.

http://www.mongodb.org/downloads

Kurulum dosyasını indirdikten sonra msi dosyamıza çift tıklayıp kurulumu başlatıyoruz

Kurulum bitince aşağıdaki şekilde defaultta programfiles altına mongodb dosyaları atılıyor.

Bundan sonra mongodbnin datalarımızı saklamak icin directory ayarlarını yapmamız gerekiyor.

Command prompt açıp mongodb filelarınızın oldugu path geçiş yapın

cd C:\Program Files\MongoDB\Server\3.0\bin

Daha sonra yine komut satırından mongod exe yardımı ile mongodb mizi install ediyoruz

–smallfiles küçük boyutta kurulum yapmanızın sağlıyor

–port=8080 diyerek mongodbmizin hangi porttan çalışacağını belirliyoruz

–dbpath komutu ile mongodb data directorymizi yani datamızın saklanacağı pathi belirtiyoruz

C:\Program Files\MongoDB\Server\3.0\bin>mongod –dbpath=C:\MyMongoDb –port=8080

–smallfiles –logpath=C:\MyMongoDb\log.txt –install

mongod –dbpath=C:\MyMongoDb –smallfiles –logpath=C:\MyMongoDb\log.txt –install

Eğer port kullanmadan kurulum yaparsak mongodb 27017 portuna default olarak almaktadır.bu portunda kullanım için açık olması gerekmektedir.

Daha sonra services(hizmetlere) gelerek mongodb servisimizi start ediyoruz.

MONGOVUE(Mongodb için arayüz aracı)

Mongodbde sqlserver management studio veya oracle icin sqlnavigator gibi kayıtlarınıza bakıp administration yapabileceğiniz toollarda bulunmaktadır

Bunlardan birtanesi mongovue bazı özellikleri paralı olsada genel işlemleriniz için ücretsiz indirip kurabilirsiniz

http://www.mongovue.com/downloads/

Bu linkten mongovue installer.msi indirip kurulumunu yapabilirsiniz

Kurulum bittikten sonra programın nereye bağlancağını belirliyoruz

Bağlantımızı mongovue üstünde sağladıktan sonra add database diyerek ilk mongo database mizi oluşturuyoruz

Mongovue nin database explorerda oluşturgumuz ilk databasemizi açtığımızda db mize ait itemlarımızı görüyoruz.

Burada en önemli item Collections yani sql server veya oracleda tablo karşılıklarımız.Databasemize ait ilk collectionımızı oluşturuyoruz

Add collection diyerek Person isimli bir collection oluşturalım

Bu collectionımıza tıklayıp içine ilk kaydımızı atalım.Artık burada oracle veya sql serverdan alışık oldugumuz tabloya ait sabit alanlar mantıgı yok.Collectionı oluşturduktan sonra formatı uygun oldugu sürece istediğiniz kaydı içeri atabilirsiniz.

{

“Name”: “Bilgehan”,

“Surname”: “Yıldız”,

“Mails”: {

“mail”: [

{“value”: “a@b.com”},

{“value”: “c@d.com”}

]

}

}

Örnek olarak bu json kaydımızı ekleyelim,aşağıdaki ekran görüntüsündede gördüğünüz gibi kaydımız bir doküman olarak oluşup içeri atılmış oldu,ve artık veritabanı kolonlarından çok nesne tabanlı formatta dökümanımızı saklamıs olduk

SQLCOMMAND LINE BENZERI YAPI MONGO

Mongovue ile grafik arabiriminden yaptıgımız işleri oracle da oldugu sql command line mantıgı gibi komut satırından yapabiliriz.

mongo mongodb ninJavaScript shell interfacedir.

Mongod ile kurulum ayarlarını yaparken mongo exe ile de bu command line işlemleri yapabiliriz.komut satırımızı açıp önce mongo nun bulundugu dizine geçiş yapalım daha sonra mongo yazarak shell arabirimine geçiş yapalım

Örnek  show dbs mongodbimizdeki database listesini verir .Benzeri komutları mongodb sitesinden bakarak komut satırı ile kullanabilirsiniz.

MONGODB DATABASE DESIGN

Relational database kavramından farklı olarak artık mongoda nesne mantıgında tasarım düşünmemiz gerekiyor ve mongodbde denormalize yapılarla çalışmaya alışmamız gerekiyor.

İlk Modelleme yöntemimiz

  • Bire az ilişki:Buna örnek olarak kişi ve kişinin adreslerini örnek verebiliriz.bunu tek bir doküman olarak aşağıdaki şekilde saklayabiliriz

{

name:Bilgehan,

addresses : [

{ street: ‘Ümraniye’, city: ‘istanbul’},

{ street: ‘kızılay’, city: ‘Ankara }

]

}

  • Bire çok ilişki:Buna örnek olarak bir ürün ve bu ürüne ait yedek parçalar verebiliriz.Burada parçalar çok fazla bilgisi olacağı ve parçaların değişkenlikleri yani updatelerinin de çok olacağını düşünerek relational databaselerdeki gibi üründe parçaların idlerini tutup programlama anında gerekli dataları çekip birleştirme yapabiliriz.

{

name : ‘product A’,

manufacturer : ‘ABC Company’,

catalog_number: 1234,

parts : [     // array of references to Part documents

ObjectID(‘AAAA’),    // reference to the #4 grommet above

ObjectID(‘F17C’),    // reference to a different Part

ObjectID(‘D2AA’),

// etc

]}

  • Bire çok ilişkiyi denormalize etmek:Yukarıda gerekli birleştirmeleri büyük sayıda kayıtlarda yapmak zahmetli olabilir.Burada şu kararıda verebiliriz yukarıdaki örnek için ürüne ait yedek parçaları gösterirken bize gerekecek büyük ihtimalle yedek parçanın adı elimizde olması yeterli olacaktır

{

name : ‘product A’,

manufacturer : ‘ABC Company’,

catalog_number: 1234,

parts : [     // array of references to Part documents

{ id : ObjectID(‘AAAA’), name : ‘Parça1′ },         // Part name is denormalized

{ id: ObjectID(‘F17C’), name : ‘Parça2′ },

{ id: ObjectID(‘D2AA’), name : ‘Parça3′ },    ]}

Burada ürünü gösterceğimiz sayfada tek bir nesneyi çekerek ürüne ait yedek parça adlarınıda listeyebiliriz

Sonuç olarak:

  • Denormalize yapılaraı büyük update maliyetleri yoksa tercih etmeliyiz.Yukarıdaki örnekte olduğu gibi yedek parça isimleri çok fazla değişmeyeceğini var sayıyoruz
  • Bağlantılı kayıt sayısı azsa ve bunlarda başka yerde kullanmayacaksa iç içe doküman yapısında saklayabiliyoruz.Örnek kişiye ait adresler
  • Eğer nesneye tek başına sürekli erişim ihtiyacı varsa embedded şekilde kullanmamaya çalışın
  • Designınızı uygulamanızın ihtiyaçlarına göre belirleyin

Temel olarak mongodb ye bir giriş yapmış olduk bir sonraki yazımda mongodb ve .net entegrasyonu konusuna değiniyor olacağım.

MONGODB kategorisine gönderildi | 2 yorum

VISUAL STUDIOYA EXTENSION YAZMA – 2

ilk yazımızda temel bir extensionın nasıl oluşturulacağını ve bir extension projesinde bulunan sınıfların ne işe yaradıgını görmüştük.şimdi 1.yazımızın devamında biraz daha detaya girelim.İlk yazıda en son sağ menüye eklediğimiz custom commanddan bir tane form açılmasını sağlamıstık.
Şimdi ise tıkladıgımızın sınıfın isminide forma geçelim burada com objelerini kullanabilmemiz icin EnvDTE kütüphanesinden yararlanacağız.
Bunun için extension yazdıgımız projemize bir tane hepler class ekleyerek aşağıdaki aktif visualstudio projesinin bilgilerine erişebileceğimiz  kodumuzu yapıştırıyoruz(VisualStudioEnvironmentHelper isminde ekledim)
Bu kodlarımızın çalışması icin namespaceler ve hangi visual studio versionu icin kullanacaksanız ona göre ayar yapmanız lazım
Yani string rotEntry = String.Format(“!VisualStudio.DTE.11.0:{0}”,
Ben visual studio 2012 de yazdıgım ve çalıştıgım icin VisualStudio.DTE.11 dedim ama 2013 kullanacaksanız VisualStudio.DTE.12 demeliydiniz eğer extensionınız bir den fazla farklı visual studio ortamında çalışacaksa bu kodu kopyalıp ona göre çalışacak sekilde getcurrent metoduna if-else koymanız gerekecekti
using System;

using System.Runtime.InteropServices;

using System.Runtime.InteropServices.ComTypes;

using EnvDTE;

using Process = System.Diagnostics.Process;

namespace Skywalker.VSBilgehanPackage

{

public class VisualStudioEnvironmentHelper

{

[DllImport(“ole32.dll”)]

private static extern void CreateBindCtx(int reserved, out IBindCtx ppbc);

[DllImport(“ole32.dll”)]

private static extern void GetRunningObjectTable(int reserved,

out IRunningObjectTable prot);

internal static DTE GetCurrent()

{

//rot entry for visual studio running under current process.

string rotEntry = String.Format(“!VisualStudio.DTE.11.0:{0}”,

System.Diagnostics.Process.GetCurrentProcess().Id);

IRunningObjectTable rot;

GetRunningObjectTable(0, out rot);

IEnumMoniker enumMoniker;

rot.EnumRunning(out enumMoniker);

enumMoniker.Reset();

IntPtr fetched = IntPtr.Zero;

IMoniker[] moniker = new IMoniker[1];

while (enumMoniker.Next(1, moniker, fetched) == 0)

{

IBindCtx bindCtx;

CreateBindCtx(0, out bindCtx);

string displayName;

moniker[0].GetDisplayName(bindCtx, null, out displayName);

if (displayName == rotEntry)

{

object comObject;

rot.GetObject(moniker[0], out comObject);

return (DTE)comObject;

}

}

return null;

}

}

}
Hepler metodumuz sayesinde aktif projedeki seçili itema ulaşabiliyoruz ve bunu formumuza parametre olarak geçiyoruz

Tabi forma bu değeri parametre geçip ekranda gösterebilmek icin ufak bir modifikasyon yapıyoruz.


Tekrar start new instance extensionımızı debug modda çalıştırıp custom commanda tıkladıgımızda artık seçili classın adının ekrana geldiğini görüyoruz.
Ve son olarak bu custom commandımızın sadece belli tiplerde örneğin sadece .cs uzantılarda çıksın ancak .config uzantılarda çıkmasın gibi kısıtlamak icin aşağıdaki işlemleri yapıyoruz.

Öncelikle package projemize ProvideAutoLoad Attribute eklememiz gerekiyor

Buradaki quid UICONTEXT_SolutionExists yani solution varsa otomatik yüklenme icin guid sabiti eklememiz gerekiyor

Bu key ile alakalı detay  bilgilere msdn ulaşabilirsiniz

https://msdn.microsoft.com/en-us/library/bb166762%28v=vs.80%29.aspx

[ProvideAutoLoad(“{f1536ef8-92ec-443c-9ed7-fdadf150da82}”)]

Ayrıca burada artık örneğimizi değiştirerek menucommanddan türeyen olemenucommand nesnesi ve bunun BeforeQueryStatus eventini kullanıyor olacağız.Initialize metodumuzu aşağıdaki gibi değiştiriyoruz

protected override void Initialize()

{

Debug.WriteLine(string.Format(CultureInfo.CurrentCulture, “Entering Initialize() of: {0}”, this.ToString()));

base.Initialize();

// Add our command handlers for menu (commands must exist in the .vsct file)

OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;

if (null != mcs)

{

// Create the command for the menu item.

CommandID menuCommandID = new CommandID(GuidList.guidVSBilgehanPackageCmdSet, (int)PkgCmdIDList.BilgehanCustomCommand);

OleMenuCommand menuItem = new OleMenuCommand(MenuItemCallback, menuCommandID);

menuItem.BeforeQueryStatus += new EventHandler(OnBeforeQueryStatus);

mcs.AddCommand(menuItem);

}

}

Ve beforeQueryStatusun kullanacağı bir handler yazayoruz.Burada ise sadece cs uzantılı dosyalarda extensionımızın aktif olacağını belirtiyoruz ve IVSHierarchy kütüphanesinden faydalanıyoruz(VsPackages proje hiyarsisi kısmını yönetebilmek icin gereklidir)

private void OnBeforeQueryStatus(object sender, EventArgs e)

{

OleMenuCommand menuCommand = sender as OleMenuCommand;

if (menuCommand != null)

{

IntPtr hierarchyPtr, selectionContainerPtr;

uint projectItemId;

IVsMultiItemSelect mis;

IVsMonitorSelection monitorSelection = (IVsMonitorSelection)Package.GetGlobalService(typeof(SVsShellMonitorSelection));

monitorSelection.GetCurrentSelection(out hierarchyPtr, out projectItemId, out mis, out selectionContainerPtr);

IVsHierarchy hierarchy = Marshal.GetTypedObjectForIUnknown(hierarchyPtr, typeof(IVsHierarchy)) as IVsHierarchy;

if (hierarchy != null)

{

object value;

hierarchy.GetProperty(projectItemId, (int)__VSHPROPID.VSHPROPID_Name, out value);

if (value != null && value.ToString().EndsWith(“.cs”))

{

menuCommand.Visible = true;

}

else

{

menuCommand.Visible = false;

}

}

}

}

Ayrıca son olarak vstc filemızda dinamik visibility özelliğini aktif etmemiz gerekiyor

<CommandFlag>DefaultInvisible</CommandFlag>

<CommandFlag>DynamicVisibility</CommandFlag>

Projemizi tekrar debug modda çalıştırıp bir solution açtıgımızda artık commandımızın sadece cs uzantılı dosyalarda çıktıgını göreceğiz

Son olarak oluşturdugumuz bu extensionı başkalarının kullanabilmesi icin Release veya debug modda projemizi derleyip.vsix(Visual Studio Integration Package) olan dosyayı alıp kullanıcılarımıza veriyoruz

Kullanıcı bu vsix dosyasını kendi makinesinde çift tıklayıp kuruyor

Bunu yaptıktan sonra kullanıcımız artık açtıgı tüm projelerde bizim extensionımızı görüyor olacaktır.

.NET kategorisine gönderildi | 1 yorum

VISUAL STUDIOYA EXTENSION YAZMA -1

Öncelikle eğer kurulu değilse visual studio sdk yı makinenize kurmanız gerekiyor

Kurduktan sonra other Project types kısmına template geliyor.

Biz visual studio package seçerek projemizi oluşturuyoruz.Projemizin adını seçtikten sonra package wizard ekranları karşımıza çıkıyor.

Hangi dilde yazacağımızı seçiyoruz.

Bu ekranda ise biz sağ tuş menüsü yapacağımız için menucommand seçmemiz yeterli

Oluşacak menü commandımızın idsi ve adını belirliyoruz

Unittest projelerini biz create etmeyeceğimiz icin burada seçim yapmıyoruz bunun yerine oluşacak projede experimental mode dediğimiz mode ile testlerimizi yapıyor olacağız

Şekildeki gibi wizard bitiminde projemiz oluşuyor.

Yazdığımız projemizi experimental mode almak icin,package csproj properties kısmından debuga gelerek,start actionı  start external program olarak visual studiomuzun versiyonun deven.exe sini seçiyoruz.

Start optiona ise /rootsuffix Exp komutunu yazıyoruz.(Bu komut mevcut visual studio ayarlarımıza dokunmadan bağımsız bir visual studio profile oluşturulmasına olanak sağlıyor)

Oluşan projemizde özellikle iki dosya çok önemli

.vsct dosyası(Visual Studio Command File) burada yapacağımız custom commandımızın nerede gözükeceği,ilk açılırken görünüp görünmeyeceği gibi ayarlar mevcut.Biz context menu(sağ tuş J)yapmak istediğimiz için öncelikle custom commandımızın group ayarında id kısmına IDM_VS_CTXT_ITEMNODE keywordünü yazıyoruz bu visual studioya özel bir keyword,customcommandımızın nerede gözükeceğine iddeki keywordlere göre karar veriliyor.Bu keylerin daha fazlasını msdnden bakabilrisiniz ama bunlar specific keywordler oldugu icin geçerli olanı yazmanız gerekiyor

Diğer dosya ise Package.cs dosyası

https://msdn.microsoft.com/en-us/library/cc826118.aspx

(Guids and IDs of Visual Studio Menus)

https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.vsmenus_fields%28v=vs.90%29.aspx(VS menu fields)

Bu ayarımızı yaptıktan sonra ,artık experimental instance ayarlarımızda yapıldıgı icin kodumuzu start new instance diyerek başlatmış olduk.

Açılan visual studio instancemızdan bir tane solution açalım ve örnek bir classa sağ tıkladıgımızda yeni yarattıgımız custom commandımızı görebiliyoruz.

Peki bu yazdımız customcommandımıza bir işlev kazandaralım.Bu tuşa bastıgımızda bir form açalım ve bu formdan tıklanan classla ilgili bilgiler alıp bunu kaydedelim.

Bu işlemleri yapacağımız yer ise Package.cs dosyası,bizim örneğimizde

VSBilgehanPackagePackage.cs classı,bu classa çift tıkladıgımızda ise wizarddan gelen otomatik oluşan kodları görmekteyiz.Commandımızıa ait event ise wizardla oluşan (isterseniz değiştirebilirsiniz) MenuItemCallback Metodu

Senaryomuza uygun olarak ben bir tane Windows form oluşturarak bu metoda bağlıyorum,öncelikle projemizin içine bir tane Windows form oluşturuyorum

…Package.cs sınıfımıza geçip MenuItemCallback eventinde wizardın kodunu commentleyerek formu açan kodumuzu yazalım.

Projemizi tekrar start new instance çalıştırıp açılan visual studio instance açtıgımız projemizde tekrar custom commandımıza tıkladıgımızda artık tanımladıgımız formun açıldıgını görüyoruz

Extension yazmak ile daha detaylı bilgi için lütfen bu makalenin devam yazısını okuyunuz…

.NET kategorisine gönderildi | Yorum bırakın

C# XDOCUMENT KULLANIMI

Xdocument XmlDocument gibi xml dosyalarını oluşturma,okuma vs gibi işlemlerimiz için kullanabileceğimiz ,bunları yaparken de linq destekli işlemleri kullanmamıza olanak sağlayan bir classdır. Bu tarz özellikleri sayesinde xml üstünde işlem yapılmasını oldukça kolaylaştıran bir classtır. Bu özellik .Net3.5 ve sonrasında mevcuttur.

Örnek olarak aşağıdaki gibi bir sınıf yapımız olsun(Person).Bu Sınıf yapımızı örnek test setleri ile doldurarak liste halinde data sunan ikinci bir sınıf daha ekleyelim(PersonRepository)

public class Person

{

public int ID { get; set; }

public string Name { get; set; }

public int Age { get; set; }

}

public class PersonRepository

{

public List<Person> GetPersonList()

{

List<Person> PersonList = new List<Person>(){

new Person() { ID = 1, Name = “Bilgehan”, Age = 27 },

new Person() { ID = 1, Name = “Tolga”, Age = 30 },

new Person() { ID = 1, Name = “Murat”, Age = 30 },

new Person() { ID = 1, Name = “Yasin”, Age = 25 }

};

return PersonList;

}

}

Örnek 1 Gelen Listeyi XML Formatına dönüştürme

Bundan sonra ikinci aşamada ise bize bu listeyi xml yapısına dönüştürecek kodlarımızı yazalım.Bunun için örnek olması amacıyla uygulamamıza bir textbox ve buton atarak butonun arkasına aşağıdaki kodlarımızı yazalım

PersonRepository pRepository=new PersonRepository();

List<Person> PersonXmlList = pRepository.GetPersonList();

XDocument xDoc = new XDocument(

new XComment(“starting xml”),

new XElement(“PersonList”,

PersonXmlList.Select(x => new XElement(“Person”, new XAttribute(“ID”, x.ID), new XAttribute(“Name”, x.Name), new XAttribute(“Age”, x.Age)))));

xDoc.Declaration= new XDeclaration(“1.0″, “UTF-8″, “yes”);

txtShow.Text = xDoc.ToString();

Çıktıdanda görüldüğü üzere Linq desteği sayesinde elimizdeki listeyi tek satır kodla XmlFormatına dönüştürebiliyoruz.

Not: xDoc.Declaration= new XDeclaration("1.0", "UTF-8", "yes"); satırı ile eğer bir xml dosyası oluşturarak 
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 standardını vermemiz mümkündür
 

Not2: new XComment(“starting xml”), XComment kodu ilede nodelar arası açıklama satırları koymamıza olanak sağlar

Örnek 2 Bir XML Dosyasını okuyarak Parse Etmek

Örnek olarak projemize aşağıdaki gibi bir xml dosyasını ekleyelim

<?xml version=1.0 encoding=utf-8 ?>

<MyDb>

<PersonList>

<Person ID=1 Name=Bilgehan Age=27 >

<Mail>bilge@yildiz.com</Mail>

<Mail>bilgehan13@yildiz.com</Mail>

</Person>

<Person ID=1 Name=Tolga Age=30>

<Mail>tolga@abc.com</Mail>

</Person>

<Person ID=1 Name=Murat Age=30 />

<Person ID=1 Name=Yasin Age=25 />

</PersonList>

<CarList>

<Car ID=1 Brand=Volvo >C30</Car>

<Car ID=2 Brand=BMW >X5</Car>

<Car ID=1 Brand=Hyundai >i30</Car>

</CarList>

</MyDb>

Şimdi bize sistemde bulunan kişilere ait mail listesini verecek bir örnek yapalım

Bunun için ekranımıza ikinci bir buton koyarak xmlden okudugumuz mail adreslerini textboxa yazacak bir kod yazalım

protected void btnReadXmlFile_Click(object sender, EventArgs e)

{

string filename = Server.MapPath(@”/XMLSample.xml”);

XDocument xml = XDocument.Load(filename);

var q = from b in xml.Descendants(“Person”).Descendants(“Mail”)

select b.Value;

foreach (string item in q.ToList())

{

txtShow.Text += item+“;”;

};

}

Burada birinci olarak yaptıgımız şey XDocument.Load komutu ile ilgili xml memory yüklemek daha sonra ise Descendants yardımı ile XName matching olan elemanları yakalıyoruz. xml.Descendants(“Person”).Descendants(“Mail”) bu şekilde ise ilk olarak Person elementlerini yakalıyor.Daha sonra ise person içindeki mail elementlerini yakalıyor.Örnek xmlimizde <Mail>bilge@yildiz.com</Mail> şeklinde oldugu için ilgili elemente gittiğimizde .Value diyerek ilgili değerlere ulaşabiliyoruz

<Car ID=”1″ Brand=”Hyundai” >i30</Car>

<Car ID=”2″ Brand=”BMW” >X5</Car>

Peki bu örneğimizdeki gibi Brand içindeki değere ulaşmak isteseydik o zaman ise sorgumuzu aşağıdaki şekilde yazmak yeterli olacaktı.Burada Brand Car elementinin bir Attribute oldugu için Descendants ile Car elementlerşne ulaşıp daha sonra .Attribute( içine   Attribute adını yazarak) değerine ulaşmamız mümkündür

var q = from b in xml.Descendants(“Car”)

select  b.Attribute(“Brand”).Value;

Örnek 3 XDocument.Parse komutu

Gelen bir string eğer xml formatında ise XDocument.Parse metodunu kullanarak bunu xml haline getirerek nodelar arasında işlem yapmamıza olanak sağlar

Aşağıdaki kod örneği sonuç olarak xml şeklindeki bir stringde yazan Bilgehan değerini okumamızı sağlar

string stringxml =

@”<?xml version=””1.0″”?>

<Personlist>

<Person>Bilgehan</Person>

</Personlist>”;

XDocument xml = XDocument.Parse(stringxml);

var q = from b in xml.Descendants(“Person”)

select b.Value;

foreach (string item in q.ToList())

{

txtShow.Text += item + “;”;

};

}

.NET kategorisine gönderildi | Yorum bırakın

SSRS RAPORLARI WINDOWS FORMS UYGULAMALARINDA ADO.NET DATASET İLE KULLANIMI ve SSRS RAPORLARDA KAYITLARA SIRA NUMARASI KOYMA(ROWNUMBER)

1-)Aşağıdaki gibi Sql Serverda bir tablo oluşturarak içine kayıtlarımızı girelim

2-)Projemize bir tane dataset ekleyerek içine tüm kayıtları alacak

Bir tane Tüm Kayıtları getirecek(FillMetodu) ve Yasa göre filtreleme yapacak (FillByAge) ikitane metod ekliyoruz

3-)Daha sonra projemizin içine bir tane report ekliyoruz. Bu raporumuzun datasource olarak eklediğimiz datasetin Kisi Table alacak şekilde birbirine bağlıyoruz.Ayrıca ReportingService gridimizdeki kayıtlara sıra no vermek istersek report designerda table bir sutun ekleyerek expressionana RowNumber(nothing) komutunu veriyoruz

4-)Windows Formumuza toolboxtan reportviewerı ekliyoruz daha sonra  aşağıdaki gibi bu raporu reportviewera bağlıyoruz

5-)Formumuzun loadına ise aşağıdaki kodları yazıyoruz.

Bu şekilde FillByAge metodu aktif olursa raporumuza sadece yası 26 olan kayıtlarımız gelecektir.RowNumber(Nothing) komutu ile raporumuza gelen kayıtlara kendi idlerinden farklı olarak sıra numarası vermiş oluyoruz

//this.KisiTableAdapter.Fill(this.TelefonRehberiDataSet.Kisi);         this.KisiTableAdapter.FillByAge(this.TelefonRehberiDataSet.Kisi);

this.reportViewer1.RefreshReport();

–>RowNumber ile rapordaki tabloya gelen kayıtlara sıra numarası koymus olduk.

Bu şekilde Fill Metodu aktif olursa tablodaki tüm kayıtlar ekrana gelecektir

this.KisiTableAdapter.Fill(this.TelefonRehberiDataSet.Kisi);

// this.KisiTableAdapter.FillByAge(this.TelefonRehberiDataSet.Kisi);

this.reportViewer1.RefreshReport();

SQL SERVER kategorisine gönderildi | Yorum bırakın

WORKFLOW FOUNDATION VE CODE ACTIVITY

CodeActivity abstract bir class olup, Custom Activityler oluşturabilmek için kullanırız

Projeye Workflow — >AddNew Item– >Worklow — >CodeActivity seçerek bize şablon bir class üretir veya projemize bir class ekledikten sonra  FirstCustomWorkflow : CodeActivity oluşturduğumuz sınıfımızı CodeActivity sınıfından türeterek de bu işlemi yapabiliriz.

Bu şekilde seçilince classımız otomatik olarak aşağıdaki şablondaki gibi yaratılır

public sealed class FirstCustomWorkflow : CodeActivity

{

// Define an activity input argument of type string

public InArgument<string> Text { get; set; }

// If your activity returns a value, derive from CodeActivity<TResult>

// and return the value from the Execute method.

protected override void Execute(CodeActivityContext context)

{

// Obtain the runtime value of the Text input argument

string text = context.GetValue(this.Text);

}

}

Senaryomuz şöyle olsun İki Sayıyı toplayarak hem sonucu bir Output parametresine ,hemde ayrıca execute edilirken dönecek sonucuda ayrı bir output parametresine yazacak bir Code Activity yazalım.Bunun için aşağıdaki 4 tane argumanı projemize ekliyoruz

Eğer Custom Activity execute metodundan bir değer dönecekse classtan türetme yaparken geri dönüş tipimizi belirtmemiz gerekiyor FirstCustomWorkflow : CodeActivity<string> gibi Gelen Input Parametrelerinin değerini okuyabilmek için context.GetValue,benzer şekilde Parametrelere değer atayabilmek için context.SetValue kodlarını kullanıyoruz.

public sealed class FirstCustomWorkflow : CodeActivity<string>

{

// Input Argumentlar tanımlamak için

public InArgument<int> Number1 { get; set; }

public InArgument<int> Number2 { get; set; }

// If your activity returns a value, derive from CodeActivity<TResult>

// and return the value from the Execute method.

protected override string Execute(CodeActivityContext context)

{

// Obtain the runtime value of the Text input argument

int Sayi1 = context.GetValue(this.Number1);//context.GetValue<int>(this.Number1);

int Sayi2=context.GetValue<int>(this.Number2);

int total = Sayi1 + Sayi2;

context.SetValue(MyResult,”Sonuc:” + total.ToString());

return “Execute Sonucu dönecek Mesaj Değerimiz”;

}

//Output Argumentlar tanımlamak için

public OutArgument<string> MyResult { get; set; }

Bu şekilde classımızı build ettikten sonra artık hazırladığımız Custom Flow Toolboxtan kullanmamıza hazır hale geliyor

Daha sonra Activity Designerımızın içinde Sequence kontrolü atıyoruz ve içine bu Custom flowumuzu sürükle bırak yapıyoruz.Bu flow çalıştığında ekrana custom workflowdan çıkış argümanını ve execute edildiği andaki return değerini ekrana yazdırıyor olacağız.

Custom workflowumuzu tıklayarak bu flowdaki argumanlarımızı activityimizin genelindeki parametrelerle eşleştirmemiz gerekmektedir.

class Program

{

static void Main(string[] args)

{

int Number1 = 5;

int Number2 = 10;

Dictionary<string, object> argumentlist = new Dictionary<string, object>();

argumentlist.Add(“Number1″, Number1);

argumentlist.Add(“Number2″, Number2);

WorkflowInvoker.Invoke(new Calculator(), argumentlist);

Console.ReadLine();

}

}

Yukarıdaki Program csdede çalışacak oluşan activity ve input argumentların değerlerini belirterek örneğimizi tamamlıyoruz.Ekrandada görüldüğümü gibi Sonuc:15 Output Argumentin değeri Execute sonucu dönecek Mesaj Değerimiz yazan satır ise Custom workflowun return value dur.

.NET kategorisine gönderildi | Yorum bırakın