⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mfc odbc下将二进制数据压入数据库字段 .txt

📁 MFC访问SQLServer数据库中图片
💻 TXT
字号:
请高手指点,MFC ODBC下将二进制数据压入数据库字段  

darter
金枪鱼  发表于 2005-4-20 22:08:40 [200分]    
--------------------------------------------------------------------------------

在MFC ODBC下,我不想派生记录集绑定字段交换使用CLongBinary类型类处理图形数据,而是想直接使用CRecordset类对象处理数据。


现在假定数据库指针(CDatabase *) pDb已经打开,记录集(CRecordset *)pRs已经打开。二进制数据记录在全局内存块(HGLOBAL) hGlobal处,现已经锁定,并可以通过锁定地址(BYTE *)pPicData访问。图形数据的大小为(DWORD)dwSize。

//进行写操作******************************************************

    //所锁定图形内存数据,以便根据地址读取数据
    BYTE *pPicData = reinterpret_cast<BYTE *> (GlobalLock(hGlobal));
    if (!pPicData)
    {//锁定失败
        TRACE(_T("内存锁定失败!\n"));//调试时提示
        //这里不能释放,因为它是对话框的成员数据
        return FALSE;
    };
   
    BYTE *pBuf = pPicData;//将缓冲地址指向锁定的地址头部
         //??????????????????????????????
            此处怎么办?怎样将数据写入到记录集的图形字段中
         //???????????????????????????????            

        
    
    //解除锁定
    GlobalUnlock(hGlobal);//释放内存的锁定
//****************************************************************

好像有SQLPutData和SQLGetData可以利用,不知道哪位高手用过,请指点。
 

hurtmanzc
马踏飞燕  第1楼 回复于2005-4-22 16:29:54  
--------------------------------------------------------------------------------

SQL Server帮助里的:

如何使用执行中的数据参数 (ODBC)
使用执行中的数据 text、ntext 或 image 参数 

调用 SQLBindParameter 以将某个程序缓冲区与语句参数绑定在一起时: 
使用 SQL_LEN_DATA_AT_EXEC(length) 的 pcbValue,其中 length 是以字节为单位的 text、ntext 或 image 参数数据的总长度。


使用程序定义参数标识符的 rgbValue。 
调用 SQLExecDirect 或 SQLExecute 将返回 SQL_NEED_DATA,这表明执行中的数据参数已准备好进行处理。


对每个执行中的数据参数: 
调用 SQLParamData 以获得程序定义参数 ID。如果还有其它执行中的数据参数,将返回 SQL_NEED_DATA。


一次或多次调用 SQLPutData 以发送参数数据,直到 length 全部送出。 
调用 SQLParamData 以表明最后执行中的数据参数的所有数据已全部送出。不返回 SQL_NEED_DATA。 
示例
本例说明使用 SQLPutData 在执行中的数据文本参数中填充数据的方法。为简化本示例,查错代码已删除。

// Sample ODBC3 console application to write SQL_LONGVARCHAR data
// using SQLPutData.
// Assumes DSN has table:
//  SQLSrvr: CREATE TABLE emp3 (NAME char(30), AGE int, 
//           BIRTHDAY datetime, Memo1 text)

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <odbcss.h>

#define TEXTSIZE   12000

SQLHENV      henv = SQL_NULL_HENV;
SQLHDBC      hdbc1 = SQL_NULL_HDBC;     
SQLHSTMT      hstmt1 = SQL_NULL_HSTMT;

int main() {
   RETCODE retcode;
      
   // SQLBindParameter variables.
   SDWORD      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);
   // Notify ODBC that this is an ODBC 3.0 app.
   retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
                     (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);
   // Allocate ODBC connection handle and connect.
   retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
   retcode = SQLConnect(hdbc1, "MyDSN", SQL_NTS,
                   "sa", SQL_NTS, "MyPassWord", SQL_NTS);
   
   // Allocate statement handle.
   retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);

   // 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

   // Execute the command.
   retcode = SQLExecDirect(hstmt1,
   "INSERT INTO emp3 VALUES('Paul Borm', 46,'1950-11-24 00:00:00', ?)",
                     SQL_NTS);
   // 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.
      SQLPutData(hstmt1, Data, lbytes); 
   }
   else
   {
         ProcessErrorMessages(SQL_HANDLE_STMT, hstmt1,
                     "SQLPutData Failed\n\n");
         return(9);
   }

   // Make final SQLParamData call.
   retcode = SQLParamData(hstmt1, &pParmID);

   /* Clean up. */
   SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
   SQLDisconnect(hdbc1);
   SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
   SQLFreeHandle(SQL_HANDLE_ENV, henv);
   return(0);
}


如何使用执行中的数据列 (ODBC)
使用执行中的数据 text、ntext 或 image 列 

对每个执行中的数据列,在以前由 SQLBindCol 绑定的缓冲区中放入特殊值: 
在 pcbValue 数据值缓冲区中放入 SQL_LEN_DATA_AT_EXEC(length),其中 length 是以字节为单位的 text、ntext 或 image 列数据的总长度。


在 rgbValue 数据长度缓冲区中放入由程序定义的列标识符。 
调用 SQLSetPos 返回 SQL_NEED_DATA,这表明执行中的数据列已准备好进行处理。


对每个执行中的数据列: 
调用 SQLParamData 以获得列数组指针。如果还有其它执行中的数据列,将返回 SQL_NEED_DATA。


一次或多次调用 SQLPutData 以发送列数据,直到 length 全部送出。 
调用 SQLParamData 以表明最后执行中的数据列的所有数据已全部发送。不返回 SQL_NEED_DATA。 
示例
本例说明使用 SQLGetData 从执行中的数据 text 列中检索数据的方法。删除了查错代码以简化本示例。

// Sample ODBC3 console application to read SQL_LONGVARChar
// data using SQLGetData.
// Assumes DSN has table:
//  SQLSrvr: CREATE TABLE emp3 (NAME char(30), AGE int, 
//           BIRTHDAY datetime, Memo1 text)

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <odbcss.h>

#define TEXTSIZE      12000
#define BUFFERSIZE   450

SQLHENV      henv = SQL_NULL_HENV;
SQLHDBC      hdbc1 = SQL_NULL_HDBC;
SQLHSTMT      hstmt1 = SQL_NULL_HSTMT;

int main() {
   RETCODE retcode;
   SWORD   cntr;

   //SQLGetData variables.
   UCHAR   Data[BUFFERSIZE];
   SDWORD   cbBatch = (SDWORD)sizeof(Data)-1;
   SDWORD   cbTxtSize;

   // Clear data array.
   for(cntr = 0; cntr < BUFFERSIZE; cntr++)
      Data[cntr] = 0x00;
   
    // Allocate the ODBC environment and save handle.
   retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
   // Notify ODBC that this is an ODBC 3.0 app.
   retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
                     (SQLPOINTER) SQL_OV_ODBC3,
                     SQL_IS_INTEGER);
   // Allocate ODBC connection handle and connect.
   retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
   retcode = SQLConnect(hdbc1, "MyDSN", SQL_NTS,
                   "sa", SQL_NTS, "MyPassWord, SQL_NTS);
   
   // Allocate statement handle; prepare, then execute command.
   retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
   retcode = SQLExecDirect(hstmt1,
                     "SELECT Memo1 FROM emp3",
                     SQL_NTS);

   // Get first row.
   retcode = SQLFetch(hstmt1);
   // Get the SQL_LONG column.
   cntr = 1;
   do {
      retcode = SQLGetData(hstmt1,   // hstmt
         1,                  // ipar
         SQL_C_CHAR,            // fCType
         Data,               // rgbValue
         cbBatch,               // cbValueMax
         &cbTxtSize);            // pcbValue
      if ( retcode != SQL_NO_DATA ) {
      printf("GetData iteration %d, pcbValue = %d,\n",
            cntr++, cbTxtSize);
      printf("Data = %s\n\n", Data);
      }
   } while (retcode != SQL_NO_DATA);

   /* Clean up. */
   SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
   SQLDisconnect(hdbc1);
   SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
   SQLFreeHandle(SQL_HANDLE_ENV, henv);
   return(0);
} // End Main.


//另外,个人感觉ado访问SQL server很好用呀,并不是只能访问access等数据库呀
//如果感觉效率不够,可以直接操作OLE DB组件对象提供的接口
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -