Konu: foxpro ile sql server bağlantısı
merhaba arkadaşlar öncelikle bu sitede emeği geçen herkeze çok teşekkür ediyorum.
arkadaşlar foxpro ile sql server bağlantısı nasıl yapılabilir
Giriş yapmadınız. Lütfen giriş yapın yada kayıt olun.
fox4um » Veritabanı, Tablo, View, Index ve SQL Syntax » foxpro ile sql server bağlantısı
merhaba arkadaşlar öncelikle bu sitede emeği geçen herkeze çok teşekkür ediyorum.
arkadaşlar foxpro ile sql server bağlantısı nasıl yapılabilir
lnHandle = SQLSTRINGCONNECT("Driver=SQL server;server=.\SQLEXPRESS;Trusted_connection=yes")
SQLEXEC(m.lnHandle,"select * from AdventureWorks.HumanResources.Employee","myCursor")
SQLDISCONNECT(m.lnHandle)
browse
sayın çetin hocam;
foxproda open database deyip database açıp use komutu ile tablelara ulaşabiliyoruz
sql ile nasıl bir yol izlememiz gerekiyor
O ornek:
use AdventureWorks!Employee
gibi:) SQL server'a ulasip datasini kullanmanin birden fazla yolu var. O yazdigim ornek SPT (SQL Pass Through). RV (RemoteView) veya CA (CursorAdapter) kullanabilirsin. CA'nin extra avantajlari var, ODBC yerine ADO baglanti kullanabilmek, schema ayarlari yapabilmek gibi.
SQL 2005'te AdventureWorks database'i ornek olarak geliyor ondan oyle yazdim. Dikkat et SQL server'da 3 (nadiren 4) parcali isimlendirme kullaniliyor:
AdventureWorks.HumanResources.Employee
yani:
Database.Schema.Table
gibi. SQL2000'de de oyle (schema yerine owner diye geciyor) ancak genelde sadece dbo kullanldigi icin insanlar:
Northwind..Employees
ya da:
Employess yaziyor (Northwind zaten aktif database ise - connectionstringte ya da sonradan:
SQLExec( m.lnHandle, "use AdventureWorks") && Foxtaki open database
SQLExec( m.lnHandle, "select * from HumanResources.Employee", "myCursor")
SQL baglantisi diye sormussun ben de hizli basit bir ornegini verdim. Cok derin konu, spesifik sorulara cevabi ancak kaldiriyor.
VFP9'da Data Explorer'i acarsan o senin icin cogunu otomatik yapiyor. Ya da Database'de Remote view.
ADO kullanmanın ne avantajı var?
...CA'nin extra avantajlari var, ODBC yerine ADO baglanti kullanabilmek, ...
Bilmem herhalde destegi daha cok diye seviyorum. Mesela SQL2005 ornek database'lerine ODBC ile erisitiginde XML datatipi alanlari sacmaliyor. ADO gayet guzel isliyor. Driver hatasi olabilir, VFP hatasi yerine ama oyle ya da boyle ADO hemen hemen her zaman daha iyi calisan. Ayrica stored procedure cagirmak ADOda kolay ve calisiyor. ODBC'de driverdan driver'a calisiyor (driver meselesi ama sonucta OLEDB'lerle calistigina gore driver destegi daha iyi). Bazi seylerin hic ODBC driveri yok bile (ornegin VFP9).
ADO'yiu baglayabildigin yesr daha cok. ADO hierarchical datasetleri ve multivalued degerleri destekliyor vs vs. ODBCyi kimin icat edip gelistirdigini bilmiyorum, ADO'yu fox takiminin yaptigini biliyorum (belki de duygusal faktor:)
ben bu teknik konulardan anlamıyorum ama biryerde okumuştum ado dediğin odbc üzerine yapılmış bir kabuk diye. yanlış mı?
bir de cursoradapter class içinden ado ile nasıl stored procedure çağırıyorsun?
Evet birisi daha yuksek seviyeli API. Ama sonucta ODBC driverlar yerini ADO'ya bıraktı gibi. Cogu saglayıcı artık ODBC driverlarini guncellemiyor (VFP tipik ornek).
ADO'nun connection, recordset objeleri yanı sıra command, parameter gibi objeleri de var:
-Connection kur
-Command objesi yarat
-CommandTYpe'ini stored procedure'a kurup CoomandText'ine SP adını yaz
-Parametrelerini ekle (input,output ve return)
-Command.execute (bu recordset donduruyor)
-Donen RS CA'nın datasource'u (select icin)
-Stored procedure yonteminde insert/update/delete icin farklı stored procedure'lar kullanabilirsin
Tam bir CA ornegi veremiyorum cunku CA kullanmıyorum.
...
Tam bir CA ornegi veremiyorum cunku CA kullanmıyorum.
createobject ile nesnesini mi oluşturuyorsun? eğer ca kullanmıyorsan oluşturduğun cursor u nasıl updatable hale getiriyorsun? kullandığın yöntemin örneğini verebilir misin?
Universalthread:
<B>Re: ADO and cursoradaptor problem! Anybody??</B> Thread #906520 Message #906597
<B>Re: CursorAdapter with SQL and parameter</B> Thread #944961 Message #944968
Aleksey'in mesajını okumayı ihmal etme.
UT de PUTM olmadigim icin bu threadlari okuyamadim
buraya copy + paste etme sansin olursa cok faydali olur
İlki:
#Define SQLCONNECTION "Provider=SQLOLEDB.1;Integrated Security=SSPI;"+;
"Persist Security Info=False;"+;
"Initial Catalog=Northwind; Data Source=ServerNAME"
*!* ADO CursorAdapter
oXC1 = Createobject('xcADOUpdatable', "vcustomers", SQLCONNECTION, ;
"select * from customers",;
"Customers",;
"CustomerID",;
"CustomerID, CompanyName, ContactName, ContactTitle",;
"CustomerID customers.CustomerID, "+;
"CompanyName customers.CompanyName,"+;
"ContactName customers.ContactName,"+;
"ContactTitle customers.ContactTitle")
CursorSetProp("Buffering",5,'vcustomers')
Browse Title 'Before modification'
If ( !Tableupdate(2,.T.,'vcustomers') )
oXC1.DispError()
Else
oXC1.CursorFill()
Browse Title 'After Tableupdate'
Endif
Define Class xcADOUpdatable As CursorAdapter
AllowUpdate = .T.
AllowInsert = .T.
AllowDelete = .T.
Procedure Init
Lparameters tcAlias,tcConn, tcSQL,tcTables,;
tcKeyFieldList,tcUpdatableFieldList,tcUpdateNameList
This.AddProperty('oConn', Newobject("ADODB.Connection"))
This.AddProperty('oRS', Newobject("ADODB.Recordset"))
With This.oConn
.ConnectionString = tcConn
.Mode = 16 && adModeShareDenyNone
.Open()
Endwith
With This.oRS
.ActiveConnection = This.oConn
.LockType=3 && adLockOptimistic
.CursorLocation = 3 && adUseClient
.CursorType = 2 && adOpenDynamic
Endwith
With This
.Alias = tcAlias
.Tables = tcTables
.KeyFieldList = tcKeyFieldList
.UpdatableFieldList = tcUpdatableFieldList
.UpdateNameList = tcUpdateNameList
.WhereType = 1
.UpdateType= 1
.SendUpdates = .T.
.DataSourceType = "ADO"
.Datasource = This.oRS
.SelectCmd = tcSQL
.CursorFill()
Endwith
Endproc
Procedure DispError
Local Array errors(1)
Local lcError
Aerror(errors)
lcError = 'Error--------------'
For ix=1 To 7
lcError = lcError + Chr(13)+Transform(errors[ix])
Endfor
lcError = lcError + Chr(13) + 'Error--------------'
Messagebox(lcError)
Endproc
Enddefine
2.:
*Sample form
#Define SQLCONNECTION "Provider=SQLOLEDB;Integrated Security=SSPI;"+;
"Persist Security Info=False;"+;
"Initial Catalog=Northwind; Data Source=servername"
oForm = Createobject('myForm',SQLCONNECTION)
oForm.Show
Read Events
Define Class myForm As Form
DataSession = 2
Height = 300
Width = 800
Add Object Grd1 As myGrid With Height = 300, Width = 400
Add Object Grd2 As Grid With Height = 300, Width = 400, Left = 400
Procedure Init
Lparameters tcConn
This.AddProperty('oConn', Newobject("ADODB.Connection"))
With This.oConn
.ConnectionString = tcConn
.Mode = 16
.Open()
Endwith
This.AddProperty('Dataenvironment',Createobject('myDataEnvironment', This.oConn))
This.Grd1.RecordSource = 'ca_customers'
This.Grd2.RecordSource = 'ca_orders'
Endproc
Procedure QueryUnload
Clear Events
Endproc
Procedure Destroy
Endproc
Procedure DispError
Local Array errors(1)
Aerror(errors)
? 'Error--------------'
For ix=1 To 7
? errors[ix]
Endfor
? 'Error--------------'
Endproc
Enddefine
Define Class myDataEnvironment As DataEnvironment
Procedure Init
Lparameters toConn
With This
.AddObject('caCustomers','myADOAdapter',toConn,'ca_customers')
With .caCustomers
.Tables = "Customers"
.KeyFieldList = "CustomerID"
.UpdatableFieldList = "CustomerID, CompanyName, ContactName, ContactTitle"
.UpdateNameList = ;
"CustomerID customers.CustomerID, "+;
"CompanyName customers.CompanyName,"+;
"ContactName customers.ContactName,"+;
"ContactTitle customers.ContactTitle"
.SelectCmd = "select * from customers"
.CursorFill()
Endwith
.AddObject('caOrders','myADOAdapter',toConn,'ca_orders')
With .caOrders
.Tables = "Orders"
.KeyFieldList = "ORDERID"
.UpdateNameList = "CUSTOMERID Orders.CUSTOMERID, "+;
"EMPLOYEEID Orders.EMPLOYEEID,"+;
"FREIGHT Orders.FREIGHT,"+;
"ORDERDATE Orders.ORDERDATE,"+;
"ORDERID Orders.ORDERID"
.UpdatableFieldList = "CUSTOMERID, EMPLOYEEID, FREIGHT, ORDERDATE, ORDERID"
.CursorSchema = "CUSTOMERID C(5), EMPLOYEEID I, FREIGHT Y, ORDERDATE D, ORDERID I"
.AddProperty('oCommand', Newobject('ADODB.Command') )
With .oCommand
.CommandText = "select Orders.CustomerID, Orders.EmployeeID, "+;
"Orders.Freight, Orders.OrderDate, Orders.OrderID"+;
" from Orders"+;
" where customerID = ?"+;
" order by employeeID, orderdate desc"
.Parameters.Append( .CreateParameter("CustomerID", 129,1,10,ca_customers.customerID) )
Endwith
.oCommand.ActiveConnection = .Datasource.ActiveConnection
.AddProperty( 'oRS', .oCommand.Execute() )
.CursorFill(.T., .F., 0, .oRS)
Endwith
Endwith
Endproc
Enddefine
Define Class myGrid As Grid
Procedure AfterRowColChange
Lparameters nColIndex
With Thisform.DataEnvironment.caOrders
.oRS.ActiveCommand.Parameters("CustomerID") = ca_customers.customerID
.CursorRefresh()
Endwith
Thisform.Refresh()
Endproc
Enddefine
Define Class myADOAdapter As CursorAdapter
AllowUpdate = .T.
AllowInsert = .T.
AllowDelete = .T.
WhereType = 1
UpdateType= 1
SendUpdates = .T.
DataSourceType = "ADO"
Procedure Init
Lparameters toConn, tcAlias
With This
.Alias = tcAlias
.Datasource = Newobject("ADODB.Recordset")
With .Datasource
.ActiveConnection = toConn
.LockType=4
.CursorLocation = 3
.CursorType = 2
Endwith
Endwith
Endproc
Procedure UpdateTable
This.Datasource.Updatebatch()
Endproc
Enddefine
Aleksey Tsingauz'dan:
CLOSE DATABASES ALL
CLEAR
customerid='ALFKI'
LOCAL oCA as CursorAdapter
oCA=CREATEOBJECT("CursorAdapter")
oCA.SelectCmd="select * from Northwind..Orders where customerID = ?m.customerid"
?"ODBC"
oCA.DataSourceType="ODBC"
oCA.DataSource=SQLCONNECT("localServer")
IF oCA.DataSource<1
?"Failed to connect."
ELSE
?oCA.CursorFill()
LIST
USE
SQLDISCONNECT(oCA.DataSource)
ENDIF
?
?"ADO"
LOCAL oConn as ADODB.Connection, oRS as ADODB.Recordset, oCom as ADODB.Command
oConn=CREATEOBJECT("ADODB.Connection")
oConn.Open("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Data Source=(local)")
oRS = CREATEOBJECT("Adodb.RecordSet")
oRS.ActiveConnection = oConn
oCom = CREATEOBJECT("Adodb.Command")
oCom.ActiveConnection = oConn
oCA.DataSourceType="ADO"
oCA.DataSource=oRS
?oCA.CursorFill(,,,oCom)
LIST
USE
UT de PUTM olmadigim icin bu threadlari okuyamadim
buraya copy + paste etme sansin olursa cok faydali olur
www.universalthread.com/wconnect/wc.dll?2,15,944968
Formatına uygun olarak mesajid numarasını sonuna eklersen okuyabilirsin.
tesekkurler Ali o sekilde denememistim
fox4um » Veritabanı, Tablo, View, Index ve SQL Syntax » foxpro ile sql server bağlantısı