C語言 使用freetds連接sql server讀取,win下可用, linux下也可以,.
以下是源碼,使用sql server的master數據庫來測試。讀取,
Win下編譯器是TDM-GCC-64,: gcc version 10.3.0 (tdm64-1)
Linux下是gcc:: gcc version 6.3.0 20170516
-----------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <wchar.h>
#include <locale.h>
#include<sybfront.h>
#include<sybdb.h>
void shuju()
{
// 編碼
//setlocale(LC_ALL, "");
//win下的cmd要執行chcp 65001, 到utf8的編碼下顯示才正常
char aaa[50]="test start ...";
printf("=> %s \t\n",aaa);
char szName[32]="sa";
char szPwd[32]="123456789";
char szDBName[32]="master"; // master 數據庫
char szServer[32]="192.168.0.9:1433";
char bianma[32]="utf8";
//初始化db-library
DBINT result_code;
dbinit();
//
LOGINREC *loginrec=dblogin();
DBSETLUSER(loginrec, szName);
DBSETLPWD(loginrec, szPwd);
DBSETLCHARSET(loginrec, bianma);
DBPROCESS *dbprocess=dbopen(loginrec, szServer);
if(dbprocess==FAIL) //如果連接失敗
{
fprintf(stderr, "Connect Fail\n"); //在標準錯誤中輸出信息
exit(EXIT_FAILURE); //進程異常退出
}else{ //如果連接成功
printf("Connect success\n");
}
if(dbuse(dbprocess, szDBName)==FAIL) //使用某個數據庫,如果使用失敗
{
dbclose(dbprocess); //關閉數據庫連接句柄, 并且回收相關資源
exit(EXIT_FAILURE); //進程異常退出
}
//開始進行數據庫中數據查詢的工作------------------
char mssqlbuf[1024]; //定義保存數據庫查詢語句的字符串
memset(mssqlbuf, 0x00, sizeof(mssqlbuf)); //開始初始化字符串
sprintf(mssqlbuf, "select name,dbid from [sysdatabases] order by [name]"); //組裝操作sql的語句, 將sql語句保存到mssqlbuf
dbcmd(dbprocess, mssqlbuf); //將剛剛組裝好的sql命令, 使用dbcmd命令保存到數據庫連接句柄的緩存中
if(dbsqlexec(dbprocess)==FAIL) //如果執行的命令失敗
{
dbclose(dbprocess); //關閉數據庫操作進程
exit(EXIT_FAILURE); //程序異常退出
}
char UserName[80]; //定義兩個變量來保存綁定出來的數據 ????
char CardNo[16];
memset(UserName,'>memset(UserName,'\0',sizeof(UserName));<',sizeof(UserName));
memset(CardNo,'>memset(CardNo,'\0',sizeof(CardNo));<',sizeof(CardNo));
//char strx[]="";
//char *strx;
char query[4096]={};
while ((result_code=dbresults(dbprocess)) !=NO_MORE_RESULTS){
if (result_code==SUCCEED){
dbbind(dbprocess, 1, STRINGBIND, 0, (BYTE*)UserName);
dbbind(dbprocess, 2, CHARBIND, (DBINT)0, (BYTE*)CardNo);
int k=1;
while (dbnextrow(dbprocess) !=NO_MORE_ROWS){
char shustr[100]="";
sprintf(shustr,"%d\tname: %s\t no: %s\n",k,UserName,CardNo);
k=k+1;
strcat(query,shustr);
}
printf("%s\n ok \n",query);
// printf("%s",strx);
}
}
dbclose(dbprocess);
}
int main(void)
{
shuju();
//return 0;
}
// linux: 手動編譯freetds , 就要在編譯時指向freetds安裝路徑
// linux編譯: gcc -o cmssqlmaster cmssql-master.c -lsybdb -I /usr/local/freetds/include -L /usr/local/freetds/lib
// linux: 如果是apt-get install freetds-dev 安裝的,編譯時就不用上邊那行那樣加參數: gcc -o cmssqlmaster cmssql-master.c -lsybdb
// win下用的freedts 去這里下載, https://github.com/ramiro/freetds/releases/tag/v0.95.95
// win下cmd終端運行輸出中文亂碼解決:在cmd狀態下輸入 chcp 65001 , utf8字符串,在終端的顯示
// win 編譯: gcc -o cmssqlmaster cmssql-master.c -lsybdb -L "D:\Proj-C\freetds-win64-vs2015\lib-nossl" -I "D:\Proj-C\freetds-win64-vs2015\include"
-----------------------------
最初這個程序連接mssql測試的例子網上很多源碼,都是使用freetds的,后來想在Windows下使用,網上都C語言版本的都是使用odbc的,但測試了很久,中文亂碼部分始終不完全解決,最終發現原來freetds有win版本的,實踐后,上述源碼編譯都可以通過.。
作者 @飛洲人飛舟魂 轉載請注明出處.
Rust 在windows上的配置比linux上要復雜些,原因是因為windows可以使用兩套ABI,其中一個是windows自己搞的MSVC工具鏈,另外一套則是GNU工具鏈.以前我一直對windows上選擇和配置迷惑不解,正好今天研究了一下,現在記錄一下.
要是執行官方提供的rustup-init.exe程序,應該會出現如下的提示.
Rust Visual C++ prerequisites
Rust requires the Microsoft C++ build tools for Visual Studio 2013 or later,but they don’t seem to be installed.
The easiest way to acquire the build tools is by installing Microsoft VisualC++ Build Tools 2019 which provides just the Visual C++ build tools:
https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2019
Please ensure the Windows 10 SDK and the English language pack components areincluded when installing the Visual C++ Build Tools.
Alternately, you can install Visual Studio 2019, Visual Studio 2017, VisualStudio 2015, or Visual Studio 2013 and during install select the “C++ tools”:
https://visualstudio.microsoft.com/downloads/
Install the C++ build tools before proceeding.
If you will be targeting the GNU ABI or otherwise know what you are doing thenit is fine to continue installation without the build tools, but otherwise,install the C++ build tools before proceeding.
Continue? (Y/n)
這里就是要求你選擇用微軟的MSVC編譯鏈,還是GNU編譯鏈.
官方推薦使用微軟的MSVC工具鏈,畢竟是在微軟的操作系統上,不管怎樣都更加兼容些.
要是執意要安裝GNU編譯鏈的話那就繼續,如果你想要Rust官方推薦的配置那就請安裝微軟的C++ build tools然后再重新打開Rust安裝程序.
這個C++ build tools如何安裝呢?有兩種方法,第一種最簡單,那就是安裝Visual studio 2013或者以上版本,軟件安裝完畢后C++ tools就已經安裝在你的電腦上了;要是你嫌Visual stdio太過于臃腫,你也可以選擇單獨到這個頁面(https://visualstudio.microsoft.com/zh-hans/downloads/)安裝這個軟件包,如下:
在這里
下載這個
安裝的時候一定注意這些都勾選上.
安裝時
安裝完畢后安裝器應當有如下界面 (我還安裝了vs 2017,你完全可以不用裝):
裝完了之后,你就可以再啟動rustup-init.exe來安裝Rust.