SQLPutData İşlevi

Uygunluk
Kullanıma Sunulan Sürüm: ODBC 1.0 Standartları Uyumluluğu: ISO 92

Summary
SQLPutData , bir uygulamanın bir parametre veya sütun için veriyi sürücüye ifade yürütme zamanında göndermesine olanak tanır. Bu fonksiyon, karakter, ikili veya veri kaynağına özgü bir veri tipine (örneğin, SQL_LONGVARBINARY veya SQL_LONGVARCHAR türlerinin parametreleri) sahip bir sütuna karakter veya ikili veri değerlerini parçalar halinde göndermek için kullanılabilir. SQLPutData , temel sürücü Unicode verisini desteklemese bile, Unicode C veri tipine bağlanmayı destekler.

Syntax

  
SQLRETURN SQLPutData(  
      SQLHSTMT     StatementHandle,  
      SQLPOINTER   DataPtr,  
      SQLLEN       StrLen_or_Ind);  

Arguments

StatementHandle
[Giriş] Deyim tanıtıcısı.

DataPtr
[Giriş] Parametre veya sütunun gerçek verilerini içeren bir tampona işaretçi. Veri, SQLBindParametri'ninValueType argümanında (parametre verileri için) veya SQLBindCol'unTargetType argümanında (sütun verileri için) belirtilen C veri tipinde olmalıdır.

StrLen_or_Ind
[Giriş] *DataPtr. SQLPutData'ya yapılan çağrıda gönderilen veri miktarını belirtir. Veri miktarı, belirli bir parametre veya sütun için yapılan her çağrıda değişebilir. StrLen_or_Ind , aşağıdaki koşullardan birini karşılamadıkça göz ardı edilir:

  • StrLen_or_Ind SQL_NTS, SQL_NULL_DATA ya da SQL_DEFAULT_PARAM.

  • SQLBindParameter veya SQLBindCol'da belirtilen C veri tipi SQL_C_CHAR veya SQL_C_BINARY'dir.

  • C veri tipi SQL_C_DEFAULT ve belirtilen SQL veri tipi için varsayılan C veri tipi SQL_C_CHAR veya SQL_C_BINARY'dir.

Diğer tüm C veri türleri için, eğer StrLen_or_Ind SQL_NULL_DATA veya SQL_DEFAULT_PARAM değilse, sürücü *DataPtr tamponunun boyutunun ValueType veya TargetType ile belirtilen C veri tipinin boyutu olduğunu varsayar ve tüm veri değerini gönderir. Daha fazla bilgi için, Ek D'deki Veri Türleri bölümünde C'den SQL Veri Tiplerine Dönüştürülebilir (Veri Türleri) bölümüne bakınız.

İadeler

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR ya da SQL_INVALID_HANDLE.

Diagnostics

SQLPutData SQL_ERROR veya SQL_SUCCESS_WITH_INFO döndürdüğünde, ilişkili bir SQLSTATE değeri alınabilir; bu değer SQLGetDiagRec çağrılarak SQL_HANDLE_STMT HandleType ve StatementHandleHandle'ı ile elde edilebilir. Aşağıdaki tablo, SQLPutData tarafından sıkça duygulanan SQLSTATE değerlerini listeler ve her birini bu fonksiyon bağlamında açıklar; "(DM)" gösterimi, Sürücü Yöneticisi tarafından döndürülen SQLSTATE açıklamalarından önce gelir. Aksi belirtilmediği sürece, her SQLSTATE değeriyle ilişkili dönüş kodu SQL_ERROR.

SQLSTATE Error Description
01000 Genel uyarı Sürücüye özgü bilgilendirici ileti. (İşlev SQL_SUCCESS_WITH_INFO döndürür.)
01004 Dize verileri, sağ kesilmiş Bir çıkış parametresi için dönerken, boş karakter veya NULL olmayan ikili verilerin kesilmesine yol açar. Bir dize değeriyse, sağ kesilmiştir. (İşlev SQL_SUCCESS_WITH_INFO döndürür.)
07006 Kısıtlanmış veri türü özniteliği ihlali İlişkili parametre için SQLBindParameter'daki ValueType bağımsız değişkeni tarafından tanımlanan veri değeri , SQLBindParameter'dakiParameterType bağımsız değişkeni tarafından tanımlanan veri türüne dönüştürülemedi.
07S01 Varsayılan parametrenin geçersiz kullanımı SQLBindParameter ile ayarlanan parametre değeri SQL_DEFAULT_PARAM ve karşılık gelen parametrenin varsayılan değeri yoktu.
08S01 İletişim bağlantısı hatası sürücü ile sürücünün bağlandığı veri kaynağı arasındaki iletişim bağlantısı, işlev işlenmeden önce başarısız oldu.
22001 Dize verileri, sağa kesme Bir karakter veya ikili değerin bir sütuna atanması, boş (karakter) veya null olmayan (ikili) karakterlerin veya baytların kesilmesine yol açardı.

SQLGetInfo'daki SQL_NEED_LONG_DATA_LEN bilgi tipi "Y" idi ve uzun bir parametre için (veri tipi SQL_LONGVARCHAR, SQL_LONGVARBINARY veya uzun veri kaynağına özgü veri türü) SQLBindParameter'dekiStrLen_or_IndPtr argümanında belirtilenden daha fazla veri gönderiliyordu.

SQLGetInfo'daki SQL_NEED_LONG_DATA_LEN bilgi tipi "Y" idi ve uzun bir sütun için (veri tipi SQL_LONGVARCHAR, SQL_LONGVARBINARY veya uzun veri kaynağına özgü veri tipi idi) daha fazla veri gönderilirdi; bu veri sayısı SQLBulkOperations ile eklenen veya güncellenen ya da SQLSetPos ile güncellenen bir veri sütununa karşılık gelir.
22003 Sayısal değer aralık dışında Bağlı sayısal parametre veya sütun için gönderilen veriler, ilgili tablo sütununa atandığında tüm (kesirli değil) kısmının kısaltılmasına neden olurdu.

Bir veya daha fazla giriş/çıkış veya çıkış parametresi için sayısal bir değer (sayısal veya dize olarak) döndürülmek, sayının tamamının (kesirlinin aksine) kesilmesine neden olabilir.
22007 Geçersiz tarih saat biçimi Bir tarih, saat veya zaman damgası yapısına bağlı bir parametre veya sütun için gönderilen veriler, sırasıyla geçersiz bir tarih, saat veya zaman damgasıydı.

Giriş/çıkış veya çıkış parametresi bir tarih, saat veya zaman damgası C yapısına bağlıydı ve döndürülen parametredeki bir değer sırasıyla geçersiz bir tarih, saat veya zaman damgasıydı. (İşlev SQL_SUCCESS_WITH_INFO döndürür.)
22008 Tarih saat alanı taşması Giriş/çıkış veya çıkış parametresi için hesaplanan datetime ifadesi geçersiz olan bir tarih, saat veya zaman damgası C yapısıyla sonuçlandı.
22012 Sıfıra bölme Giriş/çıkış veya çıkış parametresi için hesaplanan aritmetik ifade sıfıra bölünmesine neden oldu.
22015 Aralık alanı taşması Kesin bir sayısal veya aralık sütunu veya parametre için bir aralıklı SQL veri tipine gönderilen veriler, önemli rakamların kaybına neden olurdu.

Veri, birden fazla alana sahip bir aralık sütunu veya parametresi için gönderilir, sayısal veri türüne dönüştürülür ve sayısal veri tipinde temsil edilmiyordu.

Sütun veya parametre verisi için gönderilen veriler aralıklı SQL türüne atanıyordu ve aralıklı SQL tipinde C tipinin değeri temsil edilmiyordu.

Kesin bir sayısal veya aralık C sütunu veya parametresi için C aralığına gönderilen veriler, önemli rakamların kaybına yol açardı.

Sütun veya parametre verisi için gönderilen veriler bir aralık C yapısına atanmış ve bu veri aralık veri yapısında temsil edilmiyordu.
22018 Atama belirtimi için geçersiz karakter değeri C tipi, tam veya yaklaşık bir sayısal, tarih saati veya aralık veri tipiydi; sütunun SQL tipi bir karakter veri tipiydi; ve sütun veya parametredeki değer, sınırlı C tipinin geçerli bir literali değildi.

SQL türü, tam veya yaklaşık bir sayısal, tarih saati veya aralık veri tipiydi; C tipi SQL_C_CHAR; ve sütun veya parametredeki değer, bağlı SQL türünün geçerli bir literali değildi.
HY000 Genel hata Belirli bir SQLSTATE olmayan ve uygulamaya özgü SQLSTATE tanımlanmayan bir hata oluştu. *MessageText arabelleğinde SQLGetDiagRec tarafından döndürülen hata iletisi, hatayı ve nedenini açıklar.
HY001 Bellek ayırma hatası Sürücü, işlevin yürütülmesini veya tamamlanmasını desteklemek için gereken belleği ayıramadı.
HY008 İşlem iptal edildi StatementHandle için zaman uyumsuz işleme etkinleştirildi. İşlev çağrıldı ve yürütme tamamlanmadan önce StatementHandle üzerinde SQLCancel veya SQLCancelHandle çağrıldı. Ardından işlev StatementHandle üzerinde yeniden çağrıldı.

İşlev çağrıldı ve yürütme tamamlanmadan önce, çok iş parçacıklı bir uygulamadaki farklı bir iş parçacığından StatementHandle üzerinde SQLCancel veya SQLCancelHandle çağrıldı.
HY009 Geçersiz null işaretçi kullanımı (DM) DataPtr argümanı bir null pointer'dı ve StrLen_or_Ind argümanı 0, SQL_DEFAULT_PARAM ya da SQL_NULL_DATA değildi.
HY010 İşlev dizisi hatası (DM) Önceki fonksiyon çağrısı SQLPutData veya SQLParamData çağrısı değildi.

(DM) StatementHandle ile ilişkili bağlantı tanıtıcısı için zaman uyumsuz olarak yürütülen bir işlev çağrıldı. Bu asenkron fonksiyon SQLPutData fonksiyonu çağrıldığında hâlâ çalışıyordu.

(DM) SQLExecute, SQLExecDirect veya SQLMoreResults, StatementHandle için çağrıldı ve SQL_PARAM_DATA_AVAILABLE döndürdü. Bu işlev, tüm akış parametreleri için veri alınmadan önce çağrıldı.

(DM) StatementHandle için zaman uyumsuz olarak yürütülen bir işlev (bu işlev değil) çağrıldı ve bu işlev çağrıldığında hala yürütülüyordu.
HY013 Bellek yönetimi hatası Büyük olasılıkla düşük bellek koşulları nedeniyle, temel alınan bellek nesnelerine erişilemediğinden işlev çağrısı işlenemedi.
HY019 Parça halinde gönderilen karakter dışı ve ikili olmayan veriler SQLPutData , bir parametre veya sütun için birden fazla kez çağrıldı ve karakter, ikili veya veri kaynağına özgü veri tipine sahip bir sütuna karakter C verisi göndermek veya karakter, ikili veya veri kaynağına özgü veri tipine sahip bir sütuna ikili C verisi göndermek için kullanılmıyordu.
HY020 Null değeri birleştirmeye çalış SQLPutData SQL_NEED_DATA dönen çağrıdan sonra birden fazla kez çağrıldı ve bu çağrılardan birinde StrLen_or_Ind argümanı SQL_NULL_DATA veya SQL_DEFAULT_PARAM içeriyordu.
HY090 Geçersiz dize veya arabellek uzunluğu DataPtr argümanı null pointer değildi ve StrLen_or_Ind argümanı 0'dan küçüktü ancak SQL_NTS veya SQL_NULL_DATA'e eşit değildi.
HY117 Bilinmeyen işlem durumu nedeniyle bağlantı askıya alındı. Yalnızca bağlantıyı kesme ve salt okunur işlevlere izin verilir. (DM) Askıya alınma durumu hakkında daha fazla bilgi için bkz. SQLEndTran İşlevi.
HYT01 Bağlantı zaman aşımı süresi doldu Veri kaynağı isteği yanıtlamadan önce bağlantı zaman aşımı süresi doldu. Bağlantı zaman aşımı süresi SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT aracılığıyla ayarlanır.
IM001 Sürücü bu işlevi desteklemiyor (DM) StatementHandle ile ilişkili sürücü işlevi desteklemiyor.
IM017 Yoklama zaman uyumsuz bildirim modunda devre dışı bırakıldı Bildirim modeli her kullanıldığında yoklama devre dışı bırakılır.
IM018 SQLCompleteAsync , bu tanıtıcıda önceki zaman uyumsuz işlemi tamamlamak için çağrılmadı. Tanıtıcıdaki önceki işlev çağrısı SQL_STILL_EXECUTING döndürüyorsa ve bildirim modu etkinleştirildiyse, son işlemeyi yapmak ve işlemi tamamlamak için tanıtıcıda SQLCompleteAsync çağrılmalıdır.

Eğer SQLPutData bir SQL ifadesinde bir parametre için veri gönderilirken çağrılırsa, bu ifadeyi çalıştırmak için çağrılan fonksiyon (SQLExecute veya SQLExecDirect) tarafından döndürülebilecek herhangi bir SQLSTATE'i döndürebilir. Eğer bir sütun için veri gönderilirken çağrılırsa, SQLBulkOperations ile güncellenir veya SQLSetPos ile güncellenirse, SQLBulkOperations veya SQLSetPos tarafından döndürülebilecek herhangi bir SQLSTATE'i döndürebilir.

Comments

SQLPutData , iki kullanım için çalıştırma verisi sağlamak için çağrılabilir: SQLExecute veya SQLExecDirect çağrısında kullanılacak parametre verisi, ya da bir satırın SQLBulkOperations çağrısıyla güncellendiğinde veya eklendiğinde veya SQLSetPos çağrısıyla güncellendiğinde kullanılacak sütun verisi.

Bir uygulama hangi veriyi göndermesi gerektiğini belirlemek için SQLParamData çağırdığında, sürücü uygulamanın hangi parametre verisini göndereceğini veya sütun verilerinin nerede bulunabileceğini belirlemek için kullanabileceği bir gösterge döner. Ayrıca SQL_NEED_DATA'yi döndürür; bu, uygulamaya veriyi göndermek için SQLPutData çağırması gerektiğinin göstergesidir. DataPtr argümanında SQLPutData'ya, uygulama parametre veya sütunun gerçek verisini içeren tampona bir işaretçi iletir.

Sürücü SQLPutData için SQL_SUCCESS döndürdüğünde, uygulama tekrar SQLParamData çağırır. SQLParamData daha fazla veri gönderilmesi gerekiyorsa SQL_NEED_DATA döner; bu durumda uygulama tekrar SQLPutData'yı çağırır. Tüm yürütme verisi gönderildiyse SQL_SUCCESS döner. Uygulama daha sonra tekrar SQLParamData'yı çağırır. Sürücü *ValuePtrPtr'de SQL_NEED_DATA ve başka bir gösterge döndürürse, başka bir parametre veya sütun için veri gerektirir ve SQLPutData tekrar çağrılır. Sürücü SQL_SUCCESS dönerse, tüm veri yürütme verisi gönderilmiştir ve SQL ifadesi çalıştırılabilir veya SQLBulkOperations veya SQLSetPos çağrısı işlenebilir.

Veri-uygulamada parametre verisinin ifade yürütme zamanında nasıl iletildiğine dair daha fazla bilgi için, SQLBindParameter içindeki "Parametre Değerlerini Geçirme" ve Uzun Veri Gönderme bölümlerine bakabilirsiniz. Yürütme sütununun verilerinin nasıl güncellendiği veya eklendiği hakkında daha fazla bilgi için SQLSetPos'taki "SQLSetPos Kullanımı", SQLBulkOperations'taki "Yer imleri kullanarak toplu güncellemeler yapma" bölümüne ve Long Data ile SQLSetPos ile SQLBulkOperations bölümlerine bakınız.

Note

Bir uygulama, yalnızca karakter, ikili veya veri kaynağına özgü bir sütuna C karakteri verisi gönderdiğinde veya karakter, ikili veya veri kaynağına özgü veri tipine sahip bir sütuna ikili C verisi gönderdiğinde SQLPutData verilerini parçalar halinde gönderebilir. Eğer SQLPutData başka herhangi bir koşulda birden fazla kez çağrılırsa, SQL_ERROR ve SQLSTATE HY019 (Parça halinde gönderilen karakter olmayan ve ikili olmayan veriler) döner.

Example

Aşağıdaki örnek, Test adlı bir veri kaynağı adını varsaymaktadır. İlgili veritabanında aşağıdaki gibi oluşturabileceğiniz bir tablo olmalıdır:

CREATE TABLE emp4 (NAME char(30), AGE int, BIRTHDAY datetime, Memo1 text)  
// SQLPutData.cpp  
// compile with: odbc32.lib user32.lib  
#include <stdio.h>  
#include <windows.h>  
#include <sqlext.h>  
#include <odbcss.h>  
  
#define TEXTSIZE  12000  
#define MAXBUFLEN 256  
  
SQLHENV henv = SQL_NULL_HENV;  
SQLHDBC hdbc1 = SQL_NULL_HDBC;       
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;  
  
void Cleanup() {  
   if (hstmt1 != SQL_NULL_HSTMT)  
      SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);  
  
   if (hdbc1 != SQL_NULL_HDBC) {  
      SQLDisconnect(hdbc1);  
      SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);  
   }  
  
   if (henv != SQL_NULL_HENV)  
      SQLFreeHandle(SQL_HANDLE_ENV, henv);  
}  
  
int main() {  
   RETCODE retcode;  
  
   // SQLBindParameter variables.  
   SQLLEN cbTextSize, lbytes;  
  
   // SQLParamData variable.  
   PTR pParmID;  
  
   // SQLPutData variables.  
   UCHAR  Data[] =   
      "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"  
      "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"  
      "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"  
      "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"  
      "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"  
      "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"  
      "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"  
      "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"  
      "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"  
      "abcdefghijklmnopqrstuvwxyz";  
  
   SDWORD cbBatch = (SDWORD)sizeof(Data) - 1;  
  
   // Allocate the ODBC environment and save handle.  
   retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);  
   if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {  
      printf("SQLAllocHandle(Env) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Notify ODBC that this is an ODBC 3.0 app.  
   retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);  
   if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {  
      printf("SQLSetEnvAttr(ODBC version) Failed\n\n");  
      Cleanup();  
      return(9);      
   }  
  
   // Allocate ODBC connection handle and connect.  
   retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);  
   if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {  
      printf("SQLAllocHandle(hdbc1) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Sample uses Integrated Security, create SQL Server DSN using Windows NT authentication.   
   retcode = SQLConnect(hdbc1, (UCHAR*)"Test", SQL_NTS, (UCHAR*)"",SQL_NTS, (UCHAR*)"", SQL_NTS);  
   if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLConnect() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Allocate statement handle.  
   retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);  
   if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLAllocHandle(hstmt1) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Set parameters based on total data to send.  
   lbytes = (SDWORD)TEXTSIZE;  
   cbTextSize = SQL_LEN_DATA_AT_EXEC(lbytes);  
  
   // Bind the parameter marker.  
   retcode = SQLBindParameter (hstmt1,           // hstmt  
                               1,                // ipar  
                               SQL_PARAM_INPUT,  // fParamType  
                               SQL_C_CHAR,       // fCType  
                               SQL_LONGVARCHAR,  // FSqlType  
                               lbytes,           // cbColDef  
                               0,                // ibScale  
                               (VOID *)1,        // rgbValue  
                               0,                // cbValueMax  
                               &cbTextSize);     // pcbValue  
  
   if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLBindParameter Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Execute the command.  
   retcode =   
      SQLExecDirect(hstmt1, (UCHAR*)"INSERT INTO emp4 VALUES('Paul Borm', 46,'1950-11-12 00:00:00', ?)", SQL_NTS);  
   if ( (retcode != SQL_SUCCESS) && (retcode != SQL_NEED_DATA) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLExecDirect Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Check to see if NEED_DATA; if yes, use SQLPutData.  
   retcode = SQLParamData(hstmt1, &pParmID);  
   if (retcode == SQL_NEED_DATA) {  
      while (lbytes > cbBatch) {  
         SQLPutData(hstmt1, Data, cbBatch);  
         lbytes -= cbBatch;  
      }  
      // Put final batch.  
      retcode = SQLPutData(hstmt1, Data, lbytes);   
   }  
  
   if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLParamData Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Make final SQLParamData call.  
   retcode = SQLParamData(hstmt1, &pParmID);  
   if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("Final SQLParamData Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Clean up.  
   SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);  
   SQLDisconnect(hdbc1);  
   SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);  
   SQLFreeHandle(SQL_HANDLE_ENV, henv);  
}  
Hakkında bilgi için Bkz:
Bir tamponu bir parametreye bağlama SQLBindParameter Fonksiyonu
Deyim işlemeyi iptal etme SQLCancel İşlevi
SQL ifadesinin yürütülmesi SQLExecDirect Fonksiyonu
Hazırlanmış bir SQL deyimini yürütme SQLExecute İşlevi
Veri göndermek için sonraki parametreyi döndürme SQLParamData İşlevi