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

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

编辑:说三道四文库 发布时间:2018-01-22 12:27
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.*的版本应该是不影响使用的,只是和数据库的具体存储方式有关。
就这样结贴了,分数就大家均分好了。
超棒的30款JS类库和工具 立场坚定:惠普仍然密谋回到智能手机市场 6月份浏览器份额:Chrome成市场份额增长最快浏览器 关于PHP的十大误解 你中了几个? 专访西电朱虎明:异构计算硬件架构呈现百花齐放 百家争鸣 关于scrollview视图的刷新问题求教 用递归实现回文不知道这样想是否提高了执行速度请高手点正 一个不明白的错误,如何解决? 感谢cockhorse!!!!!!!! SCJD: 这是怎么回事? 取某一路径下的类似文件名(50) 提取字符串中第三个字符的方法是什么? awt中的滚动问题。 下载工具之间会有速度上的差异吗,比如蚂蚁和其他的比起来.哪个更快些. 有一筐鸡蛋,每3个数一次,最后剩1个 ;每5个数一 一筐鸡蛋,3个3地数,最后多一个,5个5个地数,多 一筐鸡蛋,边框重25千克,取出蛋的2/3后,边框重 小红的爸爸开了一个水果商店,一天他买回大小两筐苹果 小红的爸爸开了一个水果商店,一天他买回大小两筐苹果 一筐苹果连筐重20千克,卖了20%后连筐重16.4 一筐苹果连筐重二十千克卖了20%后还剩16.4千克 一筐苹果连筐重20千克,卖了苹果的百分之20后连筐 一筐苹果连筐重20千克,卖了20%后连筐16.4千 普京签署新反恐法:恐怖分子造成损失由美国“粮票”遭削减 部分人将失去领取叙外交部称美要巴沙尔离职发言无益日内朴槿惠称日对历史态度若不变 召开峰会伊拉克总理访美寻求武器技术支持 防内意大利与荷兰将分享安理会非常任理事国济南今年6月才3个高温天!高温日再失老兵回忆维和经历:历经战乱方知和平可白衣萧何红裙虞姬 舞台惊艳舞艺惊人热心群众不捡钞票穷追擒窃贼武尊仙帝权御天下位面军阀心唤王者末世星缘洛阳伊河旅游黄帝城旅游夷陵长江大桥旅游溱湖湿地公园旅游石头记矿物园旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘