odbc 相关问题

开放式数据库连接(ODBC)提供了用于访问数据库管理系统(DBMS)的标准软件接口。

bcp_init 返回访问冲突

我正在尝试使用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。 希望这会有所帮助。 谢谢,

回答 2 投票 0

ODBC:错误 [08001] - 尝试在 Power BI 中连接 PostgreSQL

我尝试在 Power BI 中连接托管在 Google Cloud 上的 PostgreSQL 数据库,但没有成功。首先,我在 power bi 中使用本机连接 postgresql,之后尝试与 ODBC 连接,返回一个

回答 1 投票 0

使用 Instant Client 连接到 SQL Server 中的链接服务器 (Oracle)

我需要使用 MS SQL Server (2019) 链接服务器连接到远程数据库 (Oracle)。到目前为止我做了什么: 在 SQL 所在的计算机上安装了 Oracle Instant Client x64 和 ODBC 驱动程序

回答 2 投票 0

[驱动程序管理器]无法打开 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/

回答 3 投票 0

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"); } 也许它的异常名称相同,但至少应该有一个与我的相似的。 之后我的代码就起作用了。希望对你有帮助。

回答 2 投票 0

在 Excel 365 中找到和/或重新安装 MS Query 的链接

我有一个小型数据查询和分析团队,他们使用 Microsoft Query 从 ODBC 连接提取数据。我们正在运行 Microsoft 365 并利用 Excel 内的数据源。 ODBC 数据

回答 1 投票 0

“[unixODBC][驱动程序管理器]无法打开 lib '/usr/lib/x86_84-linux-gnu/odbc/libmyodbc8w.so':找不到文件”

完全不习惯linux所以请原谅。似乎我已经浏览了网上关于这个问题的每一篇文章,最后我终于来发表我自己的文章了。 我需要通过 ODBC 连接到 MySQL 数据库

回答 2 投票 0

Apache Ignite JDBC(可能是 ODBC 和瘦客户端)禁用设置不会阻止 JDBC 连接或查询

为了禁用通过 JDBC/ODBC/瘦客户端的访问,如文档中所述,我配置了 IgniteConfiguration#clientConnectorConfiguration 以设置 odbcEnabled、jdbcEnabled 和 ThinClientE...

回答 1 投票 0

如何在M1 mac上正确安装pyodbc和驱动程序

我有一台新的 M1 pro macbook,我正在尝试在我的机器上安装 pyodbc 和相关驱动程序。 到目前为止,我已经根据找到的说明通过自制程序和 ODBC 驱动程序安装了 unixodbc...

回答 7 投票 0

[Microsoft][SQL Server 的 ODBC 驱动程序 18][SQL Server]用户登录失败

我正在使用 Docker 容器将 MSSQL Server 集成到我的 PHP 8.0 应用程序中。我已经安装了 pdo_sqlsrv、sqlsrv 和 unixodbc 扩展,为此,我还安装了 ODBC 驱动程序 18...

回答 1 投票 0

使用适用于 Linux 的 ODBC MySQL 驱动程序时找不到驱动程序

使用 Tableau Server 的 Ubuntu 22.04 上的 MySQL ODBC 驱动程序存在问题。 尝试连接会出现错误: [unixODBC][驱动程序管理器]无法打开 lib '/usr/lib/x86_64-linux-gnu/odbc/libmyodbc8w...

回答 1 投票 0

R odbc 无法找到 oracle 驱动程序,即使它在那里

这是我从 RStudio (和 R,使用 sudo 运行)收到的错误: > odbc::dbConnect(odbc::odbc(), 驱动程序 = "/opt/oracle/instantclient_23_4/libsqora.so.23.1") 错误:nanodbc/nanodbc....

回答 1 投票 0

R 中的 ODBC/DBI 不会写入 R 中具有非默认模式的表

问题 当尝试写入具有非默认模式的表时,DBI 包中的 dbWriteTable 会写入 default.non-default.tablename,而不是写入 non-default.tablename。我知道...

回答 2 投票 0

使用 Visual Studio 的集成服务中的 ODBC 连接问题

我正在尝试使用 Visual Studio 在 Integration Services 中建立 ODBC 连接。我想将数据从 PostgreSQL 表传输到 SQL Server。我在表加载阶段遇到问题...

回答 1 投票 0

QSqlQuery 导致 ODBC 函数序列错误

我搜索了SO和Google,但在这个问题上没有找到太多帮助。这似乎是由于 ODBC 函数被乱序调用所致。但由于我使用的是封装了 ODBC 的 QSql,所以我很难...

回答 1 投票 0

“[ODBC 驱动程序管理器] 未找到数据源名称且未指定默认驱动程序”

我创建了一个vb项目并制作了它的安装程序,它在我的PC上运行良好,并且它也适用于在他们的机器上使用该系统的一些用户。但是,有一个特定的用户收到了...

回答 1 投票 0

指定 ODBC 的默认驱动程序

我有一个旧版 VB6 应用程序,它根据配置文件中的参数构建 DSN。该参数是一个 ODBC 连接,该连接有一个名称 (DSN-NAME),它将服务器 (DBSERVER) 映射到 ...

回答 4 投票 0

ODBC随机无法连接数据库服务器

第一次发生这种情况时,我认为这与我们的设置或与 pgodbc 连接有关,但当它发生在另一个连接到 MS-SQL 的客户端时,我决定发布...

回答 1 投票 0

什么是特权指令?

我添加了一些可以干净编译的代码,并且刚刚收到此 Windows 错误: ---------------------------- (MonTel 管理员)2.12.7:MtAdmin.exe - 应用程序错误 ----------------...

回答 10 投票 0

Qt 中 ODBC 驱动程序的使用

我想使用读写mdb文件(Ms Access文件)。 我需要下载驱动程序吗?如果是的话,从哪里来?

回答 2 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.