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 AD üzerindeki distribution List'e mail göndermiyor

Merhaba,

Sharepoint üzerinde bir listeye Alert tanımlamama rağmen. Alert içinde tanımladığım Distribution List içindeki kullanıcılara mail gitmiyordu. 
Durumu çözebilmek için bir sürü şey denedim. Ancak sonuca şu şekilde ulaşabildim:

  1. Exchange ManageMent Console açılır
  2. Microsoft Exchange -> Microsoft Exchange on-Premises -> Recipient Configuration -> Distribution adımına ilerle
  3. Mail gönderemediğin Distribution Grubunu bul
  4. Properties'e tıkla
  5. "Mail Flow Settings" Tab'ine tıkla
  6. “Message Delivery Restrictions” a tıkla
  7. “Require that all senders are authenticated” üzerindeki check'i kaldır
  8. OK tıkla
  9. OK tıkla

Sharepoint Backup alırken “Cannot open backup device” hatasının nedeni ve çözümü

Sharepoint backup’ı alırken path’i “C:\backup” şeklinde verirsek “Cannot open backup device”  hatasını alırız. 
Backup alırken path’i “\\intranet\c$\backup” gibi bir network pathi olarak vermeliyiz.

Ayrıca backup dosyalarını sakladığımız makine db sunucusundan farklı bir makine ise izin problemi yaşayabiliriz:

Senaryo 1:

  • Bizim senaryomuzda backup aldığımız makine ayrı bir makine
  • Backup alırken sharepoint tarafında kullandığımız kullanıcı SharePoint sistem yöneticisi
  • Backup folder’ı yaratılıyor, diğer dosyalar da yaratılıyor. Ancak sql backup’ı alırken SQL exception(Cannot open backup device) alıyoruz.

Senaryo 1 Sebebi :

  • SQL server servislerinin kullanıcı “local system” olarak ayarlanmış
  • belirlenen folder’a sharepoint sistem kullanıcısının erişim izni var. Ancak Database sunucusunun izni olmadığı için backup alırken erişim izni hatası veriyor.

Senaryo 1 Çözümü :

  • Belirlediğimiz backup folder’ını gizli bir folder yapıp “everyone” grubuna hak verebiliriz. (Bu basit ama güvenlik zaafiyeti olan bir çözüm)
  • Doğru yöntem ise backup folder’ı için database sunucusuna direkt olarak izin vermek.

Not: Eğer backup alırken yukardaki gibi hatalar oluşmuşsa User Profile Sync servislerini de durdurmuş olabilir. Bu durumda iisreset yapmanız servisleri tekrar ayağa kaldıracaktır.

Powershell komutu ile bir klasörü sıkıştırıp yedeğini almak

##Oncelikle Backup'ini alacagimiz uygulamanin pathini yaziyoruz
$kaynakPath="\\cronus\e$\IIS_APP\ironiccolakoglu"
##Dosya Adini olusturuyoruz
$tarih=Get-Date
$dosyaAdi= $tarih.Year.ToString()+$tarih.Month.ToString()+$tarih.Day.ToString()+"_"+$tarih.Hour.ToString()+$tarih.Minute.ToString()+".zip"
##Yedeklerin gonderilecegi Pathi veriyoruz
$hedefPath="D:\recep\"
##New-Item -ItemType directory -Path $hedefPath

##Pscx modulu ile Backup alinacak klasoru zipliyoruz
Import-Module Pscx
Write-Zip -level 9 -IncludeEmptyDirectories -Path $kaynakPath -OutputPath $kaynakPath$dosyaAdi
##Zip dosyasini HedefPath'e tasiyoruz
Move-Item $kaynakPath$dosyaAdi $hedefPath

Not:Zipleme özelliğini kullanmak için Pscx modülünü yüklemelisiniz. http://pscx.codeplex.com/releases/view/98267

Tabloya sadece belirlediğimiz procedure üzerinden insert yapılmasını sağlamak

SQL server üzerindeki bir tabloya sadece belli bir procedure ile insert yapılmasını, direkt tablo üzerinde insert yapılamamsını sağlamak istiyoruz.

Bunu sağlamak için procedure içinde insert komutundan önce bir iz bırakıyoruz(CONTEXT_INFO). Insert trigger'ı içinde de bu izi arıyoruz. Eğer CONTEXT_INFO içindeki bilgi istediğimiz procedure e ait ise işlemi yapıyoruz. Değilse hata verdirtiyoruz.

Örnek Pocedure:

---************************************
    ---INSERT yaparken Prosedurun ismini CONTEXT_INFO ya ekliyoruz. Triggerda Prosedur ismi kontrol edilecek!
        DECLARE @string VARCHAR(128) ,
            @CONTEXT_INFO VARBINARY(128)
        SET @string = ISNULL(OBJECT_NAME(@@PROCID), 'none')
        SET @CONTEXT_INFO = CAST('Procedure=' + @string + REPLICATE(' ', 128) AS VARBINARY(128))
        SET CONTEXT_INFO @CONTEXT_INFO
    ---***********************************
 
Trigger Örneği:
CREATE TRIGGER dbo.TRIGGER_ADI
   ON  dbo.TABLO_ADI
   INSTEAD OF INSERT
AS 
BEGIN

 DECLARE @string         varchar(128)
       ,@sCONTEXT_INFO  varchar(128)=''
		SELECT @sCONTEXT_INFO=CAST(CONTEXT_INFO() AS VARCHAR) FROM master.dbo.SYSPROCESSES WHERE SPID=@@SPID
        IF @sCONTEXT_INFO IS NULL OR LEFT(@sCONTEXT_INFO,23)<>'Procedure=PROCEDURE_ADI'
			BEGIN
                DECLARE @errorMsg1 VARCHAR(500);

                SET @errorMsg1 = 'TABLO_ADI TABLOSUNA SEDECE PROCEDURE_ADI PROSEDÜRÜ İLE KAYIT EKLENEBİLİR!' ;
               RAISERROR(@errorMsg1,16,1)
			END
				ELSE
			BEGIN
			 INSERT INTO TABLO_ADI
			         SELECT AlanAdi1,AlanAdi2,....
			        FROM INSERTED
			END

END
 

 

SharePoint2010 blog sitelerinde quickLaunch görünmüyor

SahrePoint 2010 üzerinde bir blog sitesi açtığınızda default olarak quickLaunch yerine sol menüde Kategoriler ve aylık arşiv listesi çıkar. 

QuickLaunch'u açmak için blog ana sayfasındayken

  1. SharePoint Designer'ı açın.
  2. Edit Site Home Page e tıklayarak default.aspx sayfasının kodunu açın
  3. Aşağıdaki satırı bulun ve tag'ın kapanışına kadar silin.(Toolbar üzerinde Advanced Mode butonu var ona tıklamazsanız satırı sildirmez')
    <asp:Content ContentPlaceHolderId="PlaceHolderLeftNavBar" runat="server">
  4. Şimdi blogunuza döndüğünüzde QuickLaunch menüsünün diğer sitelrdeki gibi göründüğünü göreceksiniz.

Bugün Doğanlar listesi yapmanız için aşırı pratik çözüm

Bugün hiç kod yazasım yoktu. Boyuna sörf yaptım, ne var ne yok vs. Bir yandan da yapmam gereken bir bugünDoğanlar webpart'ı vardı. Zaman geçiyor ama ben hala saçma sapan şeylerle uğraşıyorum. 

Öncelikle aklıma bir liste yapıp içine bir şekilde bütün kullanıcıları alıp, sadece d.tarihi bugün olanları göstermek geldi. Bu konuda herhangi bir çözüm üretemedim

Okuduğum makaleler hep webPart yapmaya yönlendiriyordu. Son bi umut google'a "how to get all users in sharepoint 2010" keywordunu yazdım ve şu sihirli linki buldum:

http://mysite/_layouts/people.aspx?MembershipGroupId=0&FilterField1=ContentType&FilterValue1=Person

Sonra Ana sayfama sharepoint'in default webPartlarından Page Viewer Web Partını ekledim. Yukardaki linki webPart ayarlarındaki Bağlantı kutucuğuna yazdım.

ve tüm kullanıcı listesini MasterPage'li de olsa almayı başardım.

Url'nin sonuna masterPage görünmesin diye

&IsDlg=1 ekledim.

Son olarak URL Böyle oldu : http://mysite/_layouts/people.aspx?MembershipGroupId=0&FilterField1=ContentType&FilterValue1=Person&IsDlg=1

ve sonunda web Part'ımın içinde Tüm kullanıcıların listesi göründü.

Liste üzerinde ayarlar/Liste Ayarları/Görünüm Oluştur ile yeni bir view oluşturdum.

view'ın filter kısmını aşağıdaki gibi doldurdum (Örnekte Oluşturma Tarihi alanını kullandım, siz varsa alanı Doğum Tarihi olarak değiştirebilirsiniz)

Default view olarak set ettim ve istediğim bugün doğanlar görünümlü webPartı  elde ettim.

 

Yazılarımın şekilsel bozukluklarını bir ara düzelteceğim inşallah :) Aceleyle unutmadan yazayım derken darmadağınık birşey çıkıyor. Umarım işinizi görür. Sorunuz varsa çekinmeyin lütfen...

Liste içinde seçilen kişinin profil bilgilerini göstermek

İşe yeni başlayan personellerin görüntüleneceği bir liste yapmam lazım. Listeye kişiler manuel olarak eklenecek, kullanıcı sadece kişi adını lookup yapıp diğer alanların da listede görüntülenmesini istiyor.

Bu işi kod yazmadan yapmam gerekiyor.

Öncelikle Özel Liste tipinde bir liste yarattım(YeniBaslayanlar).

kolon AdıKolon TipiGösterilecek Alan
Title Tek satır metin  --
Personel Adı Kişi veya Grup Ad (resim ve ayrıntılarıyla)
Bölümü Kişi veya Grup Bölüm

 

 

Personel adı doldurulduğunda Bölümü alanının da otomatik olarak güncellenmesini istiyorum. Bunun için birkaç farklı method var. Ben workflow ile yapmayı tercih ettim.

Sharepoint Designer'ı açtım

List & libraries altında yarattığım listeyi buldum

 

 

listeye tıkladım. Liste özelliklerinden Workflows/New butonuna tıkladım

 

Worklfowuma isim verdim

 

Conditions tabından Kişi geçerli bir SharePoint kullanıcısıysa değerini seçiyoruz.

 

 

Ardından Kişi linkine tıklıyoruz ve girilen kişinin geçerli bir SP kullanıcısı olup olmadığını kontrol ettiriyoruz

 

Personel Adı alanının loginname(oturum açma adı) özelliğine baktırıyoruz

 

Action Tabından Liste öğesini güncelleştir diyoruz

 

Sırasıyla aşağıdaki işlemleri yapıyoruz:

 

OK buttonlarını bitirdikten sonra Save Buttonuna ardından da Publish buttonuna tıklıyoruz.

Workflowun otomatik olarak çalışmasını istiyorsak;

Sharepoint Designer üzerinde Workflowumuzu buluyoruz

 

 

ve start options altındaki ayarları yapıyoruz

 

 

Önemli Not: Listeyi denerken Root kullanıcı ile deneme yapmayınız!

Windows SharePoint Services 3.0 Service Pack 1 yüklü sistemlerde root kullanıcısı ile giriş yaptıysanız workflowlar otomatik olarak çalışmıyor.

bu sorunu düzeltmek isterseniz : http://kbalertz.com/947284/declarative-workflow-start-automatically-after-install-Windows-SharePoint-Services-Service.aspx

Sharepoint 2010 üzerinde bir sayfayı popover (pop-up dialog) şeklinde gösterme

SharePoint üzerinde farklı listelerden veri alan bir webpart hazırladım. Listedelerdeki tün kolonları alabiliyordum, hatta liste başlığına tıklayınca listedeki kaydın bulunduğu sayfaya bile gidebiliyordum.

Ancak liste içeriğini ayrı bir sayfada değil de popOver olarak göstermem gerekiyordu. Normal liste wbpartındaki linklerin onclick scriptlerini vs. kopyalayıp denedim ama bir türlü popover olarak görünmedi listem. 

Sonunda bir javascript metodu buldum (OpenPopUpPage) ve bunu direk linkimin href property sine verdim, oldu!!

Örnek url:

<a href="javascript:OpenPopUpPage(URL)" />deneme</a>

Ben html sözcüğünü kod içinde yarattığım için aşağıdaki gibi bir kod yazdım:

sb.Append(@"<a href=javascript:OpenPopUpPage('" + item["URL"].ToString() + "'); >");
sb.Append(@"<img src='" + resimURL + "' title='" + HtmlRemoval.StripTagsRegex(item["Title"].ToString()) + "' />");
sb.Append(@"</a>");

SharePoint 2010 ribbon üzerinde kullanıcı resmini gösterme (like facebook)

 

Yukarıdaki gibi kullanıcı resmini riibon üzerinde göstermek için aşağıdaki işlemleri yapmanız yeterli.

  • MasterPage içine aşağıdaki kodu register edin
<%@ Register Tagprefix="ucPortal" Namespace="Microsoft.SharePoint.Portal.WebControls" Assembly="Microsoft.SharePoint.Portal, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
  • <wssuc:Welcome id="IdWelcome" runat="server" EnableViewState="false"></wssuc:Welcome>
    yazan satırı bulun.
  • <wssuc:Welcome Tag'inin hemen öncesine aşağıdaki kodu yapıştırın
<ucPortal:ProfilePropertyLoader runat="server" />
<ucPortal:ProfilePropertyImage PropertyName="PictureUrl" ResizeToFit="1" style="height:29px" ShowPlaceholder="true" id="PictureUrlImage" runat="server"/>
  •  Checkin ve publish ettikten sonra yukarıdaki resim gibi bir ribbonunuz olacak!