Win32 API 和 ODBC 访问数据库一
准备用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 访问数据库一相关推荐
- c语言访问数据库 不用odbc,急问ODBC访问数据库问题
急问ODBC访问数据库问题 c语言用ODBC访问access,编译时出错,都是头文件的错误,实在搞不明白,恳求各位大牛大虾们指教小弟!!急~~~~~~~~~~ #include #include #i ...
- ODBC访问数据库(转载)
使用ODBC API之前要用到的头文件和LIB库 #include "sql.h" // This is the the main include for ...
- 使用ODBC访问数据库(一)
使用ODBC API之前要用到的头文件和LIB库 #include "sql.h" // This is the the main include for ...
- 可遇不可求的BUG之采用MYSQL odbc 3.51访问数据库返回值缺失
一句话 巧妇难为无米之炊,驱动还是要及时更新啊... 闲话休说,上图: 1.数据库中存储的值为 "布尔玛" 2.用3.51版本的MYSQL ODBC 驱动访问MYSQL 5.0 数 ...
- Java程序员从笨鸟到菜鸟之(七十八)细谈Spring(七)spring之JDBC访问数据库及配置详解
利用spring访问数据库是我们ssh程序中必不可少的步骤,在没有hibernate之前,我们一般都用jdbc访问数据库,所以用jdbc访问数据库必不可少的要进行一些配置,spring中为我们提供了访 ...
- Delphi 访问数据库
实现对SQLServer数据库的操作了.具体步骤如下: 第一步,注册ODBC数据源.这是至关重要的一步,否则 就无法实现对数据库的访问.例如,我们定义一个可访问SQL -Server服务器上z ...
- 访问数据库的多种方式
最近学了数据库,正巧也想要做一个Java的大项目<图书馆管理系统>,想要一改以往把信息存储在文件中的方式,以数据库的方式来存储一些系统中的信息,便于程序对数据的访问. 那么我们的应用程序访 ...
- 访问数据库_常用的数据库访问方式是什么?
常用的数据库访问方式是什么? ASP 访问数据库的方式有哪些? 在 ASP 中可以通过三种方式访问数据库: 1 . IDC ( Internet Database Connector )方式: 2 . ...
- ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析
ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析 . / // datadase odbc1.cpp : 定义应用程序的入口点. // #inc ...
最新文章
- MVC5学习系列--Razor视图(一)
- 用 Python 实现文件查找
- vue中mixin 感觉很牛逼(父子组件融合成一个新组件)
- three.js两个点给线条加宽度_一台电视两个房间看?衣柜、客房会隐形?这是什么神奇设计!...
- python如何实现日期格式的转换_python开发中时间格式如何转化?
- oracle监听器启动停止,Oracle 10g 监听器启动后停止的解决办法
- 概率论与随机过程难题整理复习
- MTCNN人脸检测与人脸对齐
- 《第一行代码——Android》封面诞生记
- EndNote设置自动导入文献
- Elasticsearch Nested类型深入详解
- ToolsOh第6批收录
- 手机投屏电视显示服务器连接失败,投屏失败怎么办?两种投屏到电视的方法教学...
- 数字化孪生管理平台运用现状及技术前景
- 介绍一款数据库管理工具-DBeaver
- 微软推送win11 22622.575补丁!
- [精]Oracle 内存结构详解
- 5G时代的边缘计算丨文末赠书
- python数据分析及可视化(一)课程介绍以及统计学的应用、介绍、分类、基本概念及描述性统计
- CArray和CMap使用
热门文章
- [转载]INF文件格式说明
- 小程序对象不去重合并
- FileChannel应用实例——拷贝文件transferFrom方法
- AOP||动态代理||AOP专业术语;
- Spring Boot注册Servlet三大组件(Servlet, Filter, Listener)
- n数码问题,全排列的hash(转载
- [YTU]_2560(C++继承(改错题))
- 面向对象的多态性(1)
- HuMoments函数
- Pytorch中的optimizer.zero_grad和loss和net.backward和optimizer.step的理解