?? mfc odbc下將二進(jìn)制數(shù)據(jù)壓入數(shù)據(jù)庫字段 .txt
字號(hào):
請(qǐng)高手指點(diǎn),MFC ODBC下將二進(jìn)制數(shù)據(jù)壓入數(shù)據(jù)庫字段
darter
金槍魚 發(fā)表于 2005-4-20 22:08:40 [200分]
--------------------------------------------------------------------------------
在MFC ODBC下,我不想派生記錄集綁定字段交換使用CLongBinary類型類處理圖形數(shù)據(jù),而是想直接使用CRecordset類對(duì)象處理數(shù)據(jù)。
現(xiàn)在假定數(shù)據(jù)庫指針(CDatabase *) pDb已經(jīng)打開,記錄集(CRecordset *)pRs已經(jīng)打開。二進(jìn)制數(shù)據(jù)記錄在全局內(nèi)存塊(HGLOBAL) hGlobal處,現(xiàn)已經(jīng)鎖定,并可以通過鎖定地址(BYTE *)pPicData訪問。圖形數(shù)據(jù)的大小為(DWORD)dwSize。
//進(jìn)行寫操作******************************************************
//所鎖定圖形內(nèi)存數(shù)據(jù),以便根據(jù)地址讀取數(shù)據(jù)
BYTE *pPicData = reinterpret_cast<BYTE *> (GlobalLock(hGlobal));
if (!pPicData)
{//鎖定失敗
TRACE(_T("內(nèi)存鎖定失敗!\n"));//調(diào)試時(shí)提示
//這里不能釋放,因?yàn)樗菍?duì)話框的成員數(shù)據(jù)
return FALSE;
};
BYTE *pBuf = pPicData;//將緩沖地址指向鎖定的地址頭部
//??????????????????????????????
此處怎么辦?怎樣將數(shù)據(jù)寫入到記錄集的圖形字段中
//???????????????????????????????
//解除鎖定
GlobalUnlock(hGlobal);//釋放內(nèi)存的鎖定
//****************************************************************
好像有SQLPutData和SQLGetData可以利用,不知道哪位高手用過,請(qǐng)指點(diǎn)。
hurtmanzc
馬踏飛燕 第1樓 回復(fù)于2005-4-22 16:29:54
--------------------------------------------------------------------------------
SQL Server幫助里的:
如何使用執(zhí)行中的數(shù)據(jù)參數(shù) (ODBC)
使用執(zhí)行中的數(shù)據(jù) text、ntext 或 image 參數(shù)
調(diào)用 SQLBindParameter 以將某個(gè)程序緩沖區(qū)與語句參數(shù)綁定在一起時(shí):
使用 SQL_LEN_DATA_AT_EXEC(length) 的 pcbValue,其中 length 是以字節(jié)為單位的 text、ntext 或 image 參數(shù)數(shù)據(jù)的總長度。
使用程序定義參數(shù)標(biāo)識(shí)符的 rgbValue。
調(diào)用 SQLExecDirect 或 SQLExecute 將返回 SQL_NEED_DATA,這表明執(zhí)行中的數(shù)據(jù)參數(shù)已準(zhǔn)備好進(jìn)行處理。
對(duì)每個(gè)執(zhí)行中的數(shù)據(jù)參數(shù):
調(diào)用 SQLParamData 以獲得程序定義參數(shù) ID。如果還有其它執(zhí)行中的數(shù)據(jù)參數(shù),將返回 SQL_NEED_DATA。
一次或多次調(diào)用 SQLPutData 以發(fā)送參數(shù)數(shù)據(jù),直到 length 全部送出。
調(diào)用 SQLParamData 以表明最后執(zhí)行中的數(shù)據(jù)參數(shù)的所有數(shù)據(jù)已全部送出。不返回 SQL_NEED_DATA。
示例
本例說明使用 SQLPutData 在執(zhí)行中的數(shù)據(jù)文本參數(shù)中填充數(shù)據(jù)的方法。為簡化本示例,查錯(cuò)代碼已刪除。
// 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);
}
如何使用執(zhí)行中的數(shù)據(jù)列 (ODBC)
使用執(zhí)行中的數(shù)據(jù) text、ntext 或 image 列
對(duì)每個(gè)執(zhí)行中的數(shù)據(jù)列,在以前由 SQLBindCol 綁定的緩沖區(qū)中放入特殊值:
在 pcbValue 數(shù)據(jù)值緩沖區(qū)中放入 SQL_LEN_DATA_AT_EXEC(length),其中 length 是以字節(jié)為單位的 text、ntext 或 image 列數(shù)據(jù)的總長度。
在 rgbValue 數(shù)據(jù)長度緩沖區(qū)中放入由程序定義的列標(biāo)識(shí)符。
調(diào)用 SQLSetPos 返回 SQL_NEED_DATA,這表明執(zhí)行中的數(shù)據(jù)列已準(zhǔn)備好進(jìn)行處理。
對(duì)每個(gè)執(zhí)行中的數(shù)據(jù)列:
調(diào)用 SQLParamData 以獲得列數(shù)組指針。如果還有其它執(zhí)行中的數(shù)據(jù)列,將返回 SQL_NEED_DATA。
一次或多次調(diào)用 SQLPutData 以發(fā)送列數(shù)據(jù),直到 length 全部送出。
調(diào)用 SQLParamData 以表明最后執(zhí)行中的數(shù)據(jù)列的所有數(shù)據(jù)已全部發(fā)送。不返回 SQL_NEED_DATA。
示例
本例說明使用 SQLGetData 從執(zhí)行中的數(shù)據(jù) text 列中檢索數(shù)據(jù)的方法。刪除了查錯(cuò)代碼以簡化本示例。
// 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.
//另外,個(gè)人感覺ado訪問SQL server很好用呀,并不是只能訪問access等數(shù)據(jù)庫呀
//如果感覺效率不夠,可以直接操作OLE DB組件對(duì)象提供的接口
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -