开放式数据库连接(ODBC)提供了用于访问数据库管理系统(DBMS)的标准软件接口。
我正在尝试使用c++中的odbc在sql server中进行批量复制。 这是我的代码: #包括 #包括 #包括 #包括 #包括 我正在尝试使用 C++ 中的 odbc 在 sql server 中进行批量复制。 这是我的代码: #include <stdio.h> #include <string.h> #include <windows.h> #include <sql.h> #include <sqlext.h> #include <odbcss.h> #include<tchar.h> SQLHENV henv = SQL_NULL_HENV; HDBC hdbc1 = SQL_NULL_HDBC, hdbc2 = SQL_NULL_HDBC; SQLHSTMT hstmt2 = SQL_NULL_HSTMT; void Cleanup() { if (hstmt2 != SQL_NULL_HSTMT) SQLFreeHandle(SQL_HANDLE_STMT, hstmt2); if (hdbc1 != SQL_NULL_HDBC) { SQLDisconnect(hdbc1); SQLFreeHandle(SQL_HANDLE_DBC, hdbc1); } if (hdbc2 != SQL_NULL_HDBC) { SQLDisconnect(hdbc2); SQLFreeHandle(SQL_HANDLE_DBC, hdbc2); } if (henv != SQL_NULL_HENV) SQLFreeHandle(SQL_HANDLE_ENV, henv); } void HandleDiagnosticRecord (SQLHANDLE hHandle, SQLSMALLINT hType, RETCODE RetCode) { SQLSMALLINT iRec = 0; SQLINTEGER iError; WCHAR wszMessage[1000]; WCHAR wszState[SQL_SQLSTATE_SIZE+1]; if (RetCode == SQL_INVALID_HANDLE) { fwprintf(stderr, L"Invalid handle!\n"); return; } while (SQLGetDiagRec(hType, hHandle, ++iRec, wszState, &iError, wszMessage, (SQLSMALLINT)(sizeof(wszMessage) / sizeof(WCHAR)), (SQLSMALLINT *)NULL) == SQL_SUCCESS) { // Hide data truncated.. if (wcsncmp(wszState, L"01004", 5)) { fwprintf(stderr, L"[%5.5s] %s (%d)\n", wszState, wszMessage, iError); } } } #define TRYODBC(h, ht, x) { RETCODE rc = x;\ if (rc != SQL_SUCCESS) \ { \ HandleDiagnosticRecord (h, ht, rc); \ } \ if (rc == SQL_ERROR) \ { \ fwprintf(stderr, L"Error in " L#x L"\n"); \ Sleep(30000); \ } \ } void extract_error( char *fn, SQLHANDLE handle, SQLSMALLINT type) { SQLINTEGER i = 0; SQLINTEGER native; SQLWCHAR state[ 7 ]; SQLWCHAR text[256]; SQLSMALLINT len; SQLRETURN ret; fprintf(stderr, "\n" "The driver reported the following diagnostics whilst running " "%s\n\n", fn); do { ret = SQLGetDiagRec(type, handle, ++i, state, &native, text, sizeof(text), &len ); if (SQL_SUCCEEDED(ret)) printf("%s:%ld:%ld:%s\n", state, i, native, text); } while( ret == SQL_SUCCESS ); } int main() { RETCODE retcode; // BCP variables. char *terminator = "\0"; // bcp_done takes a different format return code because it returns number of rows bulk copied // after the last bcp_batch call. DBINT cRowsDone = 0; // Set up separate return code for bcp_sendrow so it is not using the same retcode as SQLFetch. RETCODE SendRet; // Allocate the ODBC environment and save handle. retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv); if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) { printf("SQLAllocHandle(Env) Failed\n\n"); Cleanup(); return(9); } // Notify ODBC that this is an ODBC 3.0 app. retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER); if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) { printf("SQLSetEnvAttr(ODBC version) Failed\n\n"); Cleanup(); return(9); } // Allocate ODBC connection handle, set bulk copy mode, and connect. retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1); if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) { printf("SQLAllocHandle(hdbc1) Failed\n\n"); Cleanup(); return(9); } retcode = SQLSetConnectAttr(hdbc1, SQL_COPT_SS_BCP, (void *)SQL_BCP_ON, SQL_IS_INTEGER); if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) { printf("SQLSetConnectAttr(hdbc1) Failed\n\n"); Cleanup(); return(9); } // sample uses Integrated Security, create the SQL Server DSN using Windows NT authentication SQLWCHAR dsn[30] = L"mssqltest"; //Name DNS SQLWCHAR user[10] = L"di_test"; SQLWCHAR pass[10] = L"di_test"; SQLWCHAR tb[20]=L"information1"; retcode = SQLConnectW(hdbc1, (SQLWCHAR *)dsn, SQL_NTS, (SQLWCHAR *) user, SQL_NTS, (SQLWCHAR *) pass, SQL_NTS); if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) { printf("SQLConnect() Failed\n\n"); Cleanup(); return(9); } // TRYODBC(hdbc1, SQL_HANDLE_DBC, retcode); // Initialize the bulk copy. retcode = bcp_init(hdbc1,L"information1", NULL, NULL, DB_IN); if ( (retcode != SUCCEED) ) { printf("bcp_init(hdbc1) Failed\n\n"); Cleanup(); return(9); } //Define our array SQLINTEGER custIDs[] = { 1, 2, 3, 4}; // Bind the program variables for the bulk copy. retcode = bcp_bind(hdbc1, (BYTE *)custIDs[0], 4, SQL_VARLEN_DATA, NULL, (INT)NULL, SQLINT4, 2); if ( (retcode != SUCCEED) ) { printf("bcp_bind(hdbc1) Failed\n\n"); Cleanup(); return(9); } // Could normally use strlen to calculate the bcp_bind cbTerm parameter, but this terminator // is a null byte (\0), which gives strlen a value of 0. Explicitly give cbTerm a value of 1. retcode = bcp_bind(hdbc1, (BYTE *)custIDs[0], 4, SQL_VARLEN_DATA, NULL, (INT)NULL, SQLINT4, 3); if ( (retcode != SUCCEED) ) { printf("bcp_bind(hdbc1) Failed\n\n"); Cleanup(); return(9); } if ( (SendRet = bcp_sendrow(hdbc1) ) != SUCCEED ) { printf("bcp_sendrow(hdbc1) Failed\n\n"); Cleanup(); return(9); } cRowsDone = bcp_done(hdbc1); if ( (cRowsDone == -1) ) { printf("bcp_done(hdbc1) Failed\n\n"); Cleanup(); return(9); } printf("Number of rows bulk copied after last bcp_batch call = %d.\n", cRowsDone); // Cleanup. SQLFreeHandle(SQL_HANDLE_STMT, hstmt2); SQLDisconnect(hdbc1); SQLFreeHandle(SQL_HANDLE_DBC, hdbc1); SQLDisconnect(hdbc2); SQLFreeHandle(SQL_HANDLE_DBC, hdbc2); SQLFreeHandle(SQL_HANDLE_ENV, henv); } 行中: retcode = bcp_init(hdbc1,L"information1", NULL, NULL, DB_IN); 我收到一个异常,提示访问冲突。我没有收到任何错误,但有一个异常。 有谁知道我应该如何解决这个问题? 我在一个 win32 程序中使用 bcp_xxxx 函数已经有 12-15 年了。该程序是在 VS6 上编译的,至今仍在生产中。 我最近在VS2015上重写了项目(终于……)。我也像你一样对 bcp_xxxx 功能有问题。 原始 VS6 程序包含以下文件: #include <sql.h> #include <sqlext.h> #include "C:\Program Files\Microsoft SQL Server\80\Tools\DevTools\Include\odbcss.h" SQLDriverConnect() 函数与包含 Driver=SQL Server 的连接字符串一起使用。 odbcbcp.lib已添加到链接器库列表中。没有问题。 该程序已针对 VS2015 进行了彻底重新审视,将适当的 ODBC 函数更改为 3.x 版本,并允许使用 UNICODE 或 ANSI 字符集的 32 或 64 位二进制文件。 最近的文档建议在使用 sqlncli.h 函数时使用 sqlncli11.lib 标头和 bcp_xxxx: #include <sql.h> #include <sqlext.h> #define _SQLNCLI_ODBC_ #ifdef _WIN64 #include "C:\Program Files\Microsoft SQL Server\110\SDK\Include\sqlncli.h" #else #include "C:\Program Files (x86)\Microsoft SQL Server\110\SDK\Include\sqlncli.h" #endif 我按照建议做了,然后......崩溃了。 然后我链接回odbcbcp.lib,它就像一个魅力。 于是,我开始搜索如何使用sqlncli11.lib,发现ODBC连接字符串应该包含Driver=SQL Server Native Client 11.0。 简而言之: - (1) Driver=SQL Server 与 odbcbcp.lib 有效 - (2) Driver=SQL Server 与 sqlncli11.lib 使 bcp_init() 崩溃 - (3) Driver=SQL Server Native Client 11.0 与 odbcbcp.lib 使 bcp_init() 失败(返回 FAIL=0) - (4) Driver=SQL Server Native Client 11.0 与 sqlncli11.lib 有效。 选项(1)和(4)有效。 但我也发现使用选项(4)可以使查询运行得更快! 所以我会保留最后一张。 希望这有帮助。 之前的答案很完美,将其扩展到 ODBC 13,17 & 18 。 为了使其正常工作,LIB / Include 文件应与所使用的 ODBC 驱动程序匹配。 在 SQLServerClientSDK\ODBC***\SDK 下,其中 *** 是版本( 130 、 170 或 180 )。你会找到 msodbcsqlXX.lib,其中 xx 是 13,17, 18 对于包含文件,请使用 msodbcsql.h 而不是 odbcss.h / odbcinst.h 在连接字符串中,您可以使用 DNS=Name ,系统将检测底层驱动程序信息。 重要的部分是 ODBC 版本与 LIB/Include 文件相同,并且 C++ 代码与正确版本的 LIB 文件链接。 我找不到解决方案的缺点是必须为每个 ODBC 版本编译 dll / exe。 希望这会有所帮助。 谢谢,
ODBC:错误 [08001] - 尝试在 Power BI 中连接 PostgreSQL
我尝试在 Power BI 中连接托管在 Google Cloud 上的 PostgreSQL 数据库,但没有成功。首先,我在 power bi 中使用本机连接 postgresql,之后尝试与 ODBC 连接,返回一个
使用 Instant Client 连接到 SQL Server 中的链接服务器 (Oracle)
我需要使用 MS SQL Server (2019) 链接服务器连接到远程数据库 (Oracle)。到目前为止我做了什么: 在 SQL 所在的计算机上安装了 Oracle Instant Client x64 和 ODBC 驱动程序
[驱动程序管理器]无法打开 lib '/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.9.so.1.1'
当我跑步时 $ python manage.pyspectdb --database=mssql_database 我有以下错误 django.db.utils.Error: ('01000', "[01000] [unixODBC][驱动程序管理器]无法打开 lib '/opt/microsoft/
SQLSTATE[28000]:[Microsoft][SQL Server 的 ODBC 驱动程序 17][SQL Server]用户登录失败
我正在使用以下 PHP 连接文件来连接到我的 SQL Server 数据库。 我正在使用以下 PHP 连接文件来连接到我的 SQL Server 数据库。 <?php $servername = "..."; $username = "..."; $password = ""; $dbname = "..."; try { $conn = new PDO("sqlsrv:Server=$servername;Database=$dbname", $username, $password); echo "Connected to $dbname at $servername successfully."; $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $pe) { die ("Could not connect to the database $dbname :" . $pe->getMessage()); } ?> 我不断收到此错误: “SQLSTATE[28000]:[Microsoft][SQL Server 的 ODBC 驱动程序 17][SQL 服务器]用户 $username 登录失败”。 我已经下载了最新版本的 ODBC 17 和 18,我希望这可以解决此问题,但事实并非如此。我的 SQL Server 身份验证也设置为 SQL Server 和 Windows 身份验证。 如果使用 laravel,在你的 .env 文件中: DB_CONNECTION=sqlsrv DB_HOST=DESKTOP-91MB9QU\TESTSQLSERVER DB_PORT= DB_DATABASE=laravel_test DB_USERNAME=sa DB_PASSWORD='mypassword' 你就可以使用它了。注意 DB_CONNECTION=sqlsrv 和 DB_HOST 的格式必须为“PC-name\SQL-server-name”,并且 DB_PORT 为空值。 您可以使用与纯php代码类似的方式。 我也有同样的问题,但是是在 C++ 中。它帮助我捕获另一个异常“CDBException”。 catch (CDBException* p) { cout << "Login failed!" << endl; } 对于你的代码,像这样 catch (CDBException $pe) { die ("Could not connect to the database"); } 也许它的异常名称相同,但至少应该有一个与我的相似的。 之后我的代码就起作用了。希望对你有帮助。
在 Excel 365 中找到和/或重新安装 MS Query 的链接
我有一个小型数据查询和分析团队,他们使用 Microsoft Query 从 ODBC 连接提取数据。我们正在运行 Microsoft 365 并利用 Excel 内的数据源。 ODBC 数据
“[unixODBC][驱动程序管理器]无法打开 lib '/usr/lib/x86_84-linux-gnu/odbc/libmyodbc8w.so':找不到文件”
完全不习惯linux所以请原谅。似乎我已经浏览了网上关于这个问题的每一篇文章,最后我终于来发表我自己的文章了。 我需要通过 ODBC 连接到 MySQL 数据库
Apache Ignite JDBC(可能是 ODBC 和瘦客户端)禁用设置不会阻止 JDBC 连接或查询
为了禁用通过 JDBC/ODBC/瘦客户端的访问,如文档中所述,我配置了 IgniteConfiguration#clientConnectorConfiguration 以设置 odbcEnabled、jdbcEnabled 和 ThinClientE...
我有一台新的 M1 pro macbook,我正在尝试在我的机器上安装 pyodbc 和相关驱动程序。 到目前为止,我已经根据找到的说明通过自制程序和 ODBC 驱动程序安装了 unixodbc...
[Microsoft][SQL Server 的 ODBC 驱动程序 18][SQL Server]用户登录失败
我正在使用 Docker 容器将 MSSQL Server 集成到我的 PHP 8.0 应用程序中。我已经安装了 pdo_sqlsrv、sqlsrv 和 unixodbc 扩展,为此,我还安装了 ODBC 驱动程序 18...
使用适用于 Linux 的 ODBC MySQL 驱动程序时找不到驱动程序
使用 Tableau Server 的 Ubuntu 22.04 上的 MySQL ODBC 驱动程序存在问题。 尝试连接会出现错误: [unixODBC][驱动程序管理器]无法打开 lib '/usr/lib/x86_64-linux-gnu/odbc/libmyodbc8w...
R odbc 无法找到 oracle 驱动程序,即使它在那里
这是我从 RStudio (和 R,使用 sudo 运行)收到的错误: > odbc::dbConnect(odbc::odbc(), 驱动程序 = "/opt/oracle/instantclient_23_4/libsqora.so.23.1") 错误:nanodbc/nanodbc....
R 中的 ODBC/DBI 不会写入 R 中具有非默认模式的表
问题 当尝试写入具有非默认模式的表时,DBI 包中的 dbWriteTable 会写入 default.non-default.tablename,而不是写入 non-default.tablename。我知道...
使用 Visual Studio 的集成服务中的 ODBC 连接问题
我正在尝试使用 Visual Studio 在 Integration Services 中建立 ODBC 连接。我想将数据从 PostgreSQL 表传输到 SQL Server。我在表加载阶段遇到问题...
我搜索了SO和Google,但在这个问题上没有找到太多帮助。这似乎是由于 ODBC 函数被乱序调用所致。但由于我使用的是封装了 ODBC 的 QSql,所以我很难...
“[ODBC 驱动程序管理器] 未找到数据源名称且未指定默认驱动程序”
我创建了一个vb项目并制作了它的安装程序,它在我的PC上运行良好,并且它也适用于在他们的机器上使用该系统的一些用户。但是,有一个特定的用户收到了...
我有一个旧版 VB6 应用程序,它根据配置文件中的参数构建 DSN。该参数是一个 ODBC 连接,该连接有一个名称 (DSN-NAME),它将服务器 (DBSERVER) 映射到 ...
第一次发生这种情况时,我认为这与我们的设置或与 pgodbc 连接有关,但当它发生在另一个连接到 MS-SQL 的客户端时,我决定发布...
我添加了一些可以干净编译的代码,并且刚刚收到此 Windows 错误: ---------------------------- (MonTel 管理员)2.12.7:MtAdmin.exe - 应用程序错误 ----------------...