1

Konu: memo sahası ile ilgili

Arkadaşlar ben VBNET ile uğraşıyorum, FOX dili bilmiyorum ama, dbf dosyalarını vbnet ile "Provider = VFPOLEDB;Data Source=C:\" driver ile açıp değişiklik , listeleme ve yeni kayıtlar yazabiliyıorum. asıl öğrenmek istediğim şu; dbf dosyalarında 'memo' saha özelliğinde olan dbf veritabanlarına ek olarak Fpt uzantılı dosyalarıda var, ben içinde 'memo' saha özellikli dbf dosyasını açtığım zaman bilgileri göremiyorum.

sizden isteğim şu sanırım bu tip veritabanlarını aynı isimli fpt uzantılı dosyası olmadan kullanamıyoruz, bunun mantığını öğrenmek istiyorum birbirleriyle ne tür alakaları vardır
ikinci isteğim ise bu memo sahalarının içeriğini görebilmek , değiştirmek ve düzeltmek için neler yapabilirim vbnette

şimdiden teşekkürler

2

Re: memo sahası ile ilgili

.fpt dosyalarının içinde memolar var. memoları da aynen diğer fieldlar gibi kullanıyorsun. memo field ın ismi herneyse o field ı kullanacaksın. yalnız çok büyük bir kusuru var. memolarda update yaptıkça .fpt dosyası şişer.

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

3

Re: memo sahası ile ilgili

VFP'de karakter saha uzunlugu maksimum 255 ile sinirli. 255'i gecen (ya da gecmese de yer kazanmak icin) veri icin memo tipi kullaniliyor. DBF'te sadece bir pointer tutuluyor o zaman. FPT dosyasinda ise o alanlarin icerigi. Senin acindan normal bir karakter alan gibi sayilir (SQL server text, ntext, image, varchar(max), varbinary(max) gibi). Ancak bilmen gereken orada ne saklandigi. Bu onemli cunku br memo alaninda duz metin yerine bir resim, dosya -aklina ne gelirse- saklanabilir. O zaman .Net'de string degil byte[] olarak okuman lazim. Onun disinda normal ADO.Net ya da Linq islemleri. Ornek:

Visual Fox Pro
Imports System

Imports System.Data
Imports System.Data.OleDb
 
Module Sample
 
    Sub Main()
        Dim cn As New OleDbConnection("Provider=VFPOLEDB;" & _
            "Data Source=C:\PROGRAM FILES\MICROSOFT VISUAL FOXPRO 9\SAMPLES\data\")
        Dim cmd As New OleDbCommand("
select * from employee", cn)
        Dim rdr As OleDbDataReader
        cn.Open()
        rdr = cmd.ExecuteReader
        Do While rdr.Read()
            Console.WriteLine(rdr("
Notes"))
        Loop
        rdr.Close()
        cn.Close()
    End Sub
 
End Module

Bir baskasi (notlari Ingilizce yazmistim simdi cevirmekle ugrasmadim - orijinali asagidaki adreste):

http://social.msdn.microsoft.com/forums … 84919c4af/

C#
using System;

using System.Data;
using System.Data.OleDb;
using System.IO;
 
class Test
{
static void Main()
{
     string strCon = @"Provider=VFPOLEDB;
Data source=C:\Program Files\Microsoft Visual Studio\MSDN\2001OCT\1033\SAMPLES\VFP98\data\Testdata.dbc"
;
 
     string strSQL = "insert into employee (emp_id,first_name,last_name,notes) values (?,?,?,?)";
 
     OleDbConnection cn = new OleDbConnection(strCon) ;
     cn.Open();
     // First send "set null off" command to VFP so it wouldn't error for missing fields
     // but instead fill them with empty values if default is not specified
     OleDbCommand cmdInit = new OleDbCommand("set null off",cn); 
     cmdInit.ExecuteNonQuery();
 
     // Prepare command and parameters
     OleDbCommand cmd = new OleDbCommand(strSQL,cn);
     OleDbParameter empID     = cmd.Parameters.Add("empID",OleDbType.Char);
     OleDbParameter firstName = cmd.Parameters.Add("firstName",OleDbType.Char);
     OleDbParameter lastName  = cmd.Parameters.Add("lastName",OleDbType.Char);
     OleDbParameter notes     = cmd.Parameters.Add("notes",OleDbType.Char);
                                // might be VarChar, LongVarChar etc
 
     // Important
     // Note that unlike MSSQL, VFP parameters are not named but positional.
     // Parameter name only helps to developer. It's their position that provides mapping
     // parameter to its related field. IOW:
     // (emp_id,first_name,last_name,notes) values (?,?,?,?)
     // first parameter added (empID) is for emp_id, 2nd (firstName) is for first_Name and so on.
 
 
     empID.Value = "C#2VFP";
     firstName.Value = "TestName";
     lastName.Value  = "TestLast";
 
     // Get an existing text file to put into VFP memo field
     string file2read = @"C:\Program Files\Microsoft Visual Studio\Vfp98\VFP6FAQ.txt";
     string memoContent;
     using (StreamReader sr = new StreamReader(file2read))
     {
        memoContent = sr.ReadToEnd();
     }
     notes.Value = memoContent; // Got via another var just for clarity
 
     // insert the record
     cmd.ExecuteNonQuery();
     cn.Close();
}
}

4

Re: memo sahası ile ilgili

ilginiz ve alakanız için gerçekten teşekkürler, şimdi başlıyorum..

5 Son düzenleyen, sermur11 (14.02.2009 16:01:49)

Re: memo sahası ile ilgili

şimdi bu dbf ve fpt veritabanı varya, şimdi bunun içinde saha olarak 10 tane kadar memo alanlar var 2 tanede sayısal olan alan var, normal olarak bu veri tabanını açıyorum, sayısal olan sahaları görmeme rağmen memo özellikli sahaları boş görüyorum.  yukarıda ole ile bağlantı örneğini vermişsiniz, ole ile zaten bende bağlanıyorum. bağlantıyı kurup , dediğim gibi sayısallarıda okuyabiliyorum. siz o değişkeni byte olarak okuman lazım demişsinde ? byte olarak okutmak şumudur:

dim deger as byte
deger=rdr("notes")


olayı şöyle özetliyim ben şimdi işyerimizde foxpro ile yazılmış programımız var, kendi programımızda biçok işlem ya yok veya çok zahmetlice yollarla elde edebildiğim raporlamalar ve veri girişleri var, o yüzden vb net ile aynı dbf veritabanı dosyalarını kullanarak farklı ara programcıklar yapıp işlerimi orada takip ediyorum, mesela birden fazla veri kayıt girişi farklı pencerelerden olurken, yaptığım programda hepsini tek pencereden girip işimi bayağı kolaylaştırıyorum, zamandan önemli ölçüde tasarruf sağlıyorum,
işte şu memo sahalı bir dbf dosyasınıda prograıma adapte etmek isterken alan türü memo olduğu için verileri göremiyor ve dolayısıyla yeni kayıt veya güncelleme yapamıyorum.

6

Re: memo sahası ile ilgili

Ben C# kullaniyorum, VB zor geliyor. Byte olarak okutmak:

byte[] deger = (byte[])rdr["notes"];

C# daki cast  VB'de CType() olmasi lazim.

Memo alani gorememek ne demek bilmiyorum. Belki de zaten data yoktur.

OleDb disinda bir ornek de ben bilmiyorum. Benim bildigim VFP datasina baglanmanin tek yolu OleDbConnection. ODBC olabilir ama database versiyonu eski ise (8 oncesi).

7

Re: memo sahası ile ilgili

memo alanını görememek demek şu;
veritabanını bit datagride bağlarsın ya saha alanları ve içindeki datalar listelenir mesela

ad           soyad         no            özgeçmiş(memo)
=====  ======= ====     =============================================
murat     ak             174 
ali          şan            254
memet   sak            14



örnek olarak verdim bunu
işte bu datagridde ad,soyad ve yaş sahaları datagride listelenirken, memo özellikli özgeçmiş sahası boş olarak çıkıyor. o bilgileri göremiyorum ,ama o bilgiler yok değil var.

8

Re: memo sahası ile ilgili

C#
using System;

using System.Data;
using System.Data.OleDb;
 
using System.Windows.Forms;
using System.Drawing;
 
class MemoSample
{
static void Main()
{
   OleDbConnection con = new OleDbConnection(
         @"provider=vfpoledb;Data Source=C:\PROGRAM FILES\MICROSOFT VISUAL FOXPRO 9\SAMPLES\data\testdata.dbc");
   OleDbCommand cmd = new OleDbCommand("select first_name,last_name,notes from employee", con);
   con.Open();
   OleDbDataReader rdr = cmd.ExecuteReader();
 
   DataTable t = new DataTable();
   t.Load(rdr);
   con.Close();
 
   Form f = new ShowDataForm(t, "Notes alani memo");
   f.ShowDialog();
}
}
 
public class ShowDataForm : Form
{
  public ShowDataForm(DataTable tbl, string caption)
  {
     this.dgv = new System.Windows.Forms.DataGridView();
     this.dgv.Location = new System.Drawing.Point(0, 0);
     this.dgv.Dock = DockStyle.Fill;
     this.dgv.DataSource = tbl;
     this.Text = caption;
     this.Controls.Add(this.dgv);
  }
  private System.Windows.Forms.DataGridView dgv;
}

Notes alani memo ve gayet guzel gorunuyor. Senin memolarin ne problemi var bilemem. Ya iclerinde data yoktur, nulldir, binary data vardir ... VFP ile bakinca ne var iclerinde?

9

Re: memo sahası ile ilgili

ya dediğim gibi dbf dosyaları hakkında çok fazla bi bilgim yok, mdb dosyalrında böyle bir şey görmedim şimdiye kadar, şimdi dediniz ya o variler ya yoktur yada nulldur gibisinden, bu şu anda kullandığımız programın veritabanı dosyası  boş olması imkansız. hani ben demiştim ya programımızın veritabanlarını bende kendi programcıklarım ile kullanıyorum diye. orjinal foxpro ile yazılmış programımızdan açtığımız zaman tabiki, memo olan yerleri görebiliyorum rahatlıkla, acaba veritabanı dosyasında bu sahalarla ilgili bir kısıtlama felan yapılmış olmasın? hatta dahada ileriye giderek dbfviewer diywe bi kaç programla da baktım memo alanları göstwermiyor !!

yardım ve alakanız için teşekkürler, istwerseniz eğer veritabanı dosyasını size göndereyim bi inceleyin

10 Son düzenleyen, cetinbasoz (16.02.2009 19:34:33)

Re: memo sahası ile ilgili

Memo alanlari gercekten cok basit seyler. Icerigini strconv() ile cevir istersen gercekten var da sen mi goremiyorsun, yoksa yok mu diye. .Net string problemi malum eger ilk byte ASCII 0 ise sen birsey goremezsin (VFP gorur:)
Ne bileyim belki oraya unicode saklamislardir, ici bol miktarda ASCII 0 dolu olacak o zaman, encoding UTF-8 oldugundan sana 0'la baslayan string gibi gorunur ve .Net onu string olarak bos gosterir (onun icin dedim byte[] kullan diye, kullandinmi hic?).

Cast() yontemini denemek istersen:

select cast(strconv(memoAlan,15) as m) as memoHex,
  cast(strconv(memoAlan,13) as m) as memoBase64
  from myTable

Olmadi dosyayi ziple gonder bir bakalim.

Not: Dosyayi gondereceksen eklerini unutma (ne varsa, CDX,FPT, bagli oldugu database varsa DBC,DCT,DCX ... )

cetin.basoz
at
deu.edu.tr

adresine gonderebilirsin.

11

Re: memo sahası ile ilgili

Çetin bey, hiç yapmadığım bi hatadan dolayı , daha doğrusu ufak bir ayrıntıdan dolayı göremiyordum, şimdi tamam. görebiliyorum. gerçekten çok yardımcı olduğunuz için çok ama çok teşekkür ediyorum. sağolun.