如何在代码中通过 ODBC 连接到 Teradata?
How do I connect to a Teradata via ODBC in code?
指定的连接字符串是:
Provider=Teradata;DBCName=dbc_name;数据库=database_name; uid=user_name;Pwd=密码;
我安装了 Teradata ODBC 客户端版本 15.1 并通过控制面板设置了与它的连接。
使用代码时:
#include "stdafx.h"
#include <Windows.h>
#include <sql.h>
#include <sqlext.h>
#include <string>
int _tmain(int argc, _TCHAR* argv[])
{
SQLHANDLE hdbc = SQL_NULL_HANDLE;
SQLHANDLE henv = SQL_NULL_HANDLE;
SQLRETURN retval = SQL_SUCCESS;
retval = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if (retval != SQL_SUCCESS) {
printf("SQLAllocHandle SQL_HANDLE_ENV failed! Result = %d\n", retval);
}
retval = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
if (retval != SQL_SUCCESS) {
printf("SQLSetEnvAttr SQL_ATTR_ODBC_VERSION failed! Result = %d\n", retval);
}
SQLINTEGER output_nts, autocommit;
retval = SQLGetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, &output_nts, 0, 0);
retval = SQLSetEnvAttr(henv, SQL_ATTR_OUTPUT_NTS, (SQLPOINTER)SQL_TRUE, 0);
if (retval != SQL_SUCCESS) {
printf("SQLSetEnvAttr SQL_ATTR_OUTPUT_NTS failed! Result = %d\n", retval);
}
retval = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if (retval != SQL_SUCCESS) {
printf("SQLAllocHandle SQL_HANDLE_DBC failed! Result = %d\n", retval);
}
SQLCHAR szConn[1024];
SWORD cbConn = 0;
std::string connectionString("Provider=teradata;DBCName=myLocalTDcop;database=myDatabaseName;uid=myUID;pwd=myPwd;");
retval = SQLDriverConnect(hdbc, NULL, (SQLCHAR*)connectionString.c_str(), SQL_NTS, szConn, 1024, &cbConn, SQL_DRIVER_NOPROMPT);
if (retval != SQL_SUCCESS) {
printf("SQLDriverConnect failed! Result = %d\n", retval);
}
}
SQLDriverConnect 命令总是 returns -1.
我是不是连接字符串有问题?
更新:
使用 SQLGetDiagRec 我得到了错误信息:
驱动程序return无效(或无法return)SQL_DRIVER_ODBC_VER:03.80
但是,如果我将 ODBC 版本更改为 SQL_OV_ODBC3_80,则会收到错误消息:
[Microsoft][ODBC 驱动程序管理器] 驱动程序不支持应用程序请求的 ODBC 行为版本(请参阅 SQLSetEnvAttr)。
然后:
驱动程序return无效(或无法return)SQL_DRIVER_ODBC_VER:03.80
与15.10的ODBC版本有关吗?我查看了文档,但看不到指定 ODBC 版本的位置。有没有办法在 Windows 中检查它?
我没有在 Path 环境变量中添加正确的目录!!!!
指定的连接字符串是:
Provider=Teradata;DBCName=dbc_name;数据库=database_name; uid=user_name;Pwd=密码;
我安装了 Teradata ODBC 客户端版本 15.1 并通过控制面板设置了与它的连接。
使用代码时:
#include "stdafx.h"
#include <Windows.h>
#include <sql.h>
#include <sqlext.h>
#include <string>
int _tmain(int argc, _TCHAR* argv[])
{
SQLHANDLE hdbc = SQL_NULL_HANDLE;
SQLHANDLE henv = SQL_NULL_HANDLE;
SQLRETURN retval = SQL_SUCCESS;
retval = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if (retval != SQL_SUCCESS) {
printf("SQLAllocHandle SQL_HANDLE_ENV failed! Result = %d\n", retval);
}
retval = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
if (retval != SQL_SUCCESS) {
printf("SQLSetEnvAttr SQL_ATTR_ODBC_VERSION failed! Result = %d\n", retval);
}
SQLINTEGER output_nts, autocommit;
retval = SQLGetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, &output_nts, 0, 0);
retval = SQLSetEnvAttr(henv, SQL_ATTR_OUTPUT_NTS, (SQLPOINTER)SQL_TRUE, 0);
if (retval != SQL_SUCCESS) {
printf("SQLSetEnvAttr SQL_ATTR_OUTPUT_NTS failed! Result = %d\n", retval);
}
retval = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if (retval != SQL_SUCCESS) {
printf("SQLAllocHandle SQL_HANDLE_DBC failed! Result = %d\n", retval);
}
SQLCHAR szConn[1024];
SWORD cbConn = 0;
std::string connectionString("Provider=teradata;DBCName=myLocalTDcop;database=myDatabaseName;uid=myUID;pwd=myPwd;");
retval = SQLDriverConnect(hdbc, NULL, (SQLCHAR*)connectionString.c_str(), SQL_NTS, szConn, 1024, &cbConn, SQL_DRIVER_NOPROMPT);
if (retval != SQL_SUCCESS) {
printf("SQLDriverConnect failed! Result = %d\n", retval);
}
}
SQLDriverConnect 命令总是 returns -1.
我是不是连接字符串有问题?
更新: 使用 SQLGetDiagRec 我得到了错误信息:
驱动程序return无效(或无法return)SQL_DRIVER_ODBC_VER:03.80
但是,如果我将 ODBC 版本更改为 SQL_OV_ODBC3_80,则会收到错误消息:
[Microsoft][ODBC 驱动程序管理器] 驱动程序不支持应用程序请求的 ODBC 行为版本(请参阅 SQLSetEnvAttr)。
然后:
驱动程序return无效(或无法return)SQL_DRIVER_ODBC_VER:03.80
与15.10的ODBC版本有关吗?我查看了文档,但看不到指定 ODBC 版本的位置。有没有办法在 Windows 中检查它?
我没有在 Path 环境变量中添加正确的目录!!!!