以下是C程序连接MSSQL的最简单代码示例,使用FreeTDS库实现快速连接:
#include <stdio.h>
#include <sybdb.h>
#include <sybfront.h>
int main() {
LOGINREC *login;
DBPROCESS *dbproc;
dbinit();
dblogin(&login);
dbuse(login, "server=your_server;database=your_db;uid=your_user;pwd=your_pass");
dbcmd(dbproc, "SELECT * FROM your_table");
dbsqlexec(dbproc);
while (dbnextrow(dbproc) != NO_MORE_ROWS) {
printf("%s\n", dbdata(dbproc, 1));
}
dbclose(dbproc);
dblogin(login);
dbexit();
return 0;
}
编译:gcc test.c -lsybdb -o test
首先安装FreeTDS库,这是最简单的方式。Linux下用sudo apt-get install freetds-dev。配置freetds.conf文件,添加你的MSSQL服务器信息,比如[yourserver] host=192.168.1.100 port=1433 tds version=7.0。然后在代码里用dbuse(login, "yourserver;database=mydb;uid=user;pwd=pass");就连上了。测试查询超级快,几分钟上手。
用ODBC连接MSSQL也很轻松。先安装unixODBC和Microsoft ODBC Driver for SQL Server。配置odbc.ini:
[DSN]
Driver=ODBC Driver 17 for SQL Server
Server=yourserver
Database=mydb
然后C代码:
#include <sql.h>
#include <sqlext.h>
SQLHENV env; SQLAllocEnv(&env);
SQLHDBC dbc; SQLAllocConnect(env, &dbc);
SQLConnect(dbc, (SQLCHAR*)"DSN", SQL_NTS, (SQLCHAR*)"user", SQL_NTS, (SQLCHAR*)"pass", SQL_NTS);
这方法跨平台,Windows直接用SQL Server Native Client驱动。
在Windows上,用SQLAPI++库最方便。下载sqlapi.h和库文件,代码简短:
#include <SQLAPI.h>
SAConnection con;
con.Connect("yourserver", "user", "pass", "mydb");
SACommand cmd(&con);
cmd.setSQL("SELECT * FROM table");
cmd.Execute();
while (cmd.FetchNext()) {
printf("%s", cmd.Field(1).asString());
}
超级直观,几行代码搞定连接和查询。
遇到连接失败常见问题是端口不对,默认1433,或者防火墙挡了。检查server名,用IP试试。密码里有特殊字符要转义。FreeTDS版本要匹配MSSQL,7.4版支持SQL Server 2019。用dblib.h头文件,确保库路径对了,gcc -I/usr/include/freetds -L/usr/lib -lsybdb。
高级点,用ctlib接口更稳定:
CS_CONTEXT *ctx; cs_ctx_alloc(&ctx);
CS_CONNECTION *conn; cs_con_alloc(ctx, &conn);
cs_con_props(conn, CS_SET, CS_USERNAME, "user", CS_NULLTERM, NULL);
cs_convert_convert(ctx, NULL, CS_FLOAT_TYPE, (CS_VOID *) &val, CS_FLOAT_SIZE, NULL, CS_CHAR_TYPE, buf, CS_MAX_CHAR, &outlen); 但入门还是dblib简单。
实际项目中,先ping服务器通不通,telnet server 1433。实例化数据库名别忘,authentication用SQL Server Authentication别用Windows的。查询大表用dbcmd分批,避免内存爆。
FAQ
Q: 连接不上MSSQL怎么办?
A: 检查freetds.conf配置,server地址、端口1433,tds version=7.4,防火墙允许。
Q: Windows下怎么编译?
A: 用Visual Studio,包含SQLNCLI.lib,链接odbc32.lib。
Q: 如何处理中文乱码?
A: cs_lang_props设置CS_LANG=chinese,执行SET LANG chinese前缀。
Q: 大数据量查询慢?
A: 用dbcmd批量,设置blksz增大块大小,避免频繁网络交互。
Q: 免费库够用吗?
A: FreeTDS完全免费,功能齐全,够大多数项目用。