用C语言怎么实现与数据库的连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C语言怎么实现与数据库的连接相关的知识,希望对你有一定的参考价值。

#include<mysql/mysql.h>

#include<stdio.h>

intmain()

MYSQL*conn;

MYSQL_RES*res;

MYSQL_ROWrow;

char*server="localhost";//本地连接

char*user="root";//

char*password="525215980";//mysql密码

char*database="student";//数据库名

char*query="select*fromclass";//需要查询的语句

intt,r;

conn=mysql_init(NULL);

if(!mysql_real_connect(conn,server,user,password,database,0,NULL,0))

printf("Errorconnectingtodatabase:%s\\n",mysql_error(conn));

else

printf("Connected...\\n");

t=mysql_query(conn,query);

if(t)

printf("Errormakingquery:%s\\n",mysql_error(conn));

else

printf("Querymade...\\n");

res=mysql_use_result(conn);

if(res)

while((row=mysql_fetch_row(res))!=NULL)

//printf("num=%d\\n",mysql_num_fields(res));//列数

for(t=0;t<mysql_num_fields(res);t++)

printf("%8s",row[t]);

printf("\\n");

mysql_free_result(res);

mysql_close(conn);

return0;

扩展资料

C语言使用注意事项:

1、指针是c语言的灵魂,一定要灵活的使用它:

(1)、指针的声明,创建,赋值,销毁等

(2)、指针的类型转换,传参,回调等

2、递归调用也会经常用到:

(1)、递归遍历树结构

(2)、递归搜索

参考技术A

使用ODBC进行数据库编程。

1、配置ODBC数据源

2、使用SQL函数进行连接。

对于1、配置数据源如果楼主不会的话,可以百度,很简单。配置完以后就可以编程操作数据库啦。

对于2、使用SQL函数进行连接,这里给个代码片段,楼主 照着做就行啦。

#include<windows.h>   
#include<sql.h>  
#include<sqlext.h>  
void   main()   
 
    HENV   henv;  //环境句柄 
    HDBC   hdbc;  //数据源句柄 
    HSTMT   hstmt;  //执行语句句柄 
    unsigned   char   datasource[]="数据源名称";  //即ODBC源中设置的源名称 
    unsigned   char   user[]= "用户名";  //数据库的帐户名 
    unsigned   char   pwd[]= "密码";  //数据库的密码 
    unsigned   char   search[]="select   xm   from   stu   where   xh=0";  
    SQLRETURN   retcode; //记录各SQL函数的返回情况 
    // 分配环境句柄 
    retcode= SQLAllocEnv(&henv);  // 等介于 SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); 
    // 设置ODBC环境版本号为3.0 
    retcode= SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); 
    // 分配连接句柄 
    retcode= SQLAllocConnect(henv,&hdbc); // 等介于 SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 
    //设置连接属性,登录超时为*rgbValue秒(可以没有)
     // SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)(rgbValue), 0);
 
    //直接连接数据源 
    // 如果是windows身份验证,第二、三参数可以是NULL,也可以是任何字串 
    //SQL_NTS 即 "Null-Terminated   String"  
    retcode= SQLConnect(hdbc,datasource, SQL_NTS, user, SQL_NTS , pwd, SQL_NTS );  
    //分配语句句柄 
    retcode= SQLAllocStmt(hdbc,&hstmt);  // 等介于 SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 
    //直接执行查询语句
    retcode=SQLExecDirect(hstmt,search,SQL_NTS);  
    //将数据缓冲区绑定数据库中的相应字段(i是查询结果集列号,queryData是绑定缓冲区,BUFF_LENGTH是缓冲区长度) 
    SQLBindCol(hstmt, i, SQL_C_CHAR, queryData[i-1], BUFF_LENGTH, 0); 
    //遍历结果集到相应缓冲区 queryData
    SQLFetch(hstmt);   
    /* 
     *对遍历结果的相关操作,如显示等
     */ 
    //注意释放顺序,否则会造成未知错误! 
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    SQLDisconnect(hdbc);
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
  


代码看上去很复杂,其实都可以直接复制。其中需要改的是数据源名称、数据库用户名、数据库密码和SQL语句。

然后就是SQLFetch后得到结果集后,如何使用的问题了。

在下面的注释部分 填写你的处理代码即可。

    /*
     *对遍历结果的相关操作,如显示等
     */

参考技术B   举个例子,连接SQL:
  // 打开数据库
  strDBClass.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Jet OLEDB:Database Password=%s"), m_strUnEntryptMdbFilePath,m_strMDBPassword);
  // 创建连接
  HRESULT hr = m_pConnection.CreateInstance(_uuidof(Connection));
  _ConnectionPtr m_pConnection->Open(m_strDBClass,_T(""),_T(""),adConnectUnspecified);
  // 声明表单指针
  _RecordsetPtr pBandRecordset;
  pBandRecordset.CreateInstance(__uuidof(Recordset));
  // 执行语句
  CString strSQL(L"SELECT * FROM [Band]");
  m_pConnection->Execute((LPCTSTR)strSQL,NULL,0);
  // 提取某一项 例如BandInfo
  int iBandInfo = wcscmp(colum, L"BandInfo");
  while(!recordsetPtr->adoEOF)
  
  var = recordsetPtr->GetCollect(colum);
  if(var.vt != VT_NULL)
  strName = (LPCSTR)_bstr_t(var);
  recordsetPtr->MoveNext();
  
参考技术C 可以去看一下 ado 或者 odbc

C语言如何实现IP分类

现有TXT文档,内存放有上千万IP地址,按一行一个存放。现要按IP基准库(IP基准库可任选)对其内所有IP进行分类,只要按基准库统计出此TXT文档内每个国家对应的IP数目即可。
用C语言怎么编程实现?
拜托各位大大指点下思路~~

回一楼:首先3Q~~,“只要读取一个IP地址,用strcmp()函数与基准对比一下”,关键那些IP段太多了,怎么逐个对比?难道要每个段都输入进去?不能调用基准库的接口函数之类的吗?

回一楼2:
找不到接口函数,也不知道怎么用...
我找了个纯真IP数据库,里面有个“QQWry.dat”的文件,不知道咋用

谢谢各位的热心回答,4楼的算法不错,但是那个IP库的数据改不了,地址段也不连续,我现在是找了个源代码。直接调里面的函数,得到对应IP的国家,然后再于国家列表匹配,计算出每个国家的IP数,已经实现了,就是有点慢。
还得优化下,争取快一点~~

PS:前面跟lwlwwzc兄在百度Hi上请教了好一会,l兄不厌其烦的为我指点,分数给l兄吧~
再次感谢各位~

我觉得可以先对这个txt文件进行压缩,压缩成二进制的文件,然后通过读取这个二进制文件来得到每条IP,并和IP基准库比较,这样速度能快点,IP段再多,也得一个个比啊,要不就设计一个算法,来减少冗余的比较次数 参考技术A 严重同意楼上大侠的说法,ip地址实质只是一个唯一的int型的整数。比较字符太浪费了,转换成整数再比较就容易了许多,让你在一堆数字里挑出100以内的,1000以内的,1024以内的,就没有那么困难了。 参考技术B 原来是这样啊(下次提问请一次性提供所有与问题相关的可提供内容),你可用记事本(或者其它工具)打开这个文件,看看内部的结构,然后自己写一个读取函数,这只是个数据文件,没有接口函数.
****************************************
如果有接口函数的话当然可以.

*****************************************

所谓的IP基准应该是一些IP地址段,例如:

192.168.*.* 本地

这样的话,只要读取一个IP地址,用strcmp()函数与基准对比一下,看看IP地址前几段是否与对应的基准相同,如果相同,就是对应地区的IP地址.

不知是否明白?

或者给出一个具体的分类方法和所谓的IP基准库,以便得出更详细的算法实现.
参考技术C 考虑使用正则表达式 参考技术D 基准库是什么样子的?

不要用strcmp,效率太差了,将Ip地址转换成32位整数,将基准库中的IP段也转换成32位整数

给你举个例子, 下面的程序判断 IP1 和 IP2 是否落在192.168.0.0~192.168.255.255 范围内。 使用到了 inet_aton() 和 ntohl() 两个库函数,我的头文件引用声明是在linux下的,不知道VC上该引什么头文件,你看一下msdn里的帮助就知道了。
你可以参考我这个程序,首先把IP基准库里的IP范围都度进来并且转换成整数放在一个数组中,然后开始读取txt文件,每读一个,转一个成整数,然后和基准库数组里的范围进行比较,然后统计,这样最方便。

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
void main()

const char *IP1 = "192.168.100.1";
const char *IP2 = "192.169.200.55";
const char *range1 = "192.168.0.0";
const char *range2 = "192.168.255.255";
unsigned int left, right, ip;
struct in_addr addr;

inet_aton(range1, &addr);
left = ntohl(addr.s_addr);

inet_aton(range2, &addr);
right = ntohl(addr.s_addr);

inet_aton(IP1, &addr);
ip = ntohl(addr.s_addr);
if (ip >= left && ip <= right)
printf("%s is inside %s-%s\n", IP1, range1, range2);
else
printf("%s is NOT inside %s-%s\n", IP1, range1, range2);

inet_aton(IP2, &addr);
ip = ntohl(addr.s_addr);
if (ip >= left && ip <= right)
printf("%s is inside %s-%s\n", IP2, range1, range2);
else
printf("%s is NOT inside %s-%s\n", IP2, range1, range2);

以上是关于用C语言怎么实现与数据库的连接的主要内容,如果未能解决你的问题,请参考以下文章

unity怎么与c语言进行连接

c语言怎么连接mysql数据库 代码

怎么在linux环境下通过c/c++语言连接oracle数据库

怎样用c语言给mysql数据库插数据

linux下怎么用纯c语言连接mongodb数据库进行读写操作

已知IP和端口,用c语言怎么判断能不能连接网络