user-0 提问: 求助：C语言如何连接远程数据库SQL SERVER

回复:
user: user-0
content: @jiqiang01234 不能引用我就直接@ 了 Windows系统，听说微软不推荐用ADO所以我才学的ODBC。。 其实我就只想知道connect那部分，关于描述配置的那个字符串（ADO里面也是相同的吧），怎么指定连接远程主机的数据库，怎么修改才能实现？

user: user-0
content: 引用 1 楼 smallnat 的回复:首先表示你的问题真多。  --------我表示我很无聊 随便什么程序链接数据库都会要有地址、用户名、密码（当然也有不需要密码的），所以跟本地还是远程主机没有关系。本地的地址是127.0.0.1 .远程的，譬如你隔壁的那个电脑是192.168.1.100 是否涉及网络编程，这个，可以肯定是要涉及。但具体到你的代码你几乎可以完全不了解，想想你本地是如何连接的，本地难道不是通过网络协议传输的么？ 连接数据库的方式有很多种。MSSQL我还真不熟~~例如oracle。它就提供了oci.还有很好用牛人开源的otl.当然也可以使用通用的ODBC.（这个MSSQL也有的）。所以你可以随便先用一种方式尝试着连数据库。 不同的接口，使用sql可能有点不一样。但基本上是会写sql就能查出数据。对数据库的DML操作会了就基本能解决大部分的问题。 导到链表？不太明白这个概念。可能是我比较落伍。。但是数据从数据库读取出来后，你肯定要放到c/c++的变量（结构、类）里。然后看是不是需要计算的（可能拿出来的就是需要的，或者需要两个数加减乘除一下，这个就看你要什么了）。然后就基本上最后的数据输出（否则好像拿数据很没意义一样~~:( ）。至于输出到哪，我在上学的时候貌似只会用cout/printf打印到屏幕上。。当然你可以写到文件，或者显示到某个一个界面中（MFC....） 听上去是不是很简单，，，貌似真的就是这样。。 和普通读写文件的区别。。这个区别我可不敢说小，虽然实质上都是操作文件。作为数据库，你认为它把数据存在哪里？ 学过LInux的应该知道一个概念（window你得问盖哥，，他要能放到宇宙黑洞那也是牛的），一切皆文件。。。所以可以这样说，读数据库也是读文件，只是通过数据库提供的接口或者外面继续封装的接口操作的。有数据库的好处，是不用关心很多文件层面的东西了。你用mssql这种结构化的数据库，肯定是建一张表，然后将数据存进去，读出来。。你只要设计好表就行了。至于它是怎么写到文件里，文件在哪，文件中的格式是怎样的，你貌似统统可以不知道。。 sql貌似只能操作数据库，，而且只能操作结构化的数据库，类似oracle。mysql。mssql等。你得知道sql是什么的简写。。~  貌似我也是随便说说，你随便看。~  谢谢你的回复。首先表示我的问题不多吧，概括起来也就两个——如何连接远程数据库（用ODBC API）；C语言编写操作数据库程序的思路是怎样的。可能我说的太乱了吧= = 第一个问题你的意思是连接本地数据库和远程数据库从本质上是一样的，API函数里包含了网络配置的问题所以我不用考虑是这样吗？那么问题又来了：编程的时候我写的IP地址肯定是常量，可每次开机IP地址都会变啊！那岂不是我的电脑得一直保持开机状态，否则重启一下客户端不就连不上了吗？ 第二个问题我觉得还是先参考下别人的源代码吧，这里也说不好 下面是连接部分的代码实现，能不能给出详细修改方法  	SQLHENV henv = SQL_NULL_HENV; 	SQLHDBC hdbc = SQL_NULL_HDBC;  	SQLHSTMT hstmt = SQL_NULL_HSTMT;    	SQLRETURN retcode; 	SQLCHAR Servername[] = "Test"; 	SQLCHAR Username[] = "sa"; 	SQLCHAR Password[] = "123465";  	SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); 	SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0); 	SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 	SQLConnect(hdbc, Servername, SQL_NTS, Username, SQL_NTS, Password, SQL_NTS);

user: user-1
content: 首先表示你的问题真多。  --------我表示我很无聊 随便什么程序链接数据库都会要有地址、用户名、密码（当然也有不需要密码的），所以跟本地还是远程主机没有关系。本地的地址是127.0.0.1 .远程的，譬如你隔壁的那个电脑是192.168.1.100 是否涉及网络编程，这个，可以肯定是要涉及。但具体到你的代码你几乎可以完全不了解，想想你本地是如何连接的，本地难道不是通过网络协议传输的么？ 连接数据库的方式有很多种。MSSQL我还真不熟~~例如oracle。它就提供了oci.还有很好用牛人开源的otl.当然也可以使用通用的ODBC.（这个MSSQL也有的）。所以你可以随便先用一种方式尝试着连数据库。 不同的接口，使用sql可能有点不一样。但基本上是会写sql就能查出数据。对数据库的DML操作会了就基本能解决大部分的问题。 导到链表？不太明白这个概念。可能是我比较落伍。。但是数据从数据库读取出来后，你肯定要放到c/c++的变量（结构、类）里。然后看是不是需要计算的（可能拿出来的就是需要的，或者需要两个数加减乘除一下，这个就看你要什么了）。然后就基本上最后的数据输出（否则好像拿数据很没意义一样~~:( ）。至于输出到哪，我在上学的时候貌似只会用cout/printf打印到屏幕上。。当然你可以写到文件，或者显示到某个一个界面中（MFC....） 听上去是不是很简单，，，貌似真的就是这样。。 和普通读写文件的区别。。这个区别我可不敢说小，虽然实质上都是操作文件。作为数据库，你认为它把数据存在哪里？ 学过LInux的应该知道一个概念（window你得问盖哥，，他要能放到宇宙黑洞那也是牛的），一切皆文件。。。所以可以这样说，读数据库也是读文件，只是通过数据库提供的接口或者外面继续封装的接口操作的。有数据库的好处，是不用关心很多文件层面的东西了。你用mssql这种结构化的数据库，肯定是建一张表，然后将数据存进去，读出来。。你只要设计好表就行了。至于它是怎么写到文件里，文件在哪，文件中的格式是怎样的，你貌似统统可以不知道。。 sql貌似只能操作数据库，，而且只能操作结构化的数据库，类似oracle。mysql。mssql等。你得知道sql是什么的简写。。~  貌似我也是随便说说，你随便看。~

user: user-2
content: 什么操作系统？windows比较简单，用把ADO用c++封装一下，改成C接口导出dll就行了。而且ado访问，可以直接用*.udl文件中的字符串配置，不需要什么odbc的一堆繁琐DSN的配置  #ifndef _ADO_SQL_H_ #define _ADO_SQL_H_  #ifndef ADO_API 	#ifdef __cplusplus 		#define ADO_API extern "C" __declspec(dllimport)	 	#else 		#define ADO_API __declspec(dllimport)	 	#endif #else 	#undef ADO_API 	#ifdef __cplusplus 		#define ADO_API extern "C" __declspec(dllexport)	 	#else 		#define ADO_API __declspec(dllexport)	 	#endif	 #endif  #ifndef STDCALL #define STDCALL __stdcall  #endif  #ifndef Bool #define Bool int #endif  #ifndef True #define True 1 #endif  #ifndef False #define False 0 #endif    struct ADOConn;  #define ADO_FIELD_NAME_LEN		64 #define ADO_FIELD_VALUE_LEN		(8 * 1024) struct ADOFieldInfo { 	char name[ADO_FIELD_NAME_LEN]; 	char value[ADO_FIELD_VALUE_LEN]; };  typedef void (STDCALL* ADOQueryCallback)(const struct ADOFieldInfo* info, int fieldCount, void* user);  ADO_API Bool STDCALL ADO_Initialize();  ADO_API void STDCALL ADO_Uninitialize();   ADO_API struct ADOConn* STDCALL ADO_CreateConnection(const char* connString); ADO_API void STDCALL ADO_DestroyConnection(struct ADOConn* conn);  ADO_API Bool STDCALL ADO_Exec(struct ADOConn* conn, const char* sql); ADO_API void STDCALL ADO_Query(struct ADOConn* conn, const char* sql, ADOQueryCallback cb, void* user);  #endif

user: user-3
content: 建议楼主通读SQL Server中文版联机帮助。

user: user-4
content: Linux下下载 Connector/C库 (http://dev.mysql.com/downloads/connector/c/) 使用其中的API就可以连接到MySQL数据库， 另外MySQL默认只能本地访问(防止攻击), 所以需要设置外部访问。  Windows下可以使用MySQLfor VS，或者下载Connector/C++库(http://dev.mysql.com/downloads/connector/cpp/)

user: user-0
content: 引用 7 楼 jiqiang01234 的回复:[quote=引用 6 楼 SJunTe 的回复:] @jiqiang01234 不能引用我就直接@ 了 Windows系统，听说微软不推荐用ADO所以我才学的ODBC。。 其实我就只想知道connect那部分，关于描述配置的那个字符串（ADO里面也是相同的吧），怎么指定连接远程主机的数据库，怎么修改才能实现？  微软不推荐ado的出处在哪里？ ado可以直接用配置连接串，可用udl文件保存连接串，然后用记事本打开就能看到    udl文件可通过文本编辑工具直接打开，如下  [oledb] ; Everything after this line is an OLE DB initstring Provider=SQLNCLI.1;Password=Byls27625771;Persist Security Info=True;User ID=sa;Initial Catalog=TideSystem;Data Source=192.168.5.176  [/quote] 之前在某个CSDN博主上看到的，现在一查好像确实没这回事。。 不过你的图教会了我怎么获取连接字符串，十分感谢！！

user: user-1
content: 引用 5 楼 SJunTe 的回复:[quote=引用 1 楼 smallnat 的回复:]     首先表示你的问题真多。  --------我表示我很无聊 随便什么程序链接数据库都会要有地址、用户名、密码（当然也有不需要密码的），所以跟本地还是远程主机没有关系。本地的地址是127.0.0.1 .远程的，譬如你隔壁的那个电脑是192.168.1.100 是否涉及网络编程，这个，可以肯定是要涉及。但具体到你的代码你几乎可以完全不了解，想想你本地是如何连接的，本地难道不是通过网络协议传输的么？ 连接数据库的方式有很多种。MSSQL我还真不熟~~例如oracle。它就提供了oci.还有很好用牛人开源的otl.当然也可以使用通用的ODBC.（这个MSSQL也有的）。所以你可以随便先用一种方式尝试着连数据库。 不同的接口，使用sql可能有点不一样。但基本上是会写sql就能查出数据。对数据库的DML操作会了就基本能解决大部分的问题。 导到链表？不太明白这个概念。可能是我比较落伍。。但是数据从数据库读取出来后，你肯定要放到c/c++的变量（结构、类）里。然后看是不是需要计算的（可能拿出来的就是需要的，或者需要两个数加减乘除一下，这个就看你要什么了）。然后就基本上最后的数据输出（否则好像拿数据很没意义一样~~:( ）。至于输出到哪，我在上学的时候貌似只会用cout/printf打印到屏幕上。。当然你可以写到文件，或者显示到某个一个界面中（MFC....） 听上去是不是很简单，，，貌似真的就是这样。。 和普通读写文件的区别。。这个区别我可不敢说小，虽然实质上都是操作文件。作为数据库，你认为它把数据存在哪里？ 学过LInux的应该知道一个概念（window你得问盖哥，，他要能放到宇宙黑洞那也是牛的），一切皆文件。。。所以可以这样说，读数据库也是读文件，只是通过数据库提供的接口或者外面继续封装的接口操作的。有数据库的好处，是不用关心很多文件层面的东西了。你用mssql这种结构化的数据库，肯定是建一张表，然后将数据存进去，读出来。。你只要设计好表就行了。至于它是怎么写到文件里，文件在哪，文件中的格式是怎样的，你貌似统统可以不知道。。 sql貌似只能操作数据库，，而且只能操作结构化的数据库，类似oracle。mysql。mssql等。你得知道sql是什么的简写。。~  貌似我也是随便说说，你随便看。~  谢谢你的回复。首先表示我的问题不多吧，概括起来也就两个——如何连接远程数据库（用ODBC API）；C语言编写操作数据库程序的思路是怎样的。可能我说的太乱了吧= = 第一个问题你的意思是连接本地数据库和远程数据库从本质上是一样的，API函数里包含了网络配置的问题所以我不用考虑是这样吗？那么问题又来了：编程的时候我写的IP地址肯定是常量，可每次开机IP地址都会变啊！那岂不是我的电脑得一直保持开机状态，否则重启一下客户端不就连不上了吗？ 第二个问题我觉得还是先参考下别人的源代码吧，这里也说不好 下面是连接部分的代码实现，能不能给出详细修改方法  	SQLHENV henv = SQL_NULL_HENV; 	SQLHDBC hdbc = SQL_NULL_HDBC;  	SQLHSTMT hstmt = SQL_NULL_HSTMT;    	SQLRETURN retcode; 	SQLCHAR Servername[] = "Test"; 	SQLCHAR Username[] = "sa"; 	SQLCHAR Password[] = "123465";  	SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); 	SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0); 	SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 	SQLConnect(hdbc, Servername, SQL_NTS, Username, SQL_NTS, Password, SQL_NTS);  [/quote]   问题1，是的。IP是要固定的，或者是接近固定的（用域名，域名后面是集群。） 问题2，自己看吧~那样有意思。

user: user-2
content: 引用 6 楼 SJunTe 的回复:@jiqiang01234 不能引用我就直接@ 了 Windows系统，听说微软不推荐用ADO所以我才学的ODBC。。 其实我就只想知道connect那部分，关于描述配置的那个字符串（ADO里面也是相同的吧），怎么指定连接远程主机的数据库，怎么修改才能实现？  微软不推荐ado的出处在哪里？ ado可以直接用配置连接串，可用udl文件保存连接串，然后用记事本打开就能看到    udl文件可通过文本编辑工具直接打开，如下  [oledb] ; Everything after this line is an OLE DB initstring Provider=SQLNCLI.1;Password=Byls27625771;Persist Security Info=True;User ID=sa;Initial Catalog=TideSystem;Data Source=192.168.5.176