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 字段不正确或语法错误

解决方案 »

  1.   

    cast(%s as varbinary(MAX_EMS_SIZE)),很笨的方法,不要笑我,没办法,被逼得没办法。
    CRecordset 里也没找到合适的方法。不知怎么搞,一头雾水。
      

  2.   

    使用执行中的数据 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   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.
      

  3.   

    这个是插入数据到数据库中的例子#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);
       }
      

  4.   

    非常感谢Hg
    尤其是第二段
    只是不明白从那里定义的
    SQLINTEGER    SQLUINTEGER SQLPOINTER   SQLCHAR SQLRETURN    SQLHSTMT  
    这些类型,msdn里查不到呀,sql的帮助里也查不到
    需要加头文件吗
      

  5.   

    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 有什么区别呀