Aracılığıyla paylaş


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 SQLExtendedFetchistendiğ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_MODEve 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_TIMEOUTve SQL_ASYNC_ENABLE bir CDatabaseHDBC'de çağrılabilir.

SQLError null bağımsız değişkenlerinden herhangi biriyle veya tümüyle çağrılabilir.

Elbette , SQLAllocEnvSQLAllocConnectve SQLDisconnect SQLFreeConnect desteklenmelidir.

Executesql

Geçici bir HSTMT ayırmaya ve boşaltmaya ek olarak , SQLFetchSQLNumResultCol ExecuteSQL ve SQLMoreResultsçağrıları SQLExecDirectda yapılır. SQLCancelHSTMT'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 SQLExecDirectSQL_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 SQLExtendedFetchzamanları algılar ve gerekli desteği sağlar.

SQLGetInfoSQL_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:

SQLGetInfoSQL_ODBC_VER "01" döndürmelidir > .

SQLGetInfoSQL_SCROLL_OPTIONS SQL_SO_KEYSET_DRIVEN desteklemelidir.

SQLGetInfo SQL_ROW_UPDATES "Y" döndürmelidir.

SQLGetInfoSQL_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.

Ayrıca bkz.

Sayıya Göre Teknik Notlar
Kategoriye Göre Teknik Notlar