Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
ODBC 3.8'in öncesinde, bir uygulama yalnızca bağlı çıkış arabelleğine sahip bir sorgunun çıkış parametrelerini alabildi. Ancak, parametre değerinin boyutu çok büyük olduğunda (örneğin, büyük boyutlu bir görüntü), çok büyük bir arabellek ayırmak zordur. ODBC 3.8, parçalar halinde çıkış parametrelerini almak için yeni bir yol sağlar. Artık bir uygulama, büyük bir parametre değerini almak için küçük bir arabelleği birden çok kez kullanarak SQLGetData'yı çağırabilir. Bu, büyük sütun verilerini almaya benzer.
Bir çıkış parametresini veya giriş/çıkış parametresini parçalar halinde almak için SQLBindParameter işlevini, InputOutputType bağımsız değişkeni SQL_PARAM_OUTPUT_STREAM veya SQL_PARAM_INPUT_OUTPUT_STREAM olarak ayarlanmış şekilde kullanın. SQL_PARAM_INPUT_OUTPUT_STREAM ile bir uygulama SQLPutData kullanarak parametreye veri girişi yapabilir ve ardından SQLGetData kullanarak çıkış parametresini alabilir. Giriş verileri, önceden ayrılmış bir arabelleğe bağlamak yerine SQLPutData kullanılarak yürütülecek veri (DAE) formunda olmalıdır.
Bu özellik ODBC 3.8 uygulamaları veya yeniden derlenmiş ODBC 3.x ve ODBC 2.x uygulamaları tarafından kullanılabilir ve bu uygulamaların SQLGetData ve ODBC 3.8 Sürücü Yöneticisi kullanarak çıkış parametrelerini almayı destekleyen bir ODBC 3.8 sürücüsü olmalıdır. Eski bir uygulamanın yeni ODBC özelliklerini kullanmasını etkinleştirme hakkında bilgi için bkz. Uyumluluk Matrisi.
Kullanım Örneği
Örneğin, her iki parametrenin de SQL_PARAM_OUTPUT_STREAM olarak bağlandığı ve saklı yordamın sonuç kümesi döndürmediği (bu konunun ilerleyen bölümlerinde daha karmaşık bir senaryo bulacaksınız) {CALL sp_f(?,?)} saklı yordamı yürütmeyi göz önünde bulundurun:
Her parametre için, SQLBindParameter işlevini, InputOutputType SQL_PARAM_OUTPUT_STREAM olarak ayarlanmış ve ParameterValuePtr bir belirteç (örneğin, bir parametre numarası, bir veri işaretçisi veya uygulamanın giriş parametrelerini bağlamak için kullandığı bir yapı işaretçisi) olarak ayarlanmış şekilde çağırın. Bu örnekte belirteç olarak sıralı parametresi kullanılır.
Sorguyu SQLExecDirect veya SQLExecute ile yürütür. SQL_PARAM_DATA_AVAILABLE döndürülür ve alınabilecek akışlı çıkış parametreleri olduğunu gösterir.
Alma için kullanılabilen parametreyi almak için SQLParamData'yı çağırın. SQLParamData , SQLBindParameter'da ayarlanan kullanılabilir ilk parametrenin belirteciyle SQL_PARAM_DATA_AVAILABLE döndürür (1. adım). Belirteç, ValuePtrPtr'nin işaret ettiği arabellekte geri döndürülür.
Kullanılabilir ilk parametrenin verilerini almak için col_or_Param_Num parametresine ayarlanmış bağımsız değişkeniyle SQLGetData'yı çağırın. SQLGetData SQL_SUCCESS_WITH_INFO ve SQLState 01004 (veri kesilmiş) döndürüyorsa ve tür hem istemcide hem de sunucuda değişken uzunluktaysa, kullanılabilir ilk parametreden alınacak daha fazla veri vardır. FARKLı bir SQLState ile SQL_SUCCESS veya SQL_SUCCESS_WITH_INFO döndürene kadar SQLGetData'yı çağırmaya devam edebilirsiniz.
Geçerli parametreyi almak için 3. ve 4. adımı yineleyin.
SQLParamData'yı yeniden çağır. SQL_PARAM_DATA_AVAILABLE dışında bir şey döndürürse, alınacak başka akış parametresi verisi yoktur ve dönüş kodu, yürütülen sonraki deyimin dönüş kodu olur.
SQL_NO_DATA döndürene kadar sonraki parametre kümesini işlemek için SQLMoreResults'u çağırın. SQL_ATTR_PARAMSET_SIZE deyimi özniteliği 1 olarak ayarlandıysa SQLMoreResults bu örnekte SQL_NO_DATA döndürür. Aksi takdirde SQLMoreResults , sonraki parametre kümesinin alınması için kullanılabilir akışlı çıkış parametreleri olduğunu belirtmek üzere SQL_PARAM_DATA_AVAILABLE döndürür.
DAE giriş parametresine benzer şekilde, SQLBindParameter'daParameterValuePtr bağımsız değişkeninde kullanılan belirteç (1. adım), parametrenin sırasını ve gerekirse uygulamaya özgü daha fazla bilgiyi içeren bir uygulama veri yapısına işaret eden bir işaretçi olabilir.
Döndürülen akışlı çıkışın veya giriş/çıkış parametrelerinin sırası sürücüye özgüdür ve her zaman sorguda belirtilen sırayla aynı olmayabilir.
Uygulama 4. adımda SQLGetData'yı çağırmazsa parametre değeri atılır. Benzer şekilde, bir parametre değerinin tümü SQLGetData tarafından okunmadan önce uygulama SQLParamData'yı çağırırsa, değerin geri kalanı atılır ve uygulama sonraki parametreyi işleyebilir.
Tüm akışlı çıkış parametreleri işlenmeden önce uygulama SQLMoreResults'ı çağırırsa (SQLParamData hala SQL_PARAM_DATA_AVAILABLE döndürmüyor), kalan tüm parametreler atılır. Benzer şekilde, bir parametre değerinin tümü SQLGetData tarafından okunmadan önce uygulama SQLMoreResults'ı çağırırsa, değerin kalanı ve kalan tüm parametreler atılır ve uygulama sonraki parametre kümesini işlemeye devam edebilir.
Bir uygulamanın hem SQLBindParameter hem de SQLGetData'da C veri türünü belirtebileceğini unutmayın. SQLGetData ile belirtilen C veri türü, SQLGetData'da belirtilen C veri türü SQL_APD_TYPE olmadığı sürece SQLBindParameter'da belirtilen C veri türünü geçersiz kılar.
Akışlı çıkış parametresi, çıktı parametresinin veri türü BLOB türünde olduğunda daha kullanışlı olsa da, bu işlev herhangi bir veri türüyle de kullanılabilir. Akış çıkış parametreleri tarafından desteklenen veri türleri sürücüde belirtilir.
İşlenecek SQL_PARAM_INPUT_OUTPUT_STREAM parametre varsa, SQLExecute veya SQLExecDirect önce SQL_NEED_DATA döndürür. Bir uygulama, DAE parametre verilerini göndermek için SQLParamData ve SQLPutData'yı çağırabilir. Tüm DAE giriş parametreleri işlendiğinde SQLParamData , akışlı çıkış parametrelerinin kullanılabilir olduğunu göstermek için SQL_PARAM_DATA_AVAILABLE döndürür.
İşlenecek akışlı çıkış parametreleri ve ilişkili çıkış parametreleri olduğunda, sürücü çıkış parametrelerini işleme sırasını belirler. Bu nedenle, bir çıkış parametresi arabelleğe bağlıysa (InputOutputTypeSQLBindParameter parametresi SQL_PARAM_INPUT_OUTPUT veya SQL_PARAM_OUTPUT olarak ayarlandıysa), SQLParamData SQL_SUCCESS veya SQL_SUCCESS_WITH_INFO döndürene kadar arabellek doldurulamayabilir. Bir uygulama, ilişkili arabelleği yalnızca SQLParamData tüm akışlı çıkış parametreleri işlendikten sonra SQL_SUCCESS veya SQL_SUCCESS_WITH_INFO döndürdüğünde okumalıdır.
Veri kaynağı, akışlı çıkış parametresine ek olarak bir uyarı ve sonuç kümesi döndürebilir. Genel olarak, uyarılar ve sonuç kümeleri SQLMoreResults çağrılarak akışlı çıkış parametresinden ayrı olarak işlenir. Akış çıkış parametresini işlemeden önce uyarıları ve sonuç kümesini işleyin.
Aşağıdaki tabloda, sunucuya gönderilen tek bir komutun farklı senaryoları ve uygulamanın nasıl çalışması gerektiği açıklanmaktadır.
| Scenario | SQLExecute veya SQLExecDirect'ten değer döndürme | Sonraki adım |
|---|---|---|
| Veriler yalnızca akışlı çıkış parametrelerini içerir | SQL_PARAM_DATA_AVAILABLE | Akışlı çıkış parametrelerini almak için SQLParamData ve SQLGetData kullanın. |
| Veriler bir sonuç kümesi ve akışlı çıkış parametreleri içerir | SQL_SUCCESS |
SQLBindCol ve SQLGetData ile sonuç kümesini alın. Akışlı çıkış parametrelerini işlemeye başlamak için SQLMoreResults'u çağırın. SQL_PARAM_DATA_AVAILABLE döndürmelidir. Akışlı çıkış parametrelerini almak için SQLParamData ve SQLGetData kullanın. |
| Veriler bir uyarı iletisi ve akışlı çıkış parametreleri içerir | SQL_SUCCESS_WITH_INFO | Uyarı iletilerini işlemek için SQLGetDiagRec ve SQLGetDiagField kullanın. Akışlı çıkış parametrelerini işlemeye başlamak için SQLMoreResults'u çağırın. SQL_PARAM_DATA_AVAILABLE döndürmelidir. Akışlı çıkış parametrelerini almak için SQLParamData ve SQLGetData kullanın. |
| Veriler bir uyarı iletisi, sonuç kümesi ve akışlı çıkış parametreleri içerir | SQL_SUCCESS_WITH_INFO (Bilgi ile Başarı) | Uyarı iletilerini işlemek için SQLGetDiagRec ve SQLGetDiagField kullanın. Ardından sonuç kümesini işlemeye başlamak için SQLMoreResults'u çağırın. SQLBindCol ve SQLGetData ile bir sonuç kümesi alın. Akışlı çıkış parametrelerini işlemeye başlamak için SQLMoreResults'u çağırın. SQLMoreResults SQL_PARAM_DATA_AVAILABLE döndürmelidir. Akışlı çıkış parametrelerini almak için SQLParamData ve SQLGetData kullanın. |
| DAE giriş parametreleriyle sorgulama, örneğin akışlı giriş/çıkış (DAE) parametresi | SQL VERİ_GEREKİYOR | DAE giriş parametresi verilerini göndermek için SQLParamData ve SQLPutData'yı çağırın. Tüm DAE giriş parametreleri işlendikten sonra SQLParamData, SQLExecute ve SQLExecDirect'in döndürebileceği herhangi bir dönüş kodu döndürebilir. Bu tablodaki durumlar daha sonra uygulanabilir. Dönen kod SQL_PARAM_DATA_AVAILABLE ise, akış yapılan çıkış parametreleri kullanılabilir. Bir uygulamanın, bu tablonun ilk satırında açıklandığı gibi akış çıkış parametresinin belirtecini almak için SQLParamData'yı yeniden çağırması gerekir. Dönüş kodu SQL_SUCCESS ise, işlenecek bir sonuç kümesi vardır veya işleme tamamlanmıştır. Eğer dönüş kodu SQL_SUCCESS_WITH_INFO ise, işlenmesi gereken uyarı iletileri vardır. |
SQLExecute, SQLExecDirect veya SQLMoreResults SQL_PARAM_DATA_AVAILABLE döndürdüğünde, bir uygulama aşağıdaki listede olmayan bir işlevi çağırırsa işlev dizisi hatası oluşur:
SQLAllocHandle / SQLAllocHandleStd
SQLDataSources / SQLDrivers
Sqlgetınfo / SQLGetFunctions
SQLGetConnectAttr / SQLGetEnvAttr / SQLGetDescField / SQLGetDescRec
SQLNumParams
Sqldescribeparam
SQLNativeSql
Sqlparamdata
Sqlmoreresults
Sqlgetdiagfield / Sqlgetdiagrec
SQLCancel
SQLCancelHandle (statement handle ile)
SQLFreeStmt (Option = SQL_CLOSE, SQL_DROP veya SQL_UNBIND olduğunda)
SQLCloseCursor
SQLDisconnect
SQLFreeHandle (HandleType = SQL_HANDLE_STMT ile)
SQLGetStmtAttr
Uygulamalar bağlama bilgilerini ayarlamak için SQLSetDescField veya SQLSetDescRec kullanmaya devam edebilir. Alan eşlemesi değiştirilmez. Ancak, tanımlayıcı içindeki alanlar yeni değerler döndürebilir. Örneğin, SQL_DESC_PARAMETER_TYPE SQL_PARAM_INPUT_OUTPUT_STREAM veya SQL_PARAM_OUTPUT_STREAM döndürebilir.
Kullanım Senaryosu: Sonuç Kümesinden Parçalar Halinde Görüntü Alma
SQLGetData, bir saklı yordamın bir görüntü hakkında tek bir meta veri satırı içeren bir sonuç kümesi döndürmesi ve görüntünün büyük bir çıkış parametresiyle döndürülmesi durumunda, verileri parça parça almak için kullanılabilir.
// CREATE PROCEDURE SP_TestOutputPara
// @ID_of_picture as int,
// @Picture as varbinary(max) out
// AS
// output the image data through streamed output parameter
// GO
BOOL displayPicture(SQLUINTEGER idOfPicture, SQLHSTMT hstmt) {
SQLLEN lengthOfPicture; // The actual length of the picture.
BYTE smallBuffer[100]; // A very small buffer.
SQLRETURN retcode, retcode2;
// Bind the first parameter (input parameter)
SQLBindParameter(
hstmt,
1, // The first parameter.
SQL_PARAM_INPUT, // Input parameter: The ID_of_picture.
SQL_C_ULONG, // The C Data Type.
SQL_INTEGER, // The SQL Data Type.
0, // ColumnSize is ignored for integer.
0, // DecimalDigits is ignored for integer.
&idOfPicture, // The Address of the buffer for the input parameter.
0, // BufferLength is ignored for integer.
NULL); // This is ignored for integer.
// Bind the streamed output parameter.
SQLBindParameter(
hstmt,
2, // The second parameter.
SQL_PARAM_OUTPUT_STREAM, // A streamed output parameter.
SQL_C_BINARY, // The C Data Type.
SQL_VARBINARY, // The SQL Data Type.
0, // ColumnSize: The maximum size of varbinary(max).
0, // DecimalDigits is ignored for binary type.
(SQLPOINTER)2, // ParameterValuePtr: An application-defined
// token (this will be returned from SQLParamData).
// In this example, we used the ordinal
// of the parameter.
0, // BufferLength is ignored for streamed output parameters.
&lengthOfPicture); // StrLen_or_IndPtr: The status variable returned.
retcode = SQLPrepare(hstmt, L"{call SP_TestOutputPara(?, ?)}", SQL_NTS);
if ( retcode == SQL_ERROR )
return FALSE;
retcode = SQLExecute(hstmt);
if ( retcode == SQL_ERROR )
return FALSE;
// Assume that the retrieved picture exists. Use SQLBindCol or SQLGetData to retrieve the result-set.
// Process the result set and move to the streamed output parameters.
retcode = SQLMoreResults( hstmt );
// SQLGetData retrieves and displays the picture in parts.
// The streamed output parameter is available.
while (retcode == SQL_PARAM_DATA_AVAILABLE) {
SQLPOINTER token; // Output by SQLParamData.
SQLLEN cbLeft; // #bytes remained
retcode = SQLParamData(hstmt, &token); // returned token is 2 (according to the binding)
if ( retcode == SQL_PARAM_DATA_AVAILABLE ) {
// A do-while loop retrieves the picture in parts.
do {
retcode2 = SQLGetData(
hstmt,
(UWORD) token, // the value of the token is the ordinal.
SQL_C_BINARY, // The C-type.
smallBuffer, // A small buffer.
sizeof(smallBuffer), // The size of the buffer.
&cbLeft); // How much data we can get.
}
while ( retcode2 == SQL_SUCCESS_WITH_INFO );
}
}
return TRUE;
}
Kullanım Senaryosu: Akışlı Giriş/Çıkış Parametresi Olarak Büyük Bir Nesne Gönderme ve Alma
SQLGetData, saklı yordam büyük bir nesneyi giriş/çıkış parametresi olarak geçirdiğinde ve değeri veritabanına ve veritabanından akışla aktardığında, veriyi parçalar halinde almak ve göndermek için kullanılabilir. Tüm verileri bellekte depolamanız gerekmez.
// CREATE PROCEDURE SP_TestInOut
// @picture as varbinary(max) out
// AS
// output the image data through output parameter
// go
BOOL displaySimilarPicture(BYTE* image, ULONG lengthOfImage, SQLHSTMT hstmt) {
BYTE smallBuffer[100]; // A very small buffer.
SQLRETURN retcode, retcode2;
SQLLEN statusOfPicture;
// First bind the parameters, before preparing the statement that binds the output streamed parameter.
SQLBindParameter(
hstmt,
1, // The first parameter.
SQL_PARAM_INPUT_OUTPUT_STREAM, // I/O-streamed parameter: The Picture.
SQL_C_BINARY, // The C Data Type.
SQL_VARBINARY, // The SQL Data Type.
0, // ColumnSize: The maximum size of varbinary(max).
0, // DecimalDigits is ignored.
(SQLPOINTER)1, // An application defined token.
0, // BufferLength is ignored for streamed I/O parameters.
&statusOfPicture); // The status variable.
statusOfPicture = SQL_DATA_AT_EXEC; // Input data in parts (DAE parameter at input).
retcode = SQLPrepare(hstmt, L"{call SP_TestInOut(?) }", SQL_NTS);
if ( retcode == SQL_ERROR )
return FALSE;
// Execute the statement.
retcode = SQLExecute(hstmt);
if ( retcode == SQL_ERROR )
return FALSE;
if ( retcode == SQL_NEED_DATA ) {
// Use SQLParamData to loop through DAE input parameters. For
// each, use SQLPutData to send the data to database in parts.
// This example uses an I/O parameter with streamed output.
// Therefore, the last call to SQLParamData should return
// SQL_PARAM_DATA_AVAILABLE to indicate the end of the input phrase
// and report that a streamed output parameter is available.
// Assume retcode is set to the return value of the last call to
// SQLParamData, which is equal to SQL_PARAM_DATA_AVAILABLE.
}
// Start processing the streamed output parameters.
while ( retcode == SQL_PARAM_DATA_AVAILABLE ) {
SQLPOINTER token; // Output by SQLParamData.
SQLLEN cbLeft; // #bytes remained
retcode = SQLParamData(hstmt, &token);
if ( retcode == SQL_PARAM_DATA_AVAILABLE ) {
do {
retcode2 = SQLGetData(
hstmt,
(UWORD) token, // the value of the token is the ordinal.
SQL_C_BINARY, // The C-type.
smallBuffer, // A small buffer.
sizeof(smallBuffer), // The size of the buffer.
&cbLeft); // How much data we can get.
}
while ( retcode2 == SQL_SUCCESS_WITH_INFO );
}
}
return TRUE;
}