说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

ODBC调用sql server 2005 存储过程出错,请大家帮忙看下,给点意见,谢谢。在线等。

编辑:说三道四文库 发布时间:2018-04-22 07:14
HTML文档下载 WORD文档下载 PDF文档下载
通过odbc调用sql server 2005的存储过程,执行一直失败,错误信息:[Microsoft][SQL Native Client]无效的参数类型,S1105, 大家帮忙看看是什么问题。 

代码如下: 

    RETCODE            ret; 
    SQLINTEGER          char_type_input_code = SQL_NTS; 
    SQLINTEGER          cbEnv                = 0; 
    SQLINTEGER          cbCause; 
    
    S32                dwNodeID = 0; 
    S8                  szName[256]; 
    
    S32                iErrCode            = ROK; 

    strcpy(szName, "root"); 

        ret = SQLPrepare(p_stTdatxt->hstmt,(SQLCHAR*) "{?=call p_add_node(?,?)}", SQL_NTS); 

ret = SQLBindParameter(p_stTdatxt->hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, 
            SQL_INTEGER, 0, 0, &dwNodeID, 0, &cbEnv); 

        
ret = SQLBindParameter(p_stTdatxt->hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, 
            SQL_CHAR, TDA_NAME_STANDARD_LENGTH, 0, &>szName, 0, &char_type_input_code); 

//前面的一直是正确执行的。 
//一直到这里执行语句的时候出错。 
        ret = SQLExecute(p_stTdatxt->hstmt); 

        执行结果一直是-1,odbc里面的错误消息提示:[Microsoft][SQL Native Client]无效的参数类型,S1105 

存储过程如下: 

      ALTER PROCEDURE [dbo].[p_add_node] 

@NODE_PID Int, 
@NODE_NAME Varchar(256) 

AS 
INSERT INTO t_testsuit_catalog_treenode 

node_pid, 
node_name 

VALUES 

@NODE_PID, 
@NODE_NAME 
)
第二个参数类型是SQL_VARCHAR,不是SQL_CHAR
UP
引用 1 楼 hhyttppd 的回复:
第二个参数类型是SQL_VARCHAR,不是SQL_CHAR


吼吼
引用楼主 magicianchar 的帖子:
通过odbc调用sql server 2005的存储过程,执行一直失败,错误信息:[Microsoft][SQL Native Client]无效的参数类型,S1105, 大家帮忙看看是什么问题。 

代码如下: 

    RETCODE            ret; 
    SQLINTEGER          char_type_input_code = SQL_NTS; 
    SQLINTEGER          cbEnv                = 0; 
    SQLINTEGER          cbCause; 
    
    S32                dwNodeID = 0; 
    S8             …

参数类型写错了 SQL_VARCHAR不是SQL_CHAR 给LZ一个详细点的连SQL方法

int MiMSSqlODBCConnect(const char *pInstName, const char *pUser,
                       const char *pPWD, SQLHENV &henv, SQLHDBC &hdbc)
{
    SQLRETURN   hRecode;
    char        szConnOption[1024];
    SQLCHAR     szConnStrOut[1024];    
    SQLSMALLINT cbConnStrOut = 0;
    int         nRet = WAVETOP_BACKUP_OK;
    
    /* Allocate environment handle */
    hRecode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);    
    if (hRecode != SQL_SUCCESS && hRecode != SQL_SUCCESS_WITH_INFO) {
        SLogErrorWrite(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, NULL,
            "MiMSSqlConnect: SQLAllocHandle failed");
        nRet = WAVETOP_BACKUP_INVALID_SYNTAX;
        goto CLEANUP;
    }
    
    /* Set the ODBC version environment attribute */
    hRecode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);        
    if (hRecode != SQL_SUCCESS &&
        hRecode != SQL_SUCCESS_WITH_INFO) {
        SLogErrorWrite(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, NULL,
            "MiMSSqlConnect: SQLSetEnvAttr failed");
        nRet = WAVETOP_BACKUP_INVALID_SYNTAX;
        goto CLEANUP;
    }
    
    /* Allocate connection handle */
    hRecode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);    
    if (hRecode != SQL_SUCCESS && hRecode != SQL_SUCCESS_WITH_INFO) {
        SLogErrorWrite(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, NULL,
            "MiMSSqlConnect: SQLAllocHandle failed");
        nRet = WAVETOP_BACKUP_INVALID_SYNTAX;
        goto CLEANUP;
    }
    
    /* Set login timeout to 3 seconds. */
    SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (void*)3, 0);
    
    /* connect string */
    if (stricmp(pInstName, "MSSQLServer") == 0) {      
        _snprintf(szConnOption, sizeof(szConnOption), "DRIVER={SQL Server};"
            "server=%s;uid=%s;pwd=%s", 
            g_MiGlobalConf.szHostIP, pUser, pPWD);
    }
    else {
        _snprintf(szConnOption, sizeof(szConnOption), "DRIVER={SQL Server};"
            "server=%s\\%s;uid=%s;pwd=%s", 
            g_MiGlobalConf.szHostIP, pInstName, pUser, pPWD);
    }
    
    /* Connect to data source */
    hRecode = SQLDriverConnect(hdbc, 
        NULL,
        (unsigned char *)szConnOption,
        SQL_NTS,
        szConnStrOut,
        sizeof(szConnStrOut),
        &cbConnStrOut,
        SQL_DRIVER_NOPROMPT);
    
    if (hRecode != SQL_SUCCESS && hRecode != SQL_SUCCESS_WITH_INFO) {
        SLogErrorWrite(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, NULL,
            "MiMSSqlConnect: SQLDriverConnect failed");
        nRet = WAVETOP_BACKUP_INVALID_SYNTAX;
        goto CLEANUP;
    }    
    
    return nRet;
    
CLEANUP: 
    MiMSSqlODBCClear(henv, hdbc);
    return nRet;
}

void MiMSSqlODBCClear(SQLHENV &henv, SQLHDBC &hdbc)
{
    if (hdbc != SQL_NULL_HDBC) {
        SQLDisconnect(hdbc);
        SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
        hdbc = SQL_NULL_HDBC;
    }
    if (henv != SQL_NULL_HENV) {
        SQLFreeHandle(SQL_HANDLE_ENV, henv);
        henv = SQL_NULL_HENV;
    }
}
恩,sql_varchar和sql_char都是通用的。
错误的原因是因为调用存储过程的时候前面多了一个“?”。

引用 1 楼 hhyttppd 的回复:
第二个参数类型是SQL_VARCHAR,不是SQL_CHAR


在odbc 3.*的版本应该是不影响使用的,只是和数据库的具体存储方式有关。
就这样结贴了,分数就大家均分好了。
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘