使用 C++ 连接到 MySQL 服务器

2024-03-25

我正在尝试使用 C++ 和 Visual C++ 2008 Express Edition 上的 MySQL ODBC 5.1 驱动程序连接到 MySQL 服务器。

我按照 MSDN 中的这些说明进行操作:

  • SQL连接 http://msdn.microsoft.com/en-us/library/ms711810%28VS.85%29.aspx
  • SQL获取数据 http://msdn.microsoft.com/en-us/library/windows/desktop/ms715441%28v=vs.85%29.aspx
  • SQLFetch http://msdn.microsoft.com/en-us/library/windows/desktop/ms712424%28v=vs.85%29.aspx

唯一的区别是我必须转换所有SQLCHAR to SQLWCHAR,以匹配函数参数,希望这不会影响连接字符串。

每次我连接时我都会得到SQL_ERROR作为返回值。 所以我假设连接字符串或连接语句有问题。

我试过了

DNS=TestConnection; UID=user; PSW=password

and

SERVER=localhost; DRIVER={MySQL ODBC 5.1 Driver}; PORT=3306; UID=user; PSW=password; DATABASE=dbo;和其他类似的连接字符串。

称为的 DNSTestConnection与后一个连接字符串具有相同的信息。

架构是dbo,并有一张表称为testfire具有以下列规格:

TEST_ID( INT(11), PRIMARY, AUTO INCREMENT)
TEST_STRING( VARCHAR(50) )
TEST_INTEGER( INT(11) )
TEST_FLOAT( FLOAT )
TEST_DATE( DATETIME )

有 3 行:

  ID    STRING    INT   FLOAT           DATE
------------------------------------------------------
| 1  |  Test 1  |  1  |  0.1  |  2001-01-01 00:00:00 |
| 2  |  Test 2  |  2  |  0.2  |  2002-01-01 00:00:00 |
| 3  |  Test 3  |  3  |  0.3  |  2003-01-01 00:00:00 |
------------------------------------------------------

我尝试使用 Excel 连接检索数据,主要是为了查看驱动程序是否工作。 Excel 成功检索了数据,没有出现任何问题,因此名为 TestConnection 的 DNS 有效,凭据也有效。

  • 我究竟做错了什么?
  • 我应该改变什么?
  • 是否转换为MYSQLWCHAR *这会弄乱连接字符串吗?
  • 是否有不同的、也许更好、更有效的方法? (也许类封装除外,这就是测试成功后我要做的事情)

哦,编译器不会给出任何错误或警告,代码被编译并运行没有任何问题。

因此,这是测试代码,它返回“查询执行错误”:

#include <iostream>
#include <windows.h>
#include <sql.h>
#include <sqltypes.h>
#include <sqlext.h>

using namespace std;

int main(){
    SQLHENV henv;
    SQLHDBC hdbc;
    SQLHSTMT hstmt;
    SQLRETURN retcode;
    HWND desktopHandle = GetDesktopWindow();

    SQLWCHAR OutConnStr[255];
    SQLSMALLINT OutConnStrLen;
    SQLWCHAR szDNS[2048] ={0};

    // Allocate environment handle
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

    // Set the ODBC version environment attribute
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
        retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); 

        // Allocate connection handle
        if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
            retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 

             // Set login timeout to 5 seconds
            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);

                // Connect to data source
                retcode = SQLDriverConnect(
                    hdbc, 
                    desktopHandle, 
                    (SQLWCHAR*)"driver=MySQL Server", 
                    _countof("driver=MySQL Server"),
                    OutConnStr,
                    255, 
                    &OutConnStrLen,
                    SQL_DRIVER_PROMPT );

                // Allocate statement handle
                if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 

                    // Process data
                    retcode = SQLExecDirect(hstmt, (SQLWCHAR*)"SELECT TEST_STRING, TEST_INTEGER, TEST_FLOAT FROM dbo.testfire", SQL_NTS);

                    if (retcode == SQL_SUCCESS) {
                        SQLINTEGER sTestInt, cbTestStr, cbTestInt, cbTestFloat;
                        SQLFLOAT dTestFloat;
                        SQLCHAR szTestStr[200];
                        while (TRUE) {
                            cout<<"Inside loop";
                            retcode = SQLFetch(hstmt);
                            if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {
                                cout<<"An error occurred";
                            }
                            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){

                                SQLGetData(hstmt, 1, SQL_C_CHAR, szTestStr, 200, &cbTestStr);
                                SQLGetData(hstmt, 2, SQL_C_ULONG, &sTestInt, 0, &cbTestInt);
                                SQLGetData(hstmt, 3, SQL_C_FLOAT, &dTestFloat, 0,&cbTestFloat);

                                /* Print the row of data */
                                cout<<szTestStr<<endl;
                                cout<<sTestInt<<endl;
                                cout<<dTestFloat<<endl;
                            } else {
                                break;
                            }
                        }
                    }else{
                        cout<<"Query execution error."<<endl;
                        SQLWCHAR       SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH];
                        SQLINTEGER    NativeError;
                        SQLSMALLINT   i, MsgLen;
                        SQLRETURN     rc2;

                        // Get the status records.
                        i = 1;
                        while ((rc2 = SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, i, SqlState, &NativeError,
                            Msg, sizeof(Msg), &MsgLen)) != SQL_NO_DATA) {
                          cout<<SqlState<<endl;
                          cout<<NativeError<<endl;
                          cout<<Msg<<endl;
                          cout<<MsgLen<<endl;
                          i++;
                        }
                    }
                    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                        SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
                    }

                    SQLDisconnect(hdbc);
                }else{ 
                    cout<<"Connection error."<<endl;
                }
                SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
            }
        }
        SQLFreeHandle(SQL_HANDLE_ENV, henv);
    }
    system("pause");
    return 0;
}

UPDATE

使用正确的参数更新代码(并发布)后SQLDriverConnect根据 Mat 提供的文档(请参阅下面的评论),连接有效。如何在不提示输入 DNS 名称的情况下执行相同的操作?将窗口句柄设置为 null 然后...?

现在它失败了SQLExecDirect(hstmt, (SQLWCHAR*)"SELECT TEST_STRING, TEST_INTEGER, TEST_FLOAT FROM dbo.testfire", SQL_NTS),但是查询是正确的,那么,问题出在哪里呢?

返回的具体错误信息是:

Sql State:      42000
Native Error:   1064
Message:        
Message Length: 211

42000: Syntax error or access violation

*StatementText contained an SQL statement that was not preparable or contained a syntax error.
The user did not have permission to execute the SQL statement contained in *StatementText.

那么...这是什么意思? 我怎么可能没有权限呢? 这怎么会产生语法错误,这显然是一个有效的查询?


在 Mat 的帮助下,我能够找出问题所在,但由于他没有以答案的形式给出,所以我必须回答它,以便可以与那些有问题的人分享同样的问题,也标记为已回答。

所以,我的问题是无法连接到数据库。正如 Mat 所建议的,我应该使用扩展错误信息,称为SQLGetDiagRec并根据文档修复参数。我花了一些时间来了解如何SQLGetDiagRec功能有效,但是一旦我成功转换wchar_t to char *我能够看到它生成的错误。

连接尝试给了我错误Data source not found and no default driver specified。这给了我一个线索,表明我要么写了不正确的连接字符串,要么文本字符串被某种方式误解或损坏。

做一些在网上搜索 http://msdn.microsoft.com/en-us/library/dybsewaf.aspx让我意识到该字符串被误解了,要修复它,我必须将其设为文字字符串。果然,在字符串前面加个L就解决了!

retcode = SQLDriverConnect(hdbc, 0, 
                           (SQLWCHAR*)L"DSN=TestConnection;SERVER=localhost;UID=user;PWD=password;DRIVER=MySQL Server;", 
                           _countof(L"DSN=TestConnection;SERVER=localhost;UID=user;PWD=password;DRIVER=MySQL Server;"), 
                           OutConnStr, 255, &OutConnStrLen, SQL_DRIVER_COMPLETE);

同时,我学会了如何摆脱提示,在纠正了最初的问题后,这很容易弄清楚。为窗口句柄指定 null,将驱动程序完成设置为SQL_DRIVER_COMPLETE并确保添加连接字符串中所需的所有信息。

所以,我在查询中遇到的下一个问题是SQLExecDirect给出了一个错误说Syntax error or access violation。问题显然与连接字符串相同。果然够了

retcode = SQLExecDirect(hstmt, (SQLWCHAR*)L"SELECT TEST_STRING, TEST_INTEGER, TEST_FLOAT FROM dbo.testfire", SQL_NTS);

工作起来就像一个魅力。

这是完整的、功能齐全的代码:

#include <iostream>
#include <windows.h>
#include <sql.h>
#include <sqltypes.h>
#include <sqlext.h>
#include <string>

using namespace std;

int main(){
    SQLHENV henv;
    SQLHDBC hdbc;
    SQLHSTMT hstmt;
    SQLRETURN retcode;

    SQLWCHAR OutConnStr[255];
    SQLSMALLINT OutConnStrLen;

    // Allocate environment handle
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

    // Set the ODBC version environment attribute
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
        retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); 

        // Allocate connection handle
        if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
            retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 

             // Set login timeout to 5 seconds
            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);

                // Connect to data source
                retcode = SQLDriverConnect(
                    hdbc, 
                    0,
                    (SQLWCHAR*)L"DSN=TestConnection;SERVER=localhost;UID=root;PWD=never140;DRIVER=MySQL Server;", 
                    _countof(L"DSN=TestConnection;SERVER=localhost;UID=root;PWD=never140;DRIVER=MySQL Server;"),
                    OutConnStr,
                    255, 
                    &OutConnStrLen,
                    SQL_DRIVER_COMPLETE );

                // Allocate statement handle
                if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 

                    // Process data
                    retcode = SQLExecDirect(hstmt, (SQLWCHAR*)L"SELECT TEST_STRING, TEST_INTEGER, TEST_FLOAT FROM dbo.testfire", SQL_NTS);

                    if (retcode == SQL_SUCCESS) {
                        SQLINTEGER sTestInt, cbTestStr, cbTestInt, cbTestFloat, iCount = 1;
                        SQLFLOAT dTestFloat;
                        SQLCHAR szTestStr[200];
                        while (TRUE) {
                            retcode = SQLFetch(hstmt);
                            if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {
                                cout<<"An error occurred";
                            }
                            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){

                                SQLGetData(hstmt, 1, SQL_C_CHAR, szTestStr, 200, &cbTestStr);
                                SQLGetData(hstmt, 2, SQL_C_ULONG, &sTestInt, 0, &cbTestInt);
                                SQLGetData(hstmt, 3, SQL_C_DOUBLE, &dTestFloat, 0,&cbTestFloat);

                                /* Print the row of data */
                                cout<<"Row "<<iCount<<":"<<endl;
                                cout<<szTestStr<<endl;
                                cout<<sTestInt<<endl;
                                cout<<dTestFloat<<endl;
                                iCount++;
                            } else {
                                break;
                            }
                        }
                    }else{
                        cout<<"Query execution error."<<endl;
                    }

                    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
                    SQLDisconnect(hdbc);
                }else{ 
                    cout<<"Connection error"<<endl;
                }
                SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
            }
        }
        SQLFreeHandle(SQL_HANDLE_ENV, henv);
    }

        system("pause");
    return 0;
}

事实证明,即使是最微小的事情也可能导致一切失败。

谢谢马特的帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 C++ 连接到 MySQL 服务器 的相关文章

  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • MySQL:如何仅获取正值的平均值?

    假设我有 INT 列 并且我使用 1 来表示插入时没有可用数据 我想获得该列中所有 0 或更大值的平均值 这可能吗 Thanks 我忘了提及 我正在与其他 AVG 一起执行此操作 因此从选项卡中选择 avg a avg b avg d 所以
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • MySQL 概念:会话与连接

    我对 MySQL 的概念有点困惑 会话与连接 当谈论连接到 MySQL 时 我们使用连接术语 连接池等 然而在 MySQL 在线文档中 http dev mysql com doc refman 4 1 en server system v
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • Django 将 JSON 数据传递给静态 getJSON/Javascript

    我正在尝试从 models py 中获取数据并将其序列化为views py 中的 JSON 对象 模型 py class Platform models Model platformtype models CharField max len
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File

随机推荐

  • Hyperledger Fabric 如何在非权限网络和权限网络中设置 Auditor

    我已经研究超级账本结构有一段时间了 我成功安装并形成了 Fabric 网络 而无需使用 5 个对等点的 docker 现在我尝试在网络内设置 Auditor 和非验证对等点 我到处浏览 但找不到任何明确的文件 有人可以帮忙吗 Hyperle
  • 通过 .net 发送短信

    全部 是否有通过 net 发送短信 SMS 的免费解决方案 也许是网络服务之类的 EDIT 我真正想要的是一个有信誉的在线服务的参考 我可以用它来发送短信 有没有人使用过这样的服务 如果是的话 你能给我一个建议 警告吗 EDIT 首先是免责
  • 使用聚合 OData 版本 4 对 Apply 的结果执行 OrderBy

    考虑我有一个像这样的 odata 查询 Sessions apply filter SomeColumn eq 1 groupby Application Name aggregate TotalLaunchesCount with sum
  • Android 数字键盘上的“下一步”按钮

    我想知道如何使用 Jquery 检测 Android 数字键盘上的 下一步 按钮事件 请给我解决方案如何触发该按钮事件 您可以检测到next通过在 JQuery 中使用以下绑定来按下键盘 input on keydown function
  • Node.js POST 导致 [错误:套接字挂起] 代码:'ECONNRESET'

    我创建了一个示例来将数据发布到休息服务 我发现当我有非 ASCII 或非拉丁字符时 请参阅 data firstName 我使用 TEST REST js 的发布请求将抛出 错误 错误 套接字挂起 代码 ECONNRESET TEST RE
  • 如何用省略号删除右侧的多余空间

    我想用省略号类删除右侧的额外空间 ellipsis white space nowrap overflow hidden text overflow ellipsis max width 90px div float left clear
  • 如何在 Python 中检查空 gzip 文件

    我不想使用操作系统命令 因为这使得它依赖于操作系统 这可以在tarfile tarfile is tarfile filename 检查文件是否为 tar 文件 我在中找不到任何相关命令gzip module EDIT 为什么我需要这个 我
  • 如何使Spring缓存中的缓存名称可配置?

    我们使用 Spring 缓存框架进行缓存 并且希望能够支持多个缓存命名空间 例如 book 或 isbn 并且缓存命名空间是可配置的 而不是硬编码在类中 例如具有 Cacheable book isbn public Book findBo
  • JavaScript:内联函数与预定义函数

    任何人都可以向我提出一些关于使用的论据吗内联函数反对通过预定义函数给一些处理程序的名字 IE 哪个更好 function setTimeout function some code here 5 versus function functi
  • Android 2.2异常处理,catch参数null

    我想知道是否有人遇到奇怪的行为 我有 try catch 块 其中 catch 语句分配一个异常变量以使我能够正确处理异常 我得到的是 catch Exception ex 语句中的 ex null 请问我做错了什么 public clas
  • 如何读取用逗号分割的 CSV 文件,除非它是字段的一部分[重复]

    这个问题在这里已经有答案了 我有以下 C 代码 它读取 CSV 文件 目标是将其保存到 SQL 表中 StreamReader sr new StreamReader tbCSVFileLocation Text ToString stri
  • 在 google Drive api 的根目录中创建文件夹并将文件上传到该文件夹

    我想使用 CURL 在 google 驱动器根目录中创建文件夹 文件已上传到驱动器 但我需要创建一个文件夹并将文件上传到该文件夹 根据 hanshenrik 代码 创建文件夹正在工作 移动文件不起作用 我更新的代码 REDIRECT URI
  • 将列与 t-sql 中的值列表进行比较

    我正在页面上显示记录 并且我需要一种方法让用户选择要在另一个页面上显示的记录的子集 这些记录不存储在任何地方 而是动态生成的 在 sql 中说明 uniqueid 位于此 id 列表中而不是表等中的位置的最佳方法是什么 我知道我可以使用一堆
  • 模板化类专门化,其中模板参数是模板

    我想知道类似的事情是否可能 基本上 我有一个模板类 它偶尔会采用模板类的对象 我想将它 或只是一个成员函数 专门用于特定的模板类 但该类的 通用 形式 template
  • 如何在 C# 中关闭*多显示*?

    关于 如何在c 中关闭显示器 的文章有很多 但都是关闭所有显示器 有没有可能的方法来关闭特定的监视器 一些研究引导我来到这里 http www codeguru com forum showthread php p 1011720 post
  • 专有的 Haskell 库

    我对 Haskell 有点陌生 已经在业余项目中使用它几个月了 我想编写一个 C 库的 Haskell 接口 所有代码都是专有的 而不是开源的 所以我的问题是 如果我最终将其分发给客户并且不想提供源代码 而是提供诸如共享库之类的东西怎么办
  • 如何在未迁移到Androidx的项目中使用Androidx库

    我目前的项目还是比较稳定的 目前我不想迁移到 Androidx 但我需要用这个com pierfrancescosoffritti androidyoutubeplayer core 10 0 3我的项目中的图书馆 已迁移至 Android
  • 使 IE 中的内容不可选择

    这是我用 JS 写的图表 http jsfiddle net 49FVb http jsfiddle net 49FVb The css moz user select none khtml user select none 在 Chrom
  • Cassandra 3.9 和 CQL 规范版本

    只是好奇 Cassandra 3 9 支持哪些版本的 cql 我知道Cassandra 3 9支持cql 3 4 2 但是3 4 3是否也支持 以及如何升级 配置 Cassandra 3 9 以使用 cql 3 4 3 我在网上搜索了一下
  • 使用 C++ 连接到 MySQL 服务器

    我正在尝试使用 C 和 Visual C 2008 Express Edition 上的 MySQL ODBC 5 1 驱动程序连接到 MySQL 服务器 我按照 MSDN 中的这些说明进行操作 SQL连接 http msdn micros