新聞中心
C語(yǔ)言是一種強(qiáng)大的編程語(yǔ)言,用于開(kāi)發(fā)計(jì)算機(jī)程序。其中,將數(shù)據(jù)寫(xiě)入到數(shù)據(jù)庫(kù)中是常見(jiàn)的操作。本文將詳細(xì)闡述如何使用C語(yǔ)言逐條寫(xiě)入數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法。

一、數(shù)據(jù)庫(kù)的選擇
在使用C語(yǔ)言編寫(xiě)程序時(shí),我們需要選擇一種適合的數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)數(shù)據(jù)。常見(jiàn)的數(shù)據(jù)庫(kù)有MySql、Oracle、PostgreSQL、SQLite等。這些數(shù)據(jù)庫(kù)的使用方法雖然有所差異,但基本的思路是相同的,本文以SQLite為例進(jìn)行介紹。
SQLite是一種輕量級(jí)數(shù)據(jù)庫(kù),它不需要服務(wù)器進(jìn)程,在讀取和寫(xiě)入數(shù)據(jù)時(shí)可以直接使用文件,因此在許多嵌入式系統(tǒng)中使用較為廣泛。它提供更簡(jiǎn)單的數(shù)據(jù)模型,采用靜態(tài)類(lèi)型設(shè)計(jì),數(shù)據(jù)類(lèi)型主要包括NULL、INTEGER、REAL、TEXT、BLOB等,使用起來(lái)方便。
二、連接數(shù)據(jù)庫(kù)
與其他數(shù)據(jù)庫(kù)類(lèi)似,使用SQLite連接數(shù)據(jù)庫(kù)需要先進(jìn)行初始化和打開(kāi)數(shù)據(jù)庫(kù)。首先需要將SQLite相關(guān)的頭文件包含到代碼中,然后使用sqlite3_open函數(shù)來(lái)打開(kāi)數(shù)據(jù)庫(kù),返回一個(gè)指向sqlite3類(lèi)型的指針,該指針即為數(shù)據(jù)庫(kù)連接句柄。
例如,使用以下代碼連接名為”test.db”的數(shù)據(jù)庫(kù):
#include
#include
int mn(int argc, char **argv)
{
sqlite3 *db;
int rc;
rc = sqlite3_open(“test.db”, &db);
if (rc != SQLITE_OK) {
fprintf(stderr, “Can’t open database: %s\n”, sqlite3_errmsg(db));
return 0;
}
sqlite3_close(db);
return 0;
}
在以上代碼中,sqlite3_open函數(shù)將在打開(kāi)數(shù)據(jù)庫(kù)時(shí)返回一個(gè)整數(shù)值表示打開(kāi)狀態(tài)。如果返回值不為SQLITE_OK,表示數(shù)據(jù)庫(kù)打開(kāi)失敗,此時(shí)需要使用sqlite3_errmsg函數(shù)打印出數(shù)據(jù)庫(kù)連接錯(cuò)誤信息。
三、準(zhǔn)備SQL語(yǔ)句
在插入數(shù)據(jù)之前,需要先準(zhǔn)備要插入的SQL語(yǔ)句。SQLite中,可以使用sqlite3_prepare_v2函數(shù)來(lái)準(zhǔn)備SQL語(yǔ)句。該函數(shù)需要三個(gè)參數(shù):數(shù)據(jù)庫(kù)連接句柄、SQL語(yǔ)句字符串、SQL語(yǔ)句字符串長(zhǎng)度。它將返回一個(gè)指向sqlite3_stmt類(lèi)型的指針,用于后續(xù)的操作。
例如,使用以下代碼準(zhǔn)備一個(gè)插入語(yǔ)句:
sqlite3_stmt *stmt;
const char sql[] = “INSERT INTO user (id, name, age) VALUES (?, ?, ?)”;
rc = sqlite3_prepare_v2(db, sql, sizeof(sql), &stmt, NULL);
if (rc != SQLITE_OK) {
fprintf(stderr, “Can’t prepare SQL statement: %s\n”, sqlite3_errmsg(db));
sqlite3_close(db);
return 0;
}
在以上代碼中,我們定義了一條要執(zhí)行的SQL語(yǔ)句,其中使用了占位符”?”來(lái)表示待填充的數(shù)據(jù)。之后使用sqlite3_prepare_v2函數(shù)對(duì)該SQL語(yǔ)句進(jìn)行準(zhǔn)備,最后得到一個(gè)sqlite3_stmt類(lèi)型的指針以供后續(xù)使用。
四、綁定數(shù)據(jù)和執(zhí)行語(yǔ)句
在上一步準(zhǔn)備完SQL語(yǔ)句后,我們需要對(duì)語(yǔ)句中的占位符進(jìn)行綁定操作??梢允褂胹qlite3_bind_*系列函數(shù)來(lái)進(jìn)行數(shù)據(jù)的綁定,其函數(shù)原型如下:
int sqlite3_bind_int(sqlite3_stmt*, int, int);
int sqlite3_bind_double(sqlite3_stmt*, int, double);
int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int, void(*)(void*));
int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
上述函數(shù)分別用來(lái)綁定整型、浮點(diǎn)型、字符串型和二進(jìn)制數(shù)據(jù)類(lèi)型的數(shù)據(jù)。它們的之一個(gè)參數(shù)為SQL語(yǔ)句指針,第二個(gè)參數(shù)為數(shù)據(jù)位置,從1開(kāi)始,表示占位符的位置。綁定后,需要針對(duì)每個(gè)綁定數(shù)據(jù)調(diào)用一次函數(shù)進(jìn)行綁定。
例如,對(duì)于上述的SQL語(yǔ)句,可以使用以下代碼對(duì)id、name、age三個(gè)字段進(jìn)行綁定:
rc = sqlite3_bind_int(stmt, 1, 1);
rc = sqlite3_bind_text(stmt, 2, “Tom”, strlen(“Tom”), SQLITE_STATIC);
rc = sqlite3_bind_int(stmt, 3, 18);
在完成數(shù)據(jù)綁定后,最后需要執(zhí)行SQL語(yǔ)句??梢允褂胹qlite3_step函數(shù)來(lái)執(zhí)行SQL語(yǔ)句。該函數(shù)每次執(zhí)行時(shí)會(huì)執(zhí)行SQL語(yǔ)句中的一條,需要多次進(jìn)行函數(shù)調(diào)用才能執(zhí)行完所有SQL語(yǔ)句。
例如,使用以下代碼執(zhí)行SQL語(yǔ)句:
while (sqlite3_step(stmt) == SQLITE_ROW) {
// do something…
}
需要注意的是,sqlite3_step函數(shù)調(diào)用完成后需要調(diào)用sqlite3_reset函數(shù)重置語(yǔ)句,以備后續(xù)使用。
五、
相關(guān)問(wèn)題拓展閱讀:
- C#,Csharp,多串口如何后臺(tái)運(yùn)行,如何把數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)?
- C#,Csharp,多串口如何后臺(tái)運(yùn)行,如何把數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)的問(wèn)題
C#,Csharp,多串口如何后臺(tái)運(yùn)行,如何把數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)?
我寫(xiě)過(guò)有6個(gè)串口同時(shí)通信的程序,只要在\x0d\x0aDataReceived\x0d\x0a事件中獲取到數(shù)據(jù)然后進(jìn)行數(shù)據(jù)庫(kù)處理。\x0d\x0a給你一個(gè)獲取串友態(tài)攔口數(shù)據(jù)的方法好胡\x0d\x0aprivate string GetUnlockData(SerialPort serialPort)\x0d\x0a{\x0d\x0astring orderNum;\x0d\x0achar orderNumChar = new char;\x0d\x0aif (this.GetPartNo(serialPort) != this._partNo)\x0d\x0a return string.Empty;\x0d\x0aserialPort.Read(orderNumChar, 0, orderNumChar.Count());\x0d\x0aorderNum = this.ConverLeterCharArrayTOString(orderNumChar); //將從COM口讀到的字符數(shù)組轉(zhuǎn)換為字符口閉肢串\x0d\x0areturn orderNum;\x0d\x0a}
C#,Csharp,多串口如何后臺(tái)運(yùn)行,如何把數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)的問(wèn)題
接收數(shù)據(jù)是定時(shí)輪詢還是被動(dòng)接收?接收方式不一樣,處理方式也不一樣。
如果是定時(shí)輪詢的話,建議你找個(gè)開(kāi)源的串口操慶信褲作類(lèi)庫(kù)。
如果是被動(dòng)接收的話,建議使用vs自帶的 serialPort 類(lèi)譽(yù)簡(jiǎn)坦攜。
不知道你說(shuō)的串口是指的端口還是真的串口,我兩個(gè)都簡(jiǎn)單的說(shuō)一下吧,供你參考。
.NET 已經(jīng)提供的serialPort類(lèi),封裝了串口的基本操作,如果你電腦上安裝的是 VISUAL SUDIO,那螞虛么你看看幫助文檔就可以找到很詳細(xì)的介紹,還有實(shí)例源碼供參考。MSDN上也有非常詳細(xì)的介紹。
關(guān)于后臺(tái)監(jiān)神升聽(tīng)的問(wèn)題,這個(gè)可以這樣實(shí)現(xiàn),首先,在程序中調(diào)用serialport的open方法,先將這個(gè)串口打開(kāi),然后在串口的DataReceived事件里面編寫(xiě)你的處理寫(xiě)入數(shù)據(jù)的代碼就可悶瞎燃以了。
下面是我寫(xiě)的通過(guò)短信貓發(fā)送短信的部分函數(shù),其中也有寫(xiě)入數(shù)據(jù)庫(kù)的功能,供你參考。
private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
string str = “”;
//PDUdecoding SendS = new PDUdecoding();
Thread.Sleep(200);
str = serialPort.ReadExisting();
DebugReceived(str);
if (str.Contains(“+CMTI”))
{
string SSns = new string;
SSns = str.Split((char)44);
string ssn = SSns;
serialPort.Write(“AT+CMGR=” + ssn + “\r”);
Thread.Sleep(100);
//Tools.ShowMessage(ssn, MessageBoxIcon.Information);
}
//處理初始化命令
if (str.Contains(“AT+CPMS=\”MT\”,\”\”,\”ME\”\r”))
{
Tools.Is_SerialPort_Inited = true;
}
if (str.Contains(“+CMGR:”) && str.Contains(“OK”))
{
string strs = str.Split((char)10);
string SContent = “”;
string Number = “”;
string date = “”;
if (strs.Contains(“08”))
{
SContent = RecS.GetContent(strs);
Number = RecS.GetTelphone(strs);
date = RecS.GetDataTime(strs);
DebugSLog(“*************************************************************”,Color.Black,false);
DebugSLog(“收到新短信!\r\n”, Color.Blue, true);
DebugSLog(“內(nèi)容:\r\n” + SContent + “\r\n發(fā)送人:” + Number + “\r\n發(fā)送時(shí)間:” + date, Color.Blue, false);
DebugSLog(“*************************************************************\r\n”, Color.Black, false);
if (SContent.Contains(“DW+”))
{
string CarNumber = “”;
string CarPW = “”;
string CarLoactionInfo = SContent.Split(‘+’);
if (CarLoactionInfo.Length > 2)
{
CarNumber = CarLoactionInfo;
CarPW = CarLoactionInfo;
Set_Info_To_Send_ToClient(Number, CarNumber, CarPW);
}
}
}
//Tools.ShowMessage(“注意,收到短信!\r內(nèi)容:” + SContent + “\r發(fā)送人:” + Number + “\r發(fā)送時(shí)間:” + date + “\r”, MessageBoxIcon.Information);
}
//判斷是否可以寫(xiě)入短信內(nèi)容
if (str != “” && str.Contains(“AT+CMGS=”) && str.Contains(“>”))
{
Tools.CanWriteSContentToSerialPort = true;
}
//短信發(fā)送失敗
if (str != “” && str.Contains(“ERROR”))
{
Tools.IsSSendSuccess = false;
}
//短信發(fā)送成功
if (str != “” && str.Contains(“+CMGS:”))// && Tools.SendSBZ)
{
if (str.Contains(“OK”))
{
SentSNumber++;
StatusS.Text = “已發(fā)送” + SentSNumber.ToString() + “條定位信息”;
DebugSLog(System.DateTime.Now.ToString() + ” 發(fā)送成功! “,Color.Green,true);
DebugSLog(“##############################################################”, Color.Black,false);
StatusS.ForeColor = Color.Green;
Tools.IsSSendSuccess = true;
}
if (str.Contains(“ERROR”))
{
DebugSLog(System.DateTime.Now.ToString() + ” 請(qǐng)注意:該條短信發(fā)送失??! “,Color.Red,true);
DebugSLog(“##############################################################”, Color.Black,false);
}
}
}
catch
{
}
}
請(qǐng)注意,DataReceived事件默認(rèn)異步處理的,也就是說(shuō),該事件中的處理代碼和主線程不一樣的,如果涉及到在該事件中要更新界面或跨線程訪問(wèn)窗口控件的話,則要采用委托的方式,具體方法可以參考多線程編程。
好久沒(méi)來(lái)百度知道了,為了你這個(gè)問(wèn)題,我還把我以前做的CS程序打開(kāi)詳細(xì)研究了一番,希望能夠拋磚引玉,對(duì)你有所幫助。
我寫(xiě)過(guò)有6個(gè)串口同時(shí)通信的程序,只要在
DataReceived
事件中獲并御爛拆并取到數(shù)據(jù)然后進(jìn)行數(shù)據(jù)庫(kù)處理。
給你一個(gè)獲取串口數(shù)據(jù)的方法
private string GetUnlockData(SerialPort serialPort)
{
string orderNum;
char orderNumChar = new char;
if (this.GetPartNo(serialPort) != this._partNo)
return string.Empty;
serialPort.Read(orderNumChar, 0, orderNumChar.Count());
orderNum = this.ConverLeterCharArrayTOString(orderNumChar); /絕漏/將從COM口讀到的字符數(shù)組轉(zhuǎn)換為字符口串
return orderNum;
}
樓主確定你說(shuō)的是串口?串口是COM硬件口啊
樓主你說(shuō)的是不是線程???
關(guān)于c 逐條寫(xiě)入數(shù)據(jù)庫(kù)的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專(zhuān)業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
當(dāng)前標(biāo)題:C語(yǔ)言逐條寫(xiě)入數(shù)據(jù)庫(kù),詳解實(shí)現(xiàn)方法(c逐條寫(xiě)入數(shù)據(jù)庫(kù))
新聞來(lái)源:http://m.fisionsoft.com.cn/article/dhggchp.html


咨詢
建站咨詢
