一、建立测试数据库和表

建表,设置登录账号密码等。

由于项目已有数据库,所以此步骤略过。

二、设置 ODBC 数据源

搜索打开系统自带的 odbc 数据源,选择 系统 DSN,添加 SQL Server。

添加过程中,名称自取(例如:testlyl),服务器选择数据库的 IP,然后填写登录名(abc)、密码(def010)等。

三、代码示例

使用 visual stadio 2019 建立 C工程,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include<stdio.h>
#include<windows.h>
#include<sql.h>
#include<sqlext.h>
#include<sqltypes.h>
int main()
{
SQLRETURN ret;
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;

ret = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);//申请环境句柄
ret = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
ret = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);//申请数据库连接句柄

ret = SQLConnect(hdbc, (SQLCHAR*)"testlyl", SQL_NTS, (SQLCHAR*)"abc", SQL_NTS, (SQLCHAR*)"def010", SQL_NTS);
/*testlyl为配置的ODBC数据源名称,这里根据自己的配置进行修改*/
if (!(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO))
{
printf("连接数据库失败!\n");
return -1;
}

ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
/*执行sql语句*/
SQLCHAR sql1[] = "use DCWLW";
SQLCHAR sql2[] = "SELECT [report_5001_id]\
, [report_str]\
, isnull([row_state],0) as row_state\
, [create_date]\
, [barcode]\
, [states]\
, [dy]\
, [dl]\
, [wdmax]\
, [wdmin]\
, [soc]\
, [err_str]\
, [err_str2]\
, [err_str3]\
, [err_str4]\
FROM[DCWLW].[dbo].[report_5001]\
where cast([dl] as decimal) > 50.0 and create_date > '2021'";
ret = SQLExecDirect(hstmt, sql1, SQL_NTS);
ret = SQLExecDirect(hstmt, sql2, SQL_NTS);
if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
{
SQLCHAR str1[50], str2[50], str3[50], str4[50], str5[50], str6[50];
//SQLINTEGER len_str1, len_str2, len_str3, len_str4, len_str5, len_str6;
SQLLEN len_str1, len_str2, len_str3, len_str4, len_str5, len_str6;
while (SQLFetch(hstmt) != SQL_NO_DATA)
{
SQLGetData(hstmt, 1, SQL_C_CHAR, str1, 50, &len_str1); //获取第一列数据
SQLGetData(hstmt, 2, SQL_C_CHAR, str2, 50, &len_str2);
SQLGetData(hstmt, 3, SQL_C_CHAR, str3, 50, &len_str3);
SQLGetData(hstmt, 4, SQL_C_CHAR, str4, 50, &len_str4);
SQLGetData(hstmt, 5, SQL_C_CHAR, str5, 50, &len_str5);
SQLGetData(hstmt, 6, SQL_C_CHAR, str6, 50, &len_str6);
printf("%s\t%s\t%s\t%s\t%s\t%s\n", str1, str2, str3, str4, str5, str6);
}
}

SQLFreeHandle(SQL_HANDLE_DBC, hdbc);//释放连接句柄
SQLFreeHandle(SQL_HANDLE_ENV, henv);//释放环境句柄
return 0;
}

注意,出现错误提示:(SQLCHAR*) 无法与 (SQLWCHAR*) 兼容,需要将工程的属性unicode 改为 多字节字符集

四、最后

后来使用了 ADO,odbc 就到这儿了。