RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 802974
Accepted
Fresto
Fresto
Asked:2020-03-22 17:15:57 +0000 UTC2020-03-22 17:15:57 +0000 UTC 2020-03-22 17:15:57 +0000 UTC

如何在 C 中获取 SqlServer 数据?

  • 772

您需要从 C 中的数据库中获取数据。做这个的最好方式是什么?

sql
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    nick_n_a
    2020-03-22T23:06:52Z2020-03-22T23:06:52Z

    有几个著名的接口库,您可以通过它们直接或几乎直接使用数据库。在 C 中,C++ 可用

    1. ODBC
    2. ADO
    3. 数据库

    MSSQL - 指 OleDB 数据库。

    我给你看一些。ODBC 和 ADO。ODBC 和 ADO 非常相似。可以在连接中写入别名(可以在“OdbcCad”的控制面板中注册的别名和连接字符串。连接字符串不同于 OleDB 连接字符串。

    ODBC 大约有一百个(大约需要 20-30 个)可用于访问数据库的函数。下面是一个使用 ODBC 的最小示例,没有错误处理:

    #include <windows.h>
    #include <stdio.h>
    #include <sqlext.h>
    #include <sqltypes.h>
    #include <sql.h>
    // #pragma comment (lib,"odbc32.lib")   Для борланда
    
    int main(int argc, const char ** argv) {
      HANDLE hEnv=0;
      HANDLE hodbc=0;
      HANDLE stmt =0;
      int err = 0;
      int a = 0;
      int nula;
      err=SQLAllocEnv(&hEnv);
      SQLAllocConnect(hEnv,&hodbc);
      SQLConnect(hodbc,"mytest",-3/*SQL_NTS*/,"portal",-3,"1",-3); 
      SQLAllocStmt(hodbc,&stmt);
      SQLPrepare(stmt,"select 123 as a",-3);
      err = SQLExecute(stmt);
      if ((SQLFetch(stmt) | 1) == 1) {
         SQLGetData(stmt,1,SQL_C_LONG,&a,1,&nula);
         printf("%i",a);
         };
    if (stmt != SQL_NULL_HSTMT) SQLFreeHandle(SQL_HANDLE_STMT, stmt);
    if (hodbc!= SQL_NULL_HDBC) {
        SQLDisconnect(hodbc);
        SQLFreeHandle(SQL_HANDLE_DBC, hodbc);
    }
    if (hEnv != SQL_NULL_HENV) SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
    return 0;
    };
    

    ODBC 链接

    1. http://www.easysoft.com/developer/languages/c/examples/DescribeAndBindColumns.html
    2. http://docs.microsoft.com/en-us/sql/odbc/reference/syntax/sqlgetdata-function

    ADO 的变体。在我看来,这是最简单的选择——并且适用于大多数 DBMS。ADO - 采用 unicode,通过连接字符串或别名进行连接。我认为它是最简单的,因为它大约有 10 个类,其中包含使用 DBMS 所需的所有功能。VARIANT - 类型便于转换,不需要转换。所有函数都返回 HRESULT - 您可以 a) google 错误代码 b) 有将其转换为文本的函数。COM 兼容接口允许使用有助于转换的附加功能。ADO 也适用于 JS 脚本、VBS 和 MS-SQL SQL 脚本本身(启用 Active-X)。

    #include <windows.h>
    #include <adoint.h>    
    #include <stdio.h>
    
    int main(int argc, const char ** argv) {
      CoInitialize(0); // Нужно делать в начале программы
      GUID g1;
      CLSIDFromProgID(L"ADODB.Connection", &g1); // Система сама посдставит последнюю версию
      Connection15 * conn = NULL; // 15 не означает что АДО устарела, для совместимости
      ADORecordset * rs = NULL;
      DWORD res = 0;
      VARIANT_BOOL eof = VARIANT_TRUE;
      if ((res =  CoCreateInstance(*(GUID*)&g1, 0, CLSCTX_INPROC_SERVER,
       IID_IUnknown, (void**)&conn))) return res; // Подключаем либу АДО
      if ((res = conn->Open(L"mytest",L"portal",L"1",0))  != 0) return res;
      // В execute нужно поставить SQL запрос
      res = conn->Execute(L"select 123 a;",0,0,&rs); 
      if (res == 0) {
        rs->MoveFirst();
        if ((rs->get_EOF(&eof) == 0) && (eof== 0))  { // Тут 
            //можно будет поставить while вместо if
            VARIANT index= {0,};
            VARIANT val = {0,};
            index.vt = VT_I4;
            index.intVal = 0; // номер колонки
            long ct = 0;
            ADOFields* pFields = NULL;
            ADOField*  pField = NULL;
            res= rs->get_Fields(&pFields);
            if (res==0) pFields->get_Count(&ct);// Получить число столбцов
            for (index.intVal=0; index.intVal < ct; index.intVal++){              
              if (res==0) res=pFields->get_Item(index,&pField);// Колонка 0
              if  (res == 0) res = pField->get_Value(&val);
              if ((res == 0) &&(val.vt != VT_BSTR))
                VariantChangeType(&val,&val,0,VT_BSTR);  // Конвертация грубо в строку
              if ((res==0)&&(val.vt == VT_BSTR)) {// Вывод на екран
                 printf("%ls",val.bstrVal);
                 };
              VariantClear(&val); // Освобождаем ресурсы
              if (pField) pField->Release();
              }
            if (pFields) pFields->Release();
            rs->MoveNext(); // Надо если в цикле
            }
        }
      return 0;
    
    }
    

    ADO 链接

    1. http://www.tek-tips.com/viewthread.cfm?qid=689078
    2. https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/ado-code-examples-in-visual-c
    3. ADO + SQL示例

    1. 我不会给出关于 OLEDB 的示例。很难简单地写出需要什么。虽然对于 MSSQL OLEDB - 最好的方法。以下是一些示例链接。

      1. OLEDB 步骤说明https://msdn.microsoft.com/en-us/library/aa746473(v=vs.85).aspx
      2. MS LDAP 示例https://msdn.microsoft.com/en-us/library/aa705932(v=vs.85).aspx
      3. 广泛的示例https://msdn.microsoft.com/en-us/library/ms716835(v=vs.85).aspx
    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5