Bağlantı ve kaynak yönetimi
Her NetOpenX işlemi aynı iskeletle başlar: bir Kernel oluştur, yeniSirket ile şirkete bağlan, işi yap, her durumda oturumu kapat ve COM nesnelerini bırak.
yeniSirket
using NetOpenX50;
using System.Runtime.InteropServices;
Kernel kernel = new Kernel();
Sirket sirket = kernel.yeniSirket(
TVTTipi.vtMSSQL, // 1. veritabanı tipi (Oracle için vtOracle)
"ACME2024", // 2. şirket = veritabanı adı
"TEMELSET", // 3. veritabanı kullanıcısı
"", // 4. veritabanı şifresi
"NETSIS", // 5. Netsis kullanıcı adı
"netsis_sifresi", // 6. Netsis şifresi
0); // 7. şube kodu
| # | Parametre | Not |
|---|---|---|
| 1 | TVTTipi |
vtMSSQL ya da vtOracle |
| 2 | Şirket adı | Netsis'teki şirket kodu; SQL Server'da veritabanı adıdır. Liste: NETSIS.dbo.SIRKETLER30 |
| 3 | DB kullanıcısı | Çoğu kurulumda TEMELSET |
| 4 | DB şifresi | TEMELSET kullanıcısının şifresi (çoğu kurulumda boş) |
| 5 | Netsis kullanıcısı | Programa giriş yapan kullanıcı; yetkileri uygulanır. Kayıtlarda KAYITYAPANKUL olarak görünür |
| 6 | Netsis şifresi | |
| 7 | Şube kodu | TBLSUBELER'deki şube. Tek şubeli kurulumlarda 0. Logo'nun bazı eski örneklerinde 32767 geçer (anlamı belgelenmemiş) |
Kernel bilgileri
Kernel, şirkete bağlanmadan da bazı bilgileri verir:
Kernel kernel = new Kernel();
try
{
string surum = kernel.Version; // NetOpenX sürümü
SirketList liste = kernel.SirketListesi; // sunucudaki şirketler
for (int i = 0; i < liste.SirketSayisi; i++)
{
SirketInfo s = liste.get_SirketInfo(i);
Console.WriteLine($"{s.SirketAdi} {s.SirketYili}");
}
Marshal.ReleaseComObject(liste);
bool ekModulVar = kernel.get_EkModulVar(100); // ek modül yüklü mü (0–254)
}
finally
{
kernel.FreeNetsisLibrary();
Marshal.ReleaseComObject(kernel);
}
Netsis'in içinden çalışan kodda (Temelset dinamik kodlama, NDI) yeni oturum açmak yerine açık oturum kullanılır: kernel.yeniSirketAktifEXE(NETSISCORE).
Bağlantı bilgilerini koda gömmeyin. NetsisQuick bunları
Properties.Settingsiçinde tutar; daha iyisi Windows Credential Manager ya da şifreli yapılandırmadır.
Doğru şablon: try / catch / finally
COM nesneleri .NET çöp toplayıcısıyla zamanında bırakılmaz. Bırakılmayan Kernel ve Sirket, Netsis oturumunu ve veritabanı bağlantısını açık tutar; uzun çalışan uygulamalarda lisans ve bellek sorunlarına yol açabilir. Logo'nun ve bahadirdogru.com'un tüm örnekleri bu yüzden finally içinde temizlik yapar.
Kernel kernel = null;
Sirket sirket = null;
Fatura fatura = null;
try
{
kernel = new Kernel();
sirket = kernel.yeniSirket(TVTTipi.vtMSSQL, db, dbUser, dbPass, netsisUser, netsisPass, sube);
fatura = kernel.yeniFatura(sirket, TFaturaTip.ftSFat);
// ... iş ...
}
catch (COMException ex)
{
// Netsis'in hata mesajı ex.Message içindedir (ör. "Stok kodu bulunamadı")
throw new Exception($"Netsis hatası ({ex.ErrorCode:X}): {ex.Message}", ex);
}
finally
{
if (fatura != null) Marshal.ReleaseComObject(fatura);
if (sirket != null) { sirket.LogOff(); Marshal.ReleaseComObject(sirket); }
if (kernel != null) { kernel.FreeNetsisLibrary(); Marshal.ReleaseComObject(kernel); }
}
Sıra önemlidir: önce iş nesneleri (FatKalem, FatUst, Fatura, EBelge…), sonra sirket.LogOff() + Sirket, en son kernel.FreeNetsisLibrary() + Kernel.
Bazı örneklerde ayrıca şu eklenir:
GC.Collect();
GC.WaitForPendingFinalizers();
Yeniden kullanılabilir yardımcı
Her metotta aynı bloğu yazmamak için:
public static class Netsis
{
public static T Run<T>(string db, Func<Kernel, Sirket, T> work)
{
Kernel kernel = null;
Sirket sirket = null;
try
{
kernel = new Kernel();
sirket = kernel.yeniSirket(TVTTipi.vtMSSQL, db,
Config.DbUser, Config.DbPassword, Config.NetsisUser, Config.NetsisPassword, Config.Sube);
return work(kernel, sirket);
}
finally
{
if (sirket != null) { sirket.LogOff(); Marshal.ReleaseComObject(sirket); }
if (kernel != null) { kernel.FreeNetsisLibrary(); Marshal.ReleaseComObject(kernel); }
}
}
}
// kullanım
string no = Netsis.Run("ACME2024", (k, s) =>
{
var f = k.yeniFatura(s, TFaturaTip.ftSSip);
try { /* ... */ f.kayitYeni(); return f.Ust().FATIRS_NO; }
finally { Marshal.ReleaseComObject(f); }
});
Oturum ömrü
- Her işlemde yeni oturum açmak basit ve güvenlidir ama yavaştır (bağlantı birkaç saniye sürebilir).
- Toplu işlerde tek bir
Kernel/Sirketaçıp çok sayıda belge yazmak daha hızlıdır. Bu durumda hata alan belgeden sonra nesnenin durumuna güvenmeyin; o belge için yeniFaturanesnesi oluşturun. - Aynı
Kernel/Sirketnesnesini birden fazla thread'den aynı anda kullanmayın. Paralel iş gerekiyorsa her thread kendi oturumunu açsın; eşzamanlı oturum sayısını lisans sınırlar. - Delphi tabanlı COM sunucuları genellikle tek iş parçacıklı (STA) modelle çalışır. Windows servisinde ya da ASP.NET'te sorun yaşarsanız işi STA bir thread'de çalıştırmayı deneyin (doğrulanmadı).