怎么插:我用的是mfc+odbc+sql server 如何将二进制的内容插进数据库?

曹建峰-17年老猿 2003-12-10 10:56:55
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 字段不正确或语法错误

...全文
78 7 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
AkiraChing 2003-12-10
这个是插入数据到数据库中的例子

#define MAX_DATA_LEN 1024
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);
}
  • 打赏
  • 举报
回复
AkiraChing 2003-12-10
使用执行中的数据 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.

  • 打赏
  • 举报
回复
COOL099 2003-12-10
友情UP
  • 打赏
  • 举报
回复
cast(%s as varbinary(MAX_EMS_SIZE)),很笨的方法,不要笑我,没办法,被逼得没办法。
CRecordset 里也没找到合适的方法。不知怎么搞,一头雾水。
  • 打赏
  • 举报
回复
AkiraChing 2003-12-10
在sqltypes.h
  • 打赏
  • 举报
回复
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;//???????????????????????????????????????????????????????
}
很奇怪以前没见过,为什么不是return 和return 有什么区别呀
  • 打赏
  • 举报
回复
非常感谢Hg
尤其是第二段
只是不明白从那里定义的
SQLINTEGER SQLUINTEGER SQLPOINTER SQLCHAR SQLRETURN SQLHSTMT
这些类型,msdn里查不到呀,sql的帮助里也查不到
需要加头文件吗
  • 打赏
  • 举报
回复
相关推荐
发帖
数据库
加入

3968

社区成员

VC/MFC 数据库
社区管理员
  • 数据库
申请成为版主
帖子事件
创建了帖子
2003-12-10 10:56
社区公告
暂无公告