Oracle.DataAccess kullanarak yaptığım sorgularda ora:1722 ("invalid number") hatası alıyorum (OracleGlobalization)

 

Problem:

Oracle üzerinde yazılmış bir prosedürü Asp.Net üzerinden çalıştırmak istiyorum.

Bunun için aşağıdaki gibi bir kod kullanıyordum.

using Oracle.DataAccess.Client;
.....

    using (var conn = new OracleConnection()) {
                    string query = "PROSEDURUM";
                    conn.ConnectionString = connString;
                    var comm = new OracleCommand(query, conn);
                    comm.CommandType = CommandType.StoredProcedure;
                    comm.Parameters.Add("p_1", OracleDbType.Varchar2).Value = p_1degeri;
                    comm.Parameters.Add("p_2", OracleDbType.Int32).Value = p_2degeri;
        comm.Parameters.Add("cur", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
                    conn.Open();
                    var adapter = new OracleDataAdapter(comm);
                    adapter.Fill(dtTable);

Ancak kodu çalıştırdığımda sürekli ORA:1722 hatası alıyorum. p_2degeri için girdiğim değer 1 olsa bile aynı hatayı almaya devam ediyorum.

Olası nedenler:

1. Oracle Command’ın default ayarlarında BindByName = false olarak ayarlıdır. Bu ayarı elle değiştirmezseniz parametreleri ismine göre değil de sizin verdiğiniz sıraya göre alır. Yani Prosedürdeki parametre sırasıyla sizin command’e eklediğiniz parametrelerin sırası aynı değilse parametreleri yanlış eşleştirir.

Çözüm: Bunu önlemek için command’ınızın BindByName propertysini true olarak set etmeniz gerekiyor.

comm.BindByName = true;

2. Session Globalization ile Db Globalization birbirinden farklı olabilir. Bu durumda sayı ondalıklı olmasa bile oracle hatalı sayı uyarısı verir. Böyle bir durumun olup ılmadığını kontrol etmek için aşağıdaki sql sözcüğünü çalıştırmak gerekiyor.

SELECT
  a1.parameter as "Parameter",
  a1.value as "Database value",
  a2.value as "Instance value",
  a3.value as "Session value"
FROM
  nls_database_parameters a1
  LEFT JOIN nls_instance_parameters a2 ON a1.parameter = a2.parameter
  LEFT JOIN nls_session_parameters a3 ON a1.parameter = a3.parameter
ORDER BY
  a1.parameter asc;

Sorgu sonucunda db ve session formatlarını görebilirsiniz.

Çözüm: Bu durumu çözmek için connectionunuzu açtıktan sonra şağıdaki kodu çalıştırmanız gerekiyor. (Benin durumumda serverdaki numaricCharacters “.,” benim sessionumdaki ise “,.” görünüyordu)

OracleGlobalization SessionGlob = conn.GetSessionInfo();
SessionGlob.NumericCharacters = ".,";
conn.SetSessionInfo(SessionGlob);

Ben örnekteki kodu sadece sayı için yazdım Tarih hatası alıyorsanız onu da aşağıdaki gibi bir kodla düzeltebilirsiniz

 SessionGlob.DateFormat = "YYYY/MM/DD";
Not: Kurulum yaparken bu nls ayarlarını yapmadığımız için bu şekilde uğraşıyoruz. Baştan sunucuya göre konfigürasyonu yaparsak böyle bir problemle karşılaşmayız.

SharePoint 2010 ile Farklı SiteCollection üzerindeki listeyi görüntülemek

Bildiğiniz gibi SharePoint üzerinde faklı "Site Collection" lar kullandığımız zaman yarattığımız içeriği diğer bir "Site Collection" altında göremiyoruz (kod yazmadan).

Bu işlemi yapmak için yeni bir webPart yazmamız gerekiyor. Bu webPart içinde ListViewByQuery isimli bir control kullanarak adresini, view'ini ve ismini verdiğimiz bir liste öğelerini listeleyebiliriz.

 

Daha kolay anlayabilmeniz için önce basit bir versiyonunu yazacağız:
 
        protected ListViewByQuery viewByQuery = null ;
        protected EncodedLiteral encodedLiteral = null;
        protected override void CreateChildControls()
        {
            SPSite site = null ;
            SPWeb web = null ;
            this .siteUrl = "Http://intranet" ;
            this .sourceList = "Grup Duyuruları" ;
            site = new SPSite ( this.SiteUrl);
            web = site.OpenWeb();
            SPList sourceList = web.Lists[this .SourceList];
            viewByQuery = new ListViewByQuery ();
            SPQuery query = null ;
            viewByQuery.List = sourceList;
            query = new SPQuery (viewByQuery.List.DefaultView);
            viewByQuery.Query = query;
            this .Controls.Add(viewByQuery);
        }

Yukarıdaki örnekte aşağıdaki öğelerin değerlerini el ile verdik:

siteURL : Listemizin bulunduğu SiteCollection'un adresi
sourceList :Liste adı
query  : Liste filtresi (örnekte DefaultView kullandık) 

 

Eğer Parametreleri webPart üzerinden değiştirebilmek ve Webpartı özelleştirilebilir yapmak istiyorsak Kod bütünü aşağıdaki gibi olmalıdır:

#region using statements

using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Runtime.InteropServices;
using System.Xml.Serialization;
using System.Text;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;
#endregion

namespace gosterici2.VisualWebPart1
{
    [ToolboxItemAttribute(false)]
    public class VisualWebPart1 : System.Web.UI.WebControls.WebParts.WebPart
    {
        // Visual Studio might automatically update this path when you change the Visual Web Part project item.
        private const string _ascxPath = @"~/_CONTROLTEMPLATES/gosterici2/gosterici2/gostericiII.ascx";

        #region protected child control variable definitions
        protected ListViewByQuery viewByQuery = null;
        protected EncodedLiteral encodedLiteral = null;
        #endregion

        #region webpart properties
        /// <summary>
        /// 
        /// </summary>
        private string viewNameField = string.Empty;
        [Personalizable(), WebPartStorage(Storage.Shared), WebBrowsable(),
         WebDisplayName("View Name"), WebDescription("View Name")]
        public string ViewName
        {
            get
            {
                return this.viewNameField;
            }
            set
            {
                this.viewNameField = value;
            }
        }
        
        /**********************************************************/
        /*Bir webparta property tanımlamak için gerekli kod*******/
        private string recepField = string.Empty;
        [Personalizable(), WebPartStorage(Storage.Shared), WebBrowsable(),
         WebDisplayName("İsminiz"), WebDescription("Adınızı yazınız")]
        public string RecepField
        {
            get
            {
                return this.recepField;
            }
            set
            {
                this.recepField = value;
            }
        }
        /**********************************************************/


        private string siteUrlField = string.Empty;
        [Personalizable(), WebPartStorage(Storage.Shared), WebBrowsable(),
         WebDisplayName("Site Url"), WebDescription("Site Url")]
        public string SiteUrl
        {
            get
            {
                return this.siteUrlField;
            }
            set
            {
                this.siteUrlField = value;
            }
        }
        /// <summary>
        /// 
        /// </summary>
        private string sourceListField = string.Empty;
        [Personalizable(), WebPartStorage(Storage.Shared), WebBrowsable(),
         WebDisplayName("Source List"), WebDescription("Source list to query")]
        public string SourceList
        {
            get
            {
                return this.sourceListField;
            }
            set
            {
                this.sourceListField = value;
            }
        }
        private Boolean disableFilterField = false;
        [Personalizable(), WebPartStorage(Storage.Shared), WebBrowsable(),
         WebDisplayName("Disable Filter"), WebDescription("Disable List Filtering")]
        public Boolean DisableFilter
        {
            get
            {
                return disableFilterField;
            }
            set
            {
                disableFilterField = value;
            }
        }
        private Boolean disableSortField = false;
        [Personalizable(), WebPartStorage(Storage.Shared), WebBrowsable(),
         WebDisplayName("Disable Sort"), WebDescription("Disable list sorting")]
        public Boolean DisableSort
        {
            get
            {
                return disableSortField;
            }
            set
            {
                this.disableSortField = value;
            }
        }
        #endregion

        #region overrides
        protected override void CreateChildControls()
        {
            base.CreateChildControls();
            SPSite site = null;
            SPWeb web = null;
            Boolean disposeSPSite = false;
            try
            {
                if (this.SourceList != string.Empty)
                {
                    viewByQuery = new ListViewByQuery();
                    if (this.SiteUrl != null && this.SiteUrl != string.Empty)
                    {
                        site = new SPSite(this.SiteUrl);
                        disposeSPSite = true;
                    }
                    else
                    {
                        site = SPContext.Current.Site;
                    }
                    web = site.OpenWeb();
                    SPList sourceList = web.Lists[this.SourceList];
                    viewByQuery.List = sourceList;
                    SPQuery query = null;
                    if (CheckIfViewExists(viewByQuery.List))
                    {
                        //use the view specified in webpart property
                        query = new SPQuery(viewByQuery.List.Views[this.ViewName]);
                    }
                    else
                    {
                        //use default view to initialized
                        query = new SPQuery(viewByQuery.List.DefaultView);
                    }
                    viewByQuery.Query = query;
                    viewByQuery.DisableFilter = this.DisableFilter;
                    viewByQuery.DisableSort = this.DisableSort;
                    
                    this.Controls.Add(viewByQuery);
                }
                else
                {
                    encodedLiteral = new EncodedLiteral();
                    encodedLiteral.Text = "This webpart is not configured.";
                    this.Controls.Add(encodedLiteral);
                }
            }
            finally
            {
                if (disposeSPSite)
                {
                    ((IDisposable)site).Dispose();
                    ((IDisposable)web).Dispose();
                }
            }
        }
        protected override void RenderContents(HtmlTextWriter writer)
        {
            EnsureChildControls();
            RenderChildren(writer);
        }
        #endregion

        #region helper methods
        private Boolean CheckIfViewExists(SPList list)
        {
            Boolean ret = false;
            foreach (SPView view in list.Views)
            {
                if (view.Title.ToLower() == this.ViewName.ToLower())
                {
                    ret = true;
                }
            }
            return ret;
        }
        #endregion
    }
}
 
Kaynak:http://blogs.msdn.com/b/ramg/archive/2009/04/22/implementing-a-simple-cross-site-collection-list-view-webpart.aspx

JQuery ile tablodan satır silmek

JQuery ile html tablodan satır silmenin en basit metodu:

  Aşağıdaki gibi bir tablonuz olduğunu varsayalım.

Ad Soyad  
Recep Güzel Remove
Ali Veli Remove


Tabloyu cshtml üzerinde yaratırken Modelden gelen bir listeyi kullanalım:
 
<table id="MusteriListe" border="1">
    <thead>
        <tr>
            <th>
                Ad
            </th>
            <th>
                SoyAd
            </th>
           
            <th>
            </th>
        </tr>
    </thead>
    <tbody>
            <tr>
                <td>
                    @item.Ad
                </td>
                <td>
                    @item.Soyad
                </td>
                <td>
                    <img id="imgDelete" alt="Remove" src="/Content/images/remove.png" onclick="deleteRecord(this);" />
                </td>
            </tr>
        
    </tbody>
</table>
 
imajımızın onClick eventine  deleteRecord(this) diyerek deleteRecord fonksiyonuna img nesnesini gönderiyoruz.
 
deleteRecord Fonksiyonunu da aşağıdaki gibi yaratıyoruz:
 
function deleteRecord(x) 
{
   $(x).parent().parent().remove();   
  //delete nesnesinin(<img>) parenti TD, onun da parent i TR dir. soldaki kod ilgili satırı(TR) siler.
}
 
ve satırımızı başarıyla silmiş bulunuyoruz :) 
 

Getdate() with LINQ or Entity / LINQ veya Entity ile Getdate() nasil cekilir?

EN:
Sometimes we need to use getdate() function instead of DateTime.Now. Because with getdate() we can get current date with correct format.

To be able to use Getdate() function from LINQ query you should create a view in SQL server.

Just Copy the query in the View and save as "GetDBdate".

SELECT     GETDATE() AS DBDate

Now you should update your Entity or DBML (add the view).
and write a LINQ query like below:

Convert.ToDateTime(db.GetDbDate.First().DBDate) 

TR:
Eğer LINQ/Entity sorgularında getdate() fonksiyonunu kullanmamız gerekiyorsa db de yeni bir view yaratmanız yeterli olacaktır :
Yeni bir view yaratın, Aşağıdakı query'i kopyalayın ve "GetDBDate"
 ismiyle kaydedin

 SELECT     GETDATE() AS DBDate

Şimdi Entity veya DBML inizi güncelleyin, yeni view i  de ekleyin

ve aşağıdaki gibi bir LINQ sorgusu yazın:

Convert.ToDateTime(db.GetDbDate.First().DBDate) 
 
 

Meta tag kullanarak IE8 den IE7 uyumlu modda calismasini istemek / work with with meta tags

Merhaba,

Web yazılımı geliştirirken karşımıza çıkan en büyük problemlerden biri de uygulamamızın diğer tarayıcılarda düzgün görünmemesidir. Şimdiye kadar çıkmış bütün browserlarla uyumlu bir yapı kurduğunuz düşünüyorsunuz ve birden bire öğreniyorsunuz ki Internet Explorer 8 çıkmış ve web sayfanızı bambaşka bir şekilde gösteriyor. Yine saatlerce uğraşıp IE8'de de düzgün çalışsın diye uğraşacaksınız belki de bazı fonksiyonlardan / özelliklerden de vaz geçmek zorunda kalacaksınız. 
Bu durumdan en ucuz şekilde kurtulmanın yolu (geçici bir çözüm yolu olsa da) aşağıdaki gibi bir meta tag yazarak browserın IE7 uyumlu modda çalışmasını sağlamaktır.

Not:Aşağıdaki metaları bütün stil ve css lerin üzerinde bir yere yazmanız gerejiyor. <head> tagından hemen sonra yazmanız yararınıza olacaktır.

IE5 ile uyumlu çalışması için:
<meta http-equiv="X-UA-Compatible" content="IE=5"> 

IE7 Uyumlu kipi çalıştırmak için:

<meta http-equiv="X-UA-Compatible" content="IE=7"> 

IE8 in uyumlu çalıştığından emin olmak için (burada IE7 emule edilmiş oluyor):

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/>  

 

VS2005 AspNet web projelerini debug etmiyor

Merhaba,

Geçenlerde eski projelerden birine bakmam gerekti. VS2005 ile yazılmıştı ve ufak bir düzeltme gerekiyordu. Projeyi açabiliyorum ancak internet explorer ile açılış sayfası açılır açılmaz debug stop oluyordu, dolayısıyla breakpoint vs. hak getire:)

Neyse ufak bir araştırma sonucu düzelttim. Tek yapmam gereken şey IIS içinde projenin virtual directorysini bulup asp debugging özelliğini enable etmek oldu. Gerçi normalde böyle bir işlem yapmaya gerek yok ama olur da aynı problemi yaşarsanız aşağıdaki adımları uygulamanız gerekiyor.

  1. IIS üzerinde virtual directory özelliklerine girin
  2. Virtual Directory tabı altındaki Configuration butonuna tıklayın
  3. Debugging Tabına tıklayın
  4. Enable ASP server-side script debugging ve Enable ASP client-side script debugging checkboxlarını checkleyin
  5. Tamam deyip nolur ne olmaz IIS i restart edin.
  6. bu kadar! Umarım işinize yarar...

VS2008 - Debug / Release menüsünü geri getirme

Merhaba,

Geçenlerde bilgisayarımda genel bir temizlik yaptım, hatta temizlik demek biraz hafif kalır komple format attım. Ne de olsa hformat hastalığı var bende:)
Neyse sıra geldi VS2008'i ilk kez çalıştrımaya; normalde ilk kez açıldığında hangi ayarları kullanmak istersiniz diye bir pencere çıkar karşıma ve ben C# gördüğüm yeri işaretlerdim. Bu sefer değişiklik olsun diye web development setting i seçtim, seçmez olaydım. Projeyi Release modda build etmek için ordan gir buradan çık uğraş dur. Halbuki sevimli bir pencerem vardı bunu yapmak için. 

. İşte bunu bir türlü geri getiremiyordum.

Sonunda Tools içinde "Import and Export Settings..." diye bir seçeneği farkettim. Tıklar tıklamaz Reset All Settings yazısını gördüm ve denedim. O malum ilk ekran tekrar karşıma geldi ve bu sefer C# görünüm ayarlarını seçtim. Ne kadar da alışmışım bu haline :) 

LINQ Sorgusu içinde IF kullanmak ya da IF kullanmaya gerek yok mu?

Merhaba,

LINQ ile çalışırken zaman zaman karmaşık sorgular oluşturmamız gerekebiliyor ve doğrudan halledemeyeceğimiz durumlar oluşabiliyor.
Bugün bu durumlardan biri başıma geldi basit bir örnekle anlatmaya çalışacağım.

Source adında bir tablomuz olduğunu varsayalım. Bu tablo içinde OID,Name,startdate,enddate ve SourceType adında 2 alanımız olsun.
Bir Dropdown koyalım ve içine bütün source Typelarını koyalım. ( 3 tanse SourceType olduğunu varsayalım). bir de name'i yazabileceğimiz textboxumuz olsun(txtSearchString).
Bir gridview içinde Tipi dropdownda seçilmiş Tipe uyan bütün sourceları göstermeye çalışalım.
Bunu yapmak için aşağıdakine benzer bir sorgu hazırlamamız gerekir.

var sourceData = from s in dc.Sources
where s.SourceTypeID == int.Parse(ddlSourceType.SelectedValue)
&& s.Name.Contains(txtSearchString.Text)
orderby s.Name
select new
{
OID = s.OID,
SourceName = s.Name,
StartDate = s.StartDateSubscription,
EndDate = s.EndDateSubscription
};

Peki Dropdown'a 1 kayıt daha ekleyelim ismi "Hepsi" olsun ve değerini "0" yapalım.
Şimdi dropdownda "Hepsi" seçildiğinde Hiç sourceType alanına bakmadan sadece source ismi txtSearchString'e yazılan değerle uyuşan kayıtları getirmeye çalışalım.

Ne yapmamız lazım? evet evet buldum!! Hemen sorgunun başına bir IF koyalım ve sourceData sorgusundan bir tane daha yaratalım ama bu sefer içine sourceType alanına baktırmayalım else durumuna da yazarız yine SourceType alanına bakandan:

var sourceData="";

IF (ddlSourceType.SelectedValue == "0")
{

sourceData = from s in dc.Sources
where s.Name.Contains(txtSearchString.Text)
orderby s.Name
select new
{
OID = s.OID,
SourceName = s.Name,
StartDate = s.StartDateSubscription,
EndDate = s.EndDateSubscription
};
}
else
{
sourceData = from s in dc.Sources
where s.SourceTypeID == int.Parse(ddlSourceType.SelectedValue)
&& s.Name.Contains(txtSearchString.Text)
orderby s.Name
select new
{
OID = s.OID,
SourceName = s.Name,
StartDate = s.StartDateSubscription,
EndDate = s.EndDateSubscription
};

}

Evet evet istediğimiz yaptık. Ne olacak kopyalarız yapıştırırız her seferinde, taş attık da kolumuz mu yoruldu dimi?
HAYIR yorulmadı ama bu kadar uğraşmadan da bunu yapabilirdik.

Amacımız ne? Eğer dropdown'un değeri "0" ise SourceTypeID'ye bakmadan ne varsa getirmek.
şöyle bir sorguyla bunu halledebiliriz:

var
sourceData = from s in dc.Sources
where
(s.SourceTypeID == int.Parse(ddlSourceType.SelectedValue) || ddlSourceType.SelectedValue=="0")
&& s.Name.Contains(txtSearchString.Text)
orderby s.Name
select new
{
OID = s.OID,
SourceName = s.Name,
StartDate = s.StartDateSubscription,
EndDate = s.EndDateSubscription
};

where içinde sourceType ı kontrol ettiğimiz sözcüğün başına sonuna parantez ekleyip parantezin içine ||(or) yazıp yanına da condition'u yazıyoruz.

Yine dolandırıp dolandıp anlattım galiba. Umarım işinizi görür ve umarım yazıyı toparlamak için vakit bulabilirim...

LINQ ile stored procedure den gelen değeri (SCOPE_IDENTITY) almak

  • Merhaba,
    Öncelikle yazıyı özensiz şekilde hazırladığım için kusura bakmayın. Boş vakit bulduğumda (tabi bulabilirsem) düzenlemeye çalışacağım.,

LINQ ile çalışırken bir tabloya insert eden prosedürden gelen SCOPE_IDENTITY() verisini almak umduğumdan biraz daha karmaşıkmış. Aşağıda basit bir şekilde anlatmaya çalışacağım.

1-)Prosedürümüzü ID gönderecek şekilde düzenleyelim

Sadece OID ve Name alanı bulunan source adında bir tablomuz olsun. Bunun insert'i için yazacağımız prosedür aşağıdaki gibi olmalı

ALTER procedure [dbo].[TR_InsertSource]
@OID int OUTPUT,
@Name nvarchar(255)
AS
insert into source
( [Name] )
VALUES
( @Name )

set @ID= cast(SCOPE_IDENTITY() AS INT)

2-)Prosedürümüzü ve ilgili tabloyu DBML'e ekleyelim

bu kısım için detaylı açıklamayı vakit bulursam ekleyeceğim :(

3-)insert işlemi yapılacak tablo için Dbml deki değişikliklerimizi yapalım

  • Aşağıda gördüğünüz gibi DBML dosyası üzerinde insert yapılacak tabloyu tıklıyoruz 
  • Properties menüsünden insert alnına tıklıyoruz (use Runtime üzerine)

  • aşağıdaki gibi bir pencere açılacaktır

  • Burada Customize radiobutton unu seçiyoruz
  • çıkan dropdowndan stored procedure mizi seçiyoruz (benim kullandığım TR_InsertSource)
  • oiD olarak tanımladığımız alanın karşısında identity alan adımızın olduğundan emin olalım (OID)
  • sonra da OK butonuna basalım
  • Properties penceresi aşağıdaki gibi olacaktır:
  • 3-)Kodumuzu güncelleyelim

    • öncelikle yeni OID değerini tutacak bir değişken yaratalım:
    int? sourceID = 0;
    
    • şimdi prosedürü çalıştıracak kodu yazalım:

    MDDBDataContext dc = new MDDBDataContext();

    dc.TR_InsertSource(ref sourceID, txtName.Text)

    prosedürün içine yazdığımız ref sourceID sayesinde yukarda integer olarak tanımladığımız sourceID alanına yeni OID değeri kaydedilecektir.
    
    • şimdi de prosedürü çalıştıralım

    dc.SubmitChanges();

    kodun son hali aşağıdaki gibi olacaktır :

    int? sourceID = 0;
    MDDBDataContext dc = new MDDBDataContext();
    dc.TR_InsertSource(ref sourceID, txtName.Text)
    dc.SubmitChanges();

    artık sourceID'yi istediğiniz gibi kullanabilirsiniz.
    
    Umarım işinize yarar...
    

    Crystal Reports'u sunucuya tanıtmak

    Merhabalar,

    Uzun uğraşlar sonucunda müşterinin istediği tasarıma uygun raporları yaptınız, testleriniz bitti herşey tamam. Artık müşterinin deneyebilmesi için test server'a veya yeni bir projeyse production server'a atma vakti geldi. O da ne! çalışmıyor mu? "Could not load file or assembly 'CrystalDecisions.Web, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304' or one of its dependencies. The system cannot find the file specified." gibi bir hata alıyorsanız yapmanız gereken şey çok basit!

    Eğer VS.NET2008 kullanıyorsanız muhtemelen şu klasörde:"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\CrystalReports10_5" "CRRedist2008_x86.msi" adında bir dosya bulunmalıdır.(endişelenmeyin belirttiğim path içinde yoksa yazıya ekledim). uygulamayı kuracağınız makinede bu dosyayı çalıştırıp crystal report'u register etmeniz yeterli olacaktır.

    Not: Şimdilik sadece vs.net2008 ile gelen versiyon için karşılaştığım problemin çözümünü yazabildim. Fırsat bulabilirsem en kısa zamanda güncelleyeceğim. Umarım sizin de işinize yarar!

    CRRedist2008_x86.rar (15,19 mb)