26 Son düzenleyen, ctapan (17.01.2008 13:47:44)

Re: Yeni başlayanlar ve Foxpro 2.x'ten geçenler için VFP

Abi bir kaç soru sormak isterim.Fox ve sql server değil de c# ve sql server hakkında

1. Foxdaki ? ile parametre göndermenin c# karşılığı varmıdır?
2. Sql serverdaki bir Sp'e IN de kullanılmak üzere parametre nasıl gönderirim
örneğin:
select * from Agency where agencyCode in ('A01','A02','A03')

burdaki 'A01','A02','A03' kısmını parametre olarak göndermem gerekiyor.

3. Fox ile MSDTC kullanımı mümkünmü.

27

Re: Yeni başlayanlar ve Foxpro 2.x'ten geçenler için VFP

1) Evet var:) Commandbuilder zaten ? kullanarak yapiyor.
Sende nasil olsa SQL2005 ve Adventureworks vardir:)

C#
using System;

using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Collections.Generic;
 
class SQLtest
{
  static string conString =
      @"Data Source=.\sqlexpress;integrated Security=sspi;Database=AdventureWorks";
 
  static void Main()
  {
   ParameterTest1();
   ParameterTest2();
  }
 
  private static void ParameterTest1()
  {
    Console.WriteLine("test1-SQL");
    SqlConnection sConn = new SqlConnection(conString);
    string strSelect =
     @"select * from HumanResources.vEmployee where City = @city and JobTitle like @jobTitle";
 
    SqlCommand cmd = new SqlCommand(strSelect, sConn);
 
    cmd.Parameters.Add("@city", SqlDbType.VarChar).Value = "seattle";
    cmd.Parameters.Add("@jobTitle", SqlDbType.VarChar).Value = "production supervisor%";
    ShowEmp<SqlConnection,SqlCommand>(sConn, cmd,
      "employeeID","firstName","lastName","JobTitle","city","countryRegionName");
 
    cmd.Parameters["@jobTitle"].Value = "Production Technician - WC40";
    ShowEmp<SqlConnection,SqlCommand>(sConn, cmd,
      "employeeID","firstName","lastName","JobTitle","city","countryRegionName");
  }
 
  private static void ParameterTest2()
  {
    Console.WriteLine("test2-OLEDB");
    OleDbConnection sConn = new OleDbConnection("Provider=SQLNCLI;"+conString);
    string strSelect =
     @"select * from HumanResources.vEmployee where City = ? and JobTitle like ?";
 
    OleDbCommand cmd = new OleDbCommand(strSelect, sConn);
 
    cmd.Parameters.Add("@city", OleDbType.VarChar).Value = "seattle";
    cmd.Parameters.Add("@jobTitle", OleDbType.VarChar).Value = "production supervisor%";
    ShowEmp<OleDbConnection,OleDbCommand>(sConn, cmd,
      "employeeID","firstName","lastName","JobTitle","city","countryRegionName");
 
    cmd.Parameters["@jobTitle"].Value = "Production Technician - WC40";
    ShowEmp<OleDbConnection,OleDbCommand>(sConn, cmd,
      "employeeID","firstName","lastName","JobTitle","city","countryRegionName");
  }
 
  private static void ShowEmp<CON,CMD>(CON con, CMD cmd,
     string f1, string f2, string f3, string f4, string f5, string f6)
     where CON: DbConnection
     where CMD: DbCommand
  {
    con.Open();
    IDataReader rdr = (IDataReader)cmd.ExecuteReader();
    while (rdr.Read())
    {
      Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\t{5}",
           rdr[f1],rdr[f2],rdr[f3],
           rdr[f4],rdr[f5],rdr[f6] );
    }
    rdr.Close();
    con.Close();
    Console.WriteLine("Press enter to continue");
    Console.ReadLine();
  }
}

Dikkat etmen gereken nokta:
Test1 isimli parametreler kullaniyor ("where City = @city and JobTitle like @jobTitle"). Eger Sql* serisini kullaniyorsan bunu kullanman gerekiyor. Parametrelerin eklenme sirasinin onemi yok.

Test2 pozisyonel parametreler kullaniyor ("where City = ? and JobTitle like ?"). OleDb* ile bunu kullanmalisin. Parametrelerin Add sirasi ?'larin siralamasiyla uymali: Add("@city", ... )  Add("@job", ...). Once job icin olani eklersen sorguya da aynen oyle gider istemeden sorgun city = 'Prov...' and jobtitle = 'seattle' gibi olur. Tipler uyusmazsa hata alirsin:)

2) IN tipi sorgularda genelde bir string build edip onu gonderiyorlar. Ben hic bir zaman ona taraftar olmadim:) Benim yaptigim (hem VFPde hem C#da) SQL serverda bir temp tablo yaratip IN degerlerini oraya insert etmek. Sonra da o tabloyla inner join yapan select ile sonucu almak.

C#
using System;

using System.Data;
using System.Data.SqlClient;
 
class test
{
  static void Main()
{
    string strCreate =
@"CREATE TABLE #ulkeler (ulke varchar(20))
INSERT INTO #ulkeler VALUES ('canada')
INSERT INTO #ulkeler VALUES ('france')
INSERT INTO #ulkeler VALUES ('germany')"
;
 
   string strByCountry =
@"select * from HumanResources.vEmployee vEmp
inner join #ulkeler iVal
on vEmp.countryRegionName = iVal.ulke"
;
 
    string strByID =
@"CREATE TABLE #employees (empid int)
INSERT INTO #employees VALUES (3)
INSERT INTO #employees VALUES (5)
INSERT INTO #employees VALUES (7)
INSERT INTO #employees VALUES (8)
INSERT INTO #employees VALUES (10)
INSERT INTO #employees VALUES (282)
INSERT INTO #employees VALUES (286)
 
select * from HumanResources.vEmployee vEmp
inner join #employees iVal
on vEmp.employeeID = iVal.empid"
;
 
   SqlConnection sConn = new SqlConnection(
       @"Data Source=.\sqlexpress;integrated Security=sspi;Database=AdventureWorks");
 
   sConn.Open();
   SqlCommand cmdCreate    = new SqlCommand(strCreate, sConn);
   SqlCommand cmdByCountry = new SqlCommand(strByCountry, sConn);
   SqlCommand cmdByID  = new SqlCommand(strByID, sConn);
 
   cmdCreate.ExecuteNonQuery();
   ShowResult(cmdByCountry.ExecuteReader());
 
   ShowResult(cmdByID.ExecuteReader());
 
// iki temp dosyayi kullan
   SqlCommand cmdAdd = new SqlCommand("INSERT INTO #ulkeler VALUES ('united states')", sConn);
   cmdAdd.ExecuteNonQuery();
   SqlCommand cmdMix  =
      new SqlCommand(
@"select * from HumanResources.vEmployee vEmp
inner join #employees e on vEmp.employeeID = e.empid
inner join #ulkeler u on vEmp.countryRegionName = u.ulke"

      ,sConn);
   ShowResult(cmdMix.ExecuteReader());
 
   sConn.Close();
 
}
 
private static void ShowResult(SqlDataReader rdr)
{
   while (rdr.Read())
   {
     Console.WriteLine("{0}\t{1,-15}\t{2,-20}\t{3,-15}\t{4}",
       rdr["employeeID"],
       rdr["firstName"],rdr["lastName"],
       rdr["city"], rdr["countryRegionName"] );
   }
   rdr.Close();
   Console.WriteLine("".PadRight(80, '-'));
}
}

28

Re: Yeni başlayanlar ve Foxpro 2.x'ten geçenler için VFP

3) http://msdn2.microsoft.com/en-us/library/ms917363.aspx

29

Re: Yeni başlayanlar ve Foxpro 2.x'ten geçenler için VFP

cetinbasoz yazdı:

2) IN tipi sorgularda genelde bir string build edip onu gonderiyorlar. Ben hic bir zaman ona taraftar olmadim:) Benim yaptigim (hem VFPde hem C#da) SQL serverda bir temp tablo yaratip IN degerlerini oraya insert etmek. Sonra da o tabloyla inner join yapan select ile sonucu almak.


Senin yöntemde kullanışlı ama merakımdan soruyorum. String build edip nasıl gönderiyorlar. Ben yapamadımda

30

Re: Yeni başlayanlar ve Foxpro 2.x'ten geçenler için VFP

Local lnHandle
lnHandle=Sqlstringconnect('DRIVER=SQL Server;SERVER=.;Trusted_connection=Yes')


m.ldDate = {^1997/08/21}
m.customerID1='FOLIG'
m.customerID2='SAVEA'
TEXT to lcStatement1 noshow
select * from Northwind.dbo.orders
   where ShippedDate = ?m.ldDate and customerID in (?m.customerID1,?m.customerID2)
ENDTEXT
lcList = "'FOLIG','SAVEA'"
TEXT to lcStatement2 TEXTMERGE noshow
select * from Northwind.dbo.orders
   where ShippedDate = ?m.ldDate and customerID in (<<m.lcList>>)
ENDTEXT

SQLExec(lnHandle, m.lcStatement1,'myResult1')
SQLExec(lnHandle, m.lcStatement2,'myResult2')
SQLDisconnect(lnHandle)
Select myResult1
Browse
Select myResult2
Browse

31

Re: Yeni başlayanlar ve Foxpro 2.x'ten geçenler için VFP

Teşekkürler ama tam olarak benim anlatmak istediğim bu değildi.

Ben sp de in de kullanılmak üzere göndermek istiyorum bu filtreyi

SQL
CREATE PROCEDURE dbo.StoredProcedure1 

@Parametre1 varchar(100)
AS
SELECT * FROM northWind WHERE CustomedId IN (@Parametre1)

Gibi birşey yapmak istiyorum.
Birde mümkünse c# da lütfen smile

32

Re: Yeni başlayanlar ve Foxpro 2.x'ten geçenler için VFP

SQL
CREATE PROCEDURE dbo.InQuery

    @valueList nvarchar(1000)
AS
declare @sql nvarchar(4000);
SET @sql = N'
select * from
AdventureWorks.Humanresources.vEmployee
where countryRegionName in ('
+@valueList+')';
 
EXECUTE sp_executesql @sql;

Yarattiktan sonra normal SP gibi cagiracaksin.

C#
string paramstring = @"'ALFKI','BONAP','CACTU'";

SqlCommand cmd = new SqlCommand("InQuery", con);
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@valueList", SqlDbType.NVarChar).Value = paramString;

33

Re: Yeni başlayanlar ve Foxpro 2.x'ten geçenler için VFP

Bu arada bunun SQL injection'a davetiye oldugunu aklindan cikarma. Disaridan ulasilabilen yerlerde kullanma.

34

Re: Yeni başlayanlar ve Foxpro 2.x'ten geçenler için VFP

cetinbasoz yazdı:

Bu arada bunun SQL injection'a davetiye oldugunu aklindan cikarma. Disaridan ulasilabilen yerlerde kullanma.


bu "@" , "?" yerine geçmiyor mu? string olarak eklemek yerine parametre olarak gönderirsen enjeksiyon olmaz dememiş miydin? yoksa ben bişey anlamadım mı? sad

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

35

Re: Yeni başlayanlar ve Foxpro 2.x'ten geçenler için VFP

Yo dogru anlamissin. Ancak orada 'select ....'[email protected]+'...' şeklinde. VFP'den 'select ....'+m.valueList+'...' yapmissin gibi. Yani artik parametre gibi değil.

36

Re: Yeni başlayanlar ve Foxpro 2.x'ten geçenler için VFP

cetinbasoz yazdı:

1) Evet var:) Commandbuilder zaten ? kullanarak yapiyor.
Sende nasil olsa SQL2005 ve Adventureworks vardir:)

C#
.

.
    SqlCommand cmd = new SqlCommand(strSelect, sConn);
.
.
.
    OleDbCommand cmd = new OleDbCommand(strSelect, sConn);
.
.
.


SqlCommand ve OleDbCommand kullanarak örnekler vermişsin.
Ben DbCommand kullanıyordum. Ondaki parametre özelliği bunlar kadar gelişmiş değil.

Bende SqlCommanda dönerim artık.

37 Son düzenleyen, tamer061966 (10.01.2009 23:07:52)

Re: Yeni başlayanlar ve Foxpro 2.x'ten geçenler için VFP

Teşekürler Çetin Hocam!

38 Son düzenleyen, tamer061966 (10.01.2009 23:06:39)

Re: Yeni başlayanlar ve Foxpro 2.x'ten geçenler için VFP

Sayın Çetin Hocam!
Ben hasbelkader VFP öğrenmeye çalışıyorum. Bu siteyide mümkün oldukça takip ediyorum. Bilgi aktarmaktaki çabanız gerçekten hertürlü saygıyı hakediyor.
Aktaracağınız bilgileri sabırsızlıkla bekliyorum. Elinize ve yüreğinize sağlık.
Tekrar teşşekürler Çetin Hocam!

39

Re: Yeni başlayanlar ve Foxpro 2.x'ten geçenler için VFP

Çetin Hocam
Sizin söylediklerinizi aşağıdaki sırada yaptım

**********
create table (home()+'Projelerim') free (Caption c(50), Path c(250)) [enter]
use [enter]

Modi comm (home()+'Baslat') [enter]

-Asagidaki kodu yapistir, [Ctrl+W] ile sakla
Kod: visualfoxpro
USE HOME()+'Projelerim'
BROWSE
SET DEFAULT TO (TRIM(Projelerim.path))
_screen.Caption = TRIM(Projelerim.Caption)
USE IN 'Projelerim'

-Command window
_cliptext = home()+'Projelerim.prg'
-Tools\Options\File Locations\Startup Program. Modify.
[Ctrl+V]
OK
Set as default

** Fakat kapatıp açtığımda
Browse ekranı karşıma gelmedi
"-Tools\Options\File Locations\Startup Program" baktığımda  boş olduğunu gördüm.
İşlemleri tekrar denememe rağmen olmadğını gördüm.
Nerde hata yaptım onu anlıyamadım.
Yardımcı olursanız sevinirim.
Şimdiden teşekkürler...

40

Re: Yeni başlayanlar ve Foxpro 2.x'ten geçenler için VFP

MSN kullaniyor musun? Beni MSN'den ara bakalim ( [email protected] )

41

Re: Yeni başlayanlar ve Foxpro 2.x'ten geçenler için VFP

Kusura bakma bugun tam cikarken farkettim MSNi ama ekeledim, yarin oglen civari bakariz.

42

Re: Yeni başlayanlar ve Foxpro 2.x'ten geçenler için VFP

MSN'e eklemesine ekledim ama oradaki id'in neydi hatirlamiyorum. Sen uygun oldugunda bir mesaj gonder.