准备用Win32 API和ODBC来访问数据库;

代码如下;

/*------------------------------------------------------------win32, ODBC, by bobo, 2018-09-09------------------------------------------------------------*/#include <windows.h>
#include "sql.h"
#include "sqlext.h"
#include "sqltypes.h"
#include "sqlucode.h"
#include "odbcss.h"LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
#define DSNAME "testDS1"
#define DSUSERNAME "sa"
#define DSUSERPWD "123"#pragma comment(lib, "odbc32.lib")SQLRETURN ret;
SQLHENV henv;
SQLHDBC hdbc;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{static TCHAR szAppName[] = TEXT ("HelloWin") ;HWND         hwnd ;MSG          msg ;WNDCLASS     wndclass ;wndclass.style         = CS_HREDRAW | CS_VREDRAW ;wndclass.lpfnWndProc   = WndProc ;wndclass.cbClsExtra    = 0 ;wndclass.cbWndExtra    = 0 ;wndclass.hInstance     = hInstance ;wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;wndclass.lpszMenuName  = NULL ;wndclass.lpszClassName = szAppName ;if (!RegisterClass (&wndclass)){MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ;return 0 ;}hwnd = CreateWindow (szAppName,                  // window class nameTEXT ("The Hello ODBC"), // window captionWS_OVERLAPPEDWINDOW,        // window styleCW_USEDEFAULT,              // initial x positionCW_USEDEFAULT,              // initial y position300,              // initial x size100,              // initial y sizeNULL,                       // parent window handleNULL,                       // window menu handlehInstance,                  // program instance handleNULL) ;                     // creation parametersShowWindow (hwnd, iCmdShow) ;UpdateWindow (hwnd) ;while (GetMessage (&msg, NULL, 0, 0)){TranslateMessage (&msg) ;DispatchMessage (&msg) ;}return msg.wParam ;
}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{HDC         hdc ;PAINTSTRUCT ps ;RECT        rect ;DWORD err;switch (message){case WM_CREATE:ret= SQLAllocEnv(&henv); ret = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);//ret = SQLConnect(hdbc, (unsigned char *)"testDS1", SQL_NTS, (unsigned char *)"sa", SQL_NTS,(unsigned char *)"123", SQL_NTS);ret = SQLConnect(hdbc, (SQLCHAR*)"testDS41", SQL_NTS, (SQLCHAR*)"sa", SQL_NTS,(SQLCHAR*)"123", SQL_NTS);//err=GetLastError();if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) //成功连接到数据库{MessageBox (NULL, TEXT ("SUCCESS"), TEXT ("HelloODBC"), 0);}else{MessageBox (NULL, TEXT ("FAIL"), TEXT ("HelloODBC"), 0);}return 0 ;case WM_PAINT:hdc = BeginPaint (hwnd, &ps) ;GetClientRect (hwnd, &rect) ;DrawText (hdc, TEXT ("Hello, ODBC!"), -1, &rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;EndPaint (hwnd, &ps) ;return 0 ;case WM_DESTROY:PostQuitMessage (0) ;return 0 ;}return DefWindowProc (hwnd, message, wParam, lParam) ;
}

在调试的时候发现SQLConnect总是返回1,不知道是否连接成功;
使用ODBC的预定义值来判断是否连接成功;
原来,
SQL_SUCCESS的enum值为0, SQL_SUCCESS_WITH_INFO的enum值为1;

进入调试,查看一下;
henv和hdbc两个句柄已经分配成功;ret为1;

这两种写法一样;
ret = SQLConnect(hdbc, (unsigned char *)"testDS1", SQL_NTS, (unsigned char *)"sa", SQL_NTS,(unsigned char *)"123", SQL_NTS);
ret = SQLConnect(hdbc, (SQLCHAR*)"testDS41", SQL_NTS, (SQLCHAR*)"sa", SQL_NTS,(SQLCHAR*)"123", SQL_NTS);
    
SQL_NTS参数的位置,本来是字符串的长度,此处可以用预定义的SQL_NTS代替;
NTS => "Null-Terminated String"

如果参数对就连接成功,改个不对的参数,例如"testDS101",则会失败;

如果构建时报错
cannot open Debug/XXXX.exe for writing
关闭开发环境,重来;或者看任务管理器里,正在做的程序是否还在运行,结束之即可;

另外需要先在系统中建立ODBC数据源;

先做这么多吧,这活老难了;

截图如下;

Win32 API 和 ODBC 访问数据库一相关推荐

  1. c语言访问数据库 不用odbc,急问ODBC访问数据库问题

    急问ODBC访问数据库问题 c语言用ODBC访问access,编译时出错,都是头文件的错误,实在搞不明白,恳求各位大牛大虾们指教小弟!!急~~~~~~~~~~ #include #include #i ...

  2. ODBC访问数据库(转载)

    使用ODBC API之前要用到的头文件和LIB库 #include "sql.h"              // This is the the main include for ...

  3. 使用ODBC访问数据库(一)

    使用ODBC API之前要用到的头文件和LIB库 #include "sql.h"              // This is the the main include for ...

  4. 可遇不可求的BUG之采用MYSQL odbc 3.51访问数据库返回值缺失

    一句话 巧妇难为无米之炊,驱动还是要及时更新啊... 闲话休说,上图: 1.数据库中存储的值为 "布尔玛" 2.用3.51版本的MYSQL ODBC 驱动访问MYSQL 5.0 数 ...

  5. Java程序员从笨鸟到菜鸟之(七十八)细谈Spring(七)spring之JDBC访问数据库及配置详解

    利用spring访问数据库是我们ssh程序中必不可少的步骤,在没有hibernate之前,我们一般都用jdbc访问数据库,所以用jdbc访问数据库必不可少的要进行一些配置,spring中为我们提供了访 ...

  6. Delphi 访问数据库

    实现对SQLServer数据库的操作了.具体步骤如下:     第一步,注册ODBC数据源.这是至关重要的一步,否则 就无法实现对数据库的访问.例如,我们定义一个可访问SQL -Server服务器上z ...

  7. 访问数据库的多种方式

    最近学了数据库,正巧也想要做一个Java的大项目<图书馆管理系统>,想要一改以往把信息存储在文件中的方式,以数据库的方式来存储一些系统中的信息,便于程序对数据的访问. 那么我们的应用程序访 ...

  8. 访问数据库_常用的数据库访问方式是什么?

    常用的数据库访问方式是什么? ASP 访问数据库的方式有哪些? 在 ASP 中可以通过三种方式访问数据库: 1 . IDC ( Internet Database Connector )方式: 2 . ...

  9. ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析

    ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析 . /   // datadase odbc1.cpp : 定义应用程序的入口点.  //   #inc ...

最新文章

  1. MVC5学习系列--Razor视图(一)
  2. 用 Python 实现文件查找
  3. vue中mixin 感觉很牛逼(父子组件融合成一个新组件)
  4. three.js两个点给线条加宽度_一台电视两个房间看?衣柜、客房会隐形?这是什么神奇设计!...
  5. python如何实现日期格式的转换_python开发中时间格式如何转化?
  6. oracle监听器启动停止,Oracle 10g 监听器启动后停止的解决办法
  7. 概率论与随机过程难题整理复习
  8. MTCNN人脸检测与人脸对齐
  9. 《第一行代码——Android》封面诞生记
  10. EndNote设置自动导入文献
  11. Elasticsearch Nested类型深入详解
  12. ToolsOh第6批收录
  13. 手机投屏电视显示服务器连接失败,投屏失败怎么办?两种投屏到电视的方法教学...
  14. 数字化孪生管理平台运用现状及技术前景
  15. 介绍一款数据库管理工具-DBeaver
  16. 微软推送win11 22622.575补丁!
  17. [精]Oracle 内存结构详解
  18. 5G时代的边缘计算丨文末赠书
  19. python数据分析及可视化(一)课程介绍以及统计学的应用、介绍、分类、基本概念及描述性统计
  20. CArray和CMap使用

热门文章

  1. [转载]INF文件格式说明
  2. 小程序对象不去重合并
  3. FileChannel应用实例——拷贝文件transferFrom方法
  4. AOP||动态代理||AOP专业术语;
  5. Spring Boot注册Servlet三大组件(Servlet, Filter, Listener)
  6. n数码问题,全排列的hash(转载
  7. [YTU]_2560(C++继承(改错题))
  8. 面向对象的多态性(1)
  9. HuMoments函数
  10. Pytorch中的optimizer.zero_grad和loss和net.backward和optimizer.step的理解