BYTE *bpData;
BYTE byArray[MAX_EMS_SIZE];
iSize=MAX_EMS_SIZE;
//……取得将二进制数据长度和指针memcpy(byArray,bpData,iSize);
sInsert.Format("insert into %s (%s,%s,%s,%s,%s,%s)values(
cast(%s as varbinary(MAX_EMS_SIZE)),'%s','%s','%s','%s','%s')"
,this->m_clsInitFile.m_structParams.cContentTableName//表名字符串
,this->m_clsInitFile.m_structParams.cContentField
,this->m_clsInitFile.m_structParams.cCategoryField
,this->m_clsInitFile.m_structParams.cKindField ,this->m_clsInitFile.m_structParams.cTypeField
,this->m_clsInitFile.m_structParams.cFileNumberField
,this->m_clsInitFile.m_structParams.cIntroField
,byArray
//,"'bin'"
,"ts","ts","1","001","测试");
提示错误
03-12-10 10:24:35 exec'insert into File (Content,Category,kind,typeID,FileNumber,Intro)values(cast(H??? as varbinary(MAX_EMS_SIZE)),'ts','ts','1','001','测试')':COUNT 字段不正确或语法错误
BYTE byArray[MAX_EMS_SIZE];
iSize=MAX_EMS_SIZE;
//……取得将二进制数据长度和指针memcpy(byArray,bpData,iSize);
sInsert.Format("insert into %s (%s,%s,%s,%s,%s,%s)values(
cast(%s as varbinary(MAX_EMS_SIZE)),'%s','%s','%s','%s','%s')"
,this->m_clsInitFile.m_structParams.cContentTableName//表名字符串
,this->m_clsInitFile.m_structParams.cContentField
,this->m_clsInitFile.m_structParams.cCategoryField
,this->m_clsInitFile.m_structParams.cKindField ,this->m_clsInitFile.m_structParams.cTypeField
,this->m_clsInitFile.m_structParams.cFileNumberField
,this->m_clsInitFile.m_structParams.cIntroField
,byArray
//,"'bin'"
,"ts","ts","1","001","测试");
提示错误
03-12-10 10:24:35 exec'insert into File (Content,Category,kind,typeID,FileNumber,Intro)values(cast(H??? as varbinary(MAX_EMS_SIZE)),'ts','ts','1','001','测试')':COUNT 字段不正确或语法错误
解决方案 »
- CListCtrl给一行加亮后,颜色覆盖图标怎么办?而且图标前面的部分还是没有颜色
- vc html javaScript脚本语言打不开应用程序
- VC++6.0与2000DDK,无法编译驱动,why?
- 关于 WinSock2 可发 SOCK_DGRAM 数据长度问题
- 请问如何在对话框上,所有控件之上贴一幅位图?
- 怎样在对话框上显示矢量图?
- 设断点调试时正确!-直接执行时不正确?? 晕...
- 哪位大俠知道哪里有可下载的VC6 英文 企业版?进来听听我今天卖软件的故事吧!
- MFC单线程问题
- 人在广州且有VC开发经验的人进来
- Windows API 编程的问题。如何精确调整客户区的大小?
- reomat data控件能和recordset之间建立连接吗?
CRecordset 里也没找到合适的方法。不知怎么搞,一头雾水。
在 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 450SQLHENV 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.
SQLINTEGER cbPartID = 0, cbPhotoParam, cbData;
SQLUINTEGER sPartID;
szPhotoFile;
SQLPOINTER pToken, InitValue;
SQLCHAR Data[MAX_DATA_LEN];
SQLRETURN retcode;
SQLHSTMT hstmt;retcode = SQLPrepare(hstmt,
"INSERT INTO PICTURES (PARTID, PICTURE) VALUES
(?, ?)", SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { /* Bind the parameters. For parameter 2, pass */
/* the parameter number in ParameterValuePtr instead of a buffer */
/* address. */ SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG,
SQL_INTEGER, 0, 0, &sPartID, 0, &cbPartID);
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT,
SQL_C_BINARY, SQL_LONGVARBINARY,
0, 0, (SQLPOINTER) 2, 0, &cbPhotoParam); /* Set values so data for parameter 2 will be */
/* passed at execution. Note that the length parameter in */
/* the macro SQL_LEN_DATA_AT_EXEC is 0. This assumes that */
/* the driver returns "N" for the SQL_NEED_LONG_DATA_LEN */
/* information type in SQLGetInfo. */ cbPhotoParam = SQL_LEN_DATA_AT_EXEC(0); sPartID = GetNextID(); /* Get next available employee ID */
/* number. */ retcode = SQLExecute(hstmt); /* For data-at-execution parameters, call SQLParamData to */
/* get the parameter number set by SQLBindParameter. */
/* Call InitUserData. Call GetUserData and SQLPutData */
/* repeatedly to get and put all data for the parameter. */
/* Call SQLParamData to finish processing this parameter */ while (retcode == SQL_NEED_DATA) {
retcode = SQLParamData(hstmt, &pToken);
if (retcode == SQL_NEED_DATA) {
InitUserData((SQLSMALLINT)pToken, InitValue);
while (GetUserData(InitValue, (SQLSMALLINT)pToken, Data,
&cbData))
SQLPutData(hstmt, Data, cbData);
}
}
}VOID InitUserData(sParam, InitValue)
SQLPOINTER InitValue;
{
SQLCHAR szPhotoFile[MAX_FILE_NAME_LEN]; /* Prompt user for bitmap file containing employee */
/* photo. OpenPhotoFile opens the file and returns the */
/* file handle. */ PromptPhotoFileName(szPhotoFile);
OpenPhotoFile(szPhotoFile, (FILE *)InitValue);
break;
}BOOL GetUserData(InitValue, sParam, Data, cbData)
SQLPOINTER InitValue;
SQLCHAR * Data;
SQLINTEGER * cbData;
BOOL Done;{ /* GetNextPhotoData returns the next piece of photo */
/* data and the number of bytes of data returned */
/* (up to MAX_DATA_LEN). */ Done = GetNextPhotoData((FILE *)InitValue, Data,
MAX_DATA_LEN, &cbData);
if (Done) {
ClosePhotoFile((FILE *)InitValue);
return (TRUE);
}
return (FALSE);
}
尤其是第二段
只是不明白从那里定义的
SQLINTEGER SQLUINTEGER SQLPOINTER SQLCHAR SQLRETURN SQLHSTMT
这些类型,msdn里查不到呀,sql的帮助里也查不到
需要加头文件吗
SQLPOINTER InitValue;
{
SQLCHAR szPhotoFile[MAX_FILE_NAME_LEN]; /* Prompt user for bitmap file containing employee */
/* photo. OpenPhotoFile opens the file and returns the */
/* file handle. */ PromptPhotoFileName(szPhotoFile);
OpenPhotoFile(szPhotoFile, (FILE *)InitValue);
break;//???????????????????????????????????????????????????????
}
很奇怪以前没见过,为什么不是return 和return 有什么区别呀