TN042: ODBC Sürücü Geliştirici Önerileri
Dekont
Aşağıdaki teknik not, çevrimiçi belgelere ilk kez eklendiğinden beri güncelleştirilmemiştir. Sonuç olarak, bazı yordamlar ve konular güncel olmayabilir veya yanlış olabilir. En son bilgiler için, çevrimiçi belge dizininde ilgilendiğiniz konuyu aramanız önerilir.
Bu not, ODBC sürücüsü yazıcılarına yönelik yönergeleri açıklar. MFC Veritabanı sınıflarının yaptığı ODBC işlevselliğinin genel gereksinimlerini ve varsayımlarını ve beklenen çeşitli anlamsal ayrıntıları özetler. Üç CRecordset
Açık modu (forwardOnly, anlık görüntü ve dinamik küme) desteklemek için gerekli sürücü işlevselliği açıklanmıştır.
ODBC'nin İmleç Kitaplığı
MFC Veritabanı sınıfları, kullanıcıya birçok durumda en düzey 1 ODBC sürücüsü tarafından sağlanan işlevselliği aşan işlevler sunar. Neyse ki ODBC'nin İmleç Kitaplığı veritabanı sınıfları ve sürücü arasında katman oluşturur ve bu ek işlevlerin çoğunu otomatik olarak sağlar.
Örneğin, çoğu 1.0 sürücü geriye doğru kaydırmayı desteklemez. İmleç Kitaplığı bunu algılayabilir ve sürücüdeki satırları önbelleğe alır ve içindeki FETCH_PREV çağrılarda SQLExtendedFetch
istendiği gibi sunar.
İmleç kitaplığı bağımlılığının bir diğer önemli örneği de konumlanmış güncelleştirmelerdir. Çoğu 1.0 sürücüsünün de konumlandırılmış güncelleştirmeleri yoktur, ancak imleç kitaplığı, geçerli önbelleğe alınmış veri değerlerine veya önbelleğe alınmış bir zaman damgası değerine göre veri kaynağında bir hedef satırı tanımlayan güncelleştirme deyimleri oluşturur.
Sınıf kitaplığı hiçbir zaman birden çok satır kümesi kullanmaz. Bu nedenle, birkaç SQLSetPos
deyim her zaman satır kümesinin 1. satırına uygulanır.
CDatabases
Her CDatabase
birinde tek bir HDBC ayrılır. ('s ExecuteSQL
işlevi kullanılırsaCDatabase
, bir HSTMT geçici olarak ayrılır.) Bu nedenle, birden çok CDatabase
's gerekliyse, HENV başına birden çok HDBCdesteklenmelidir.
Veritabanı sınıfları imleç kitaplığı gerektirir. Bu, bir SQLSetConnections
çağrı SQL_ODBC_CURSORS SQL_CUR_USE_ODBC yansıtılır.
SQLDriverConnect
, SQL_DRIVER_COMPLETE tarafından CDatabase::Open
veri kaynağına bağlantı kurmak için kullanılır.
Sürücü = SQL_OAC_LEVEL1, SQLGetInfo SQL_ODBC_SQL_CONFORMANCE
>= SQL_OSC_MINIMUM desteklemelidirSQLGetInfo SQL_ODBC_API_CONFORMANCE
>.
ve bağımlı kayıt kümeleri için işlemlerin CDatabase
desteklenmesi ve SQL_CURSOR_ROLLBACK_BEHAVIOR SQL_CR_PRESERVE olması gerekir. SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIOR
Aksi takdirde, işlem denetimi gerçekleştirme girişimleri yoksayılır.
SQLGetInfo SQL_DATA_SOURCE_READ_ONLY
desteklenmelidir. "Y" döndürürse, veri kaynağında hiçbir güncelleştirme işlemi gerçekleştirilmeyecektir.
CDatabase
ReadOnly olarak açılırsa, veri kaynağını salt okunur olarak ayarlama girişiminde bulunulacak SQLSetConnectOption SQL_ACCESS_MODE
ve SQL_MODE_READ_ONLY.
Tanımlayıcılar alıntı gerektiriyorsa, bu bilgiler bir SQLGetInfo SQL_IDENTIFIER_QUOTE_CHAR
çağrı ile sürücüden döndürülmelidir.
Hata ayıklama amacıyla SQLGetInfo SQL_DBMS_VER
ve SQL_DBMS_NAME sürücüden alınır.
SQLSetStmtOption SQL_QUERY_TIMEOUT
ve SQL_ASYNC_ENABLE bir CDatabase
HDBC'de çağrılabilir.
SQLError
null bağımsız değişkenlerinden herhangi biriyle veya tümüyle çağrılabilir.
Elbette , SQLAllocEnv
SQLAllocConnect
ve SQLDisconnect
SQLFreeConnect
desteklenmelidir.
Executesql
Geçici bir HSTMT ayırmaya ve boşaltmaya ek olarak , SQLFetch
SQLNumResultCol
ExecuteSQL
ve SQLMoreResults
çağrıları SQLExecDirect
da yapılır. SQLCancel
HSTMT'de çağrılabilir.
GetDatabaseName
SQLGetInfo SQL_DATABASE_NAME
çağrılacaktır.
BeginTrans, CommitTrans, Rollback
SQLSetConnectOption SQL_AUTOCOMMIT
ve SQLTransact SQL_COMMIT
, SQL_ROLLBACK ve SQL_AUTOCOMMIT işlem istekleri yapılırsa çağrılır.
CRecordsets
SQLAllocStmt
, SQLPrepare
, SQLExecute
(ve Open
Requery
) SQLExecDirect
(güncelleştirme işlemleri için) SQLFreeStmt
desteklenmelidir. SQLNumResultCols
ve SQLDescribeCol
çeşitli zamanlarda ayarlanan sonuçlarda çağrılır.
SQLSetParam
, parametre verilerini ve DATA_AT_EXEC işlevselliğini bağlamak için yaygın olarak kullanılır.
SQLBindCol
çıkış Sütun veri depolama konumlarını ODBC'ye kaydetmek için yaygın olarak kullanılır.
SQL_LONG_VARCHAR ve SQL_LONG_VARBINARY verileri almak için iki SQLGetData
çağrı kullanılır. İlk çağrı, 0 cbMaxValue ile ancak geçerli bir pcbValue ile çağırarak SQLGetData
sütun değerinin toplam uzunluğunu bulmayı dener. pcbValue SQL_NO_TOTAL barındırıyorsa bir özel durum oluşturulur. Aksi takdirde, bir HGLOBAL ayrılır ve sonucun tamamını almak için başka bir SQLGetData
çağrı yapılır.
Güncelleştirme
Kötümser kilitleme istenirse SQLGetInfo SQL_LOCK_TYPES
sorgulanır. SQL_LCK_EXCLUSIVE desteklenmiyorsa bir özel durum oluşturulur.
Bir CRecordset
(anlık görüntü veya dinamik küme) güncelleştirme girişimleri ikinci bir HSTMT'nin ayrılmasına neden olur. İkinci HSTMT'yi desteklemeyen sürücüler için imleç kitaplığı bu işlevselliğin benzetimini yapar. Ne yazık ki bu bazen ikinci HSTMT'nin isteğini işlemeden önce ilk HSTMT'de geçerli sorguyu tamamlamaya zorlama anlamına gelebilir.
SQLFreeStmt SQL_CLOSE
ve SQL_RESET_PARAMS ve SQLGetCursorName
güncelleştirme işlemleri sırasında çağrılır.
outputColumns içinde CLongBinarys varsa ODBC'nin DATA_AT_EXEC işlevselliği desteklenmelidir. Bu, SQLParamData
ve SQLPutData
'den SQLExecDirect
SQL_NEED_DATA döndürmeyi içerir.
SQLRowCount
, yürütüldükten sonra yalnızca 1 kaydın tarafından güncelleştirildiğini doğrulamak için çağrılır SQLExecDirect
.
İletme İmleçleri
Yalnızca SQLFetch
işlemler için Move
gereklidir. forwardOnly imleçlerinin güncelleştirmeleri desteklemediğini unutmayın.
Anlık Görüntü İmleçleri
Anlık görüntü işlevselliği için destek gerekir SQLExtendedFetch
. Yukarıda belirtildiği gibi, ODBC imleç kitaplığı bir sürücünün desteklemediği SQLExtendedFetch
zamanları algılar ve gerekli desteği sağlar.
SQLGetInfo
SQL_SCROLL_OPTIONS SQL_SO_STATIC desteklemelidir.
Dinamik Küme İmleçleri
Dinamik kümeyi açmak için gereken minimum destek aşağıdadır:
SQLGetInfo
SQL_ODBC_VER "01" döndürmelidir > .
SQLGetInfo
SQL_SCROLL_OPTIONS SQL_SO_KEYSET_DRIVEN desteklemelidir.
SQLGetInfo
SQL_ROW_UPDATES "Y" döndürmelidir.
SQLGetInfo
SQL_POSITIONED_UPDATES SQL_PS_POSITIONED_DELETE ve SQL_PS_POSITIONED_UPDATE desteklemelidir.
Ayrıca kötümser kilitleme istenirse irow 1, fRefresh FALSE ve fLock SQL_LCK_EXCLUSIVE ile bir çağrı SQLSetPos
yapılır.