📄 mfc odbc下将二进制数据压入数据库字段 .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 + -