新聞中心
隨著信息化時代的不斷發(fā)展,數(shù)據(jù)庫已經(jīng)成為了計算機系統(tǒng)中不可或缺的一部分。作為一種常見的數(shù)據(jù)存儲方式,數(shù)據(jù)庫不僅可以存儲大規(guī)模的數(shù)據(jù),還可以在不同的系統(tǒng)之間進行數(shù)據(jù)共享和數(shù)據(jù)交換。在實際應(yīng)用中,一旦數(shù)據(jù)庫中的數(shù)據(jù)發(fā)生了變化,往往需要使用編程語言來對其進行修改。本文將介紹如何使用C語言修改數(shù)據(jù)庫中的數(shù)據(jù)。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),白云企業(yè)網(wǎng)站建設(shè),白云品牌網(wǎng)站建設(shè),網(wǎng)站定制,白云網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,白云網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
一、連接數(shù)據(jù)庫
在C語言中,要想對數(shù)據(jù)庫中的數(shù)據(jù)進行修改,必須首先連接到數(shù)據(jù)庫服務(wù)器。連接數(shù)據(jù)庫的方法分為兩種,一種是使用ODBC連接,另外一種是使用第三方的庫文件連接,如MySQL提供的libmysql.dll庫文件。本文將以使用ODBC連接數(shù)據(jù)庫為例進行說明。
需要在代碼中調(diào)用頭文件#include 和#include ,同時還需要準備一些連接數(shù)據(jù)庫的變量,其中包括一個SQLHENV類型的變量,一個SQLHDBC類型的變量和一個SQLHSTMT類型的變量。這三個變量分別代表了ODBC環(huán)境句柄、數(shù)據(jù)庫連接句柄和語句句柄。
需要調(diào)用SQLAllocHandle函數(shù)來分配ODBC句柄。SQLAllocHandle函數(shù)包括三個參數(shù),之一個參數(shù)為需要分配的句柄的類型,第二個參數(shù)為其父句柄,第三個參數(shù)為該句柄需要賦予的屬性值。對于ODBC環(huán)境句柄和數(shù)據(jù)庫連接句柄,可以不用指定其父句柄,而在語句句柄上,需要指定其父句柄為數(shù)據(jù)庫連接句柄。
需要調(diào)用SQLConnect函數(shù)連接到數(shù)據(jù)庫。SQLConnect函數(shù)包括五個參數(shù),分別為數(shù)據(jù)庫連接句柄、數(shù)據(jù)庫用戶名、數(shù)據(jù)庫密碼、數(shù)據(jù)庫服務(wù)器名和數(shù)據(jù)庫名稱。以MySQL數(shù)據(jù)庫為例,通過調(diào)用SQLConnect函數(shù)連接到MySQL數(shù)據(jù)庫的例子代碼如下所示:
“`c
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLRETURN retcode;
SQLCHAR* dsn = (SQLCHAR*)”Data Source=test”;
SQLCHAR* user = (SQLCHAR*)”root”;
SQLCHAR* pswd = (SQLCHAR*)”123456″;
SQLCHAR* serv = (SQLCHAR*)”localhost”;
SQLCHAR* db = (SQLCHAR*)”test”;
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
retcode = SQLConnectA(hdbc, serv, SQL_NTS, user, SQL_NTS, pswd, SQL_NTS);
if (retcode != SQL_SUCCESS) {
printf(“connect to mysql fled!\n”);
return 0;
}
“`
二、修改數(shù)據(jù)庫中的數(shù)據(jù)
連接到數(shù)據(jù)庫后,就可以開始對數(shù)據(jù)庫中的數(shù)據(jù)進行修改了。修改數(shù)據(jù)操作的核心在于SQL語句的執(zhí)行。在C語言中,可以通過調(diào)用SQLExecDirect函數(shù)執(zhí)行SQL語句。SQLExecDirect函數(shù)包括兩個參數(shù),分別為語句句柄和指向SQL語句的字符串指針。
對于修改數(shù)據(jù)操作,常用的SQL語句有INSERT、UPDATE和DELETE。其中,INSERT用于向數(shù)據(jù)庫中添加新的數(shù)據(jù)記錄,UPDATE用于更新數(shù)據(jù)庫中的數(shù)據(jù)記錄,DELETE用于刪除數(shù)據(jù)庫中的數(shù)據(jù)記錄。下面分別介紹這三種SQL語句的用法。
1.修改數(shù)據(jù)
要修改數(shù)據(jù)庫中的數(shù)據(jù),首先需要使用SELECT語句查詢出需要修改的數(shù)據(jù)記錄。例如,要修改學號為001的學生的姓名為“小明”,可以使用如下的SQL語句:
“`sql
SELECT * FROM student WHERE sno=’001′;
“`
查詢到符合條件的數(shù)據(jù)記錄后,就可以使用UPDATE語句來修改該數(shù)據(jù)記錄的內(nèi)容。例如,將上述查詢結(jié)果中的sname字段修改為“小明”,可以使用如下的SQL語句:
“`sql
UPDATE student SET sname=’小明’ WHERE sno=’001′;
“`
注意,需要將表名和字段名按照實際情況進行修改。
為了在C語言中執(zhí)行上述的SQL語句,可以使用如下的代碼:
“`c
char sql[1024] = { 0 };
sprintf(sql, “UPDATE student SET sname=’小明’ WHERE sno=’001′”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
“`
上述代碼中,sprintf函數(shù)用于組合SQL語句,通過拼接字符串的方式生成完整的SQL語句字符串。SQLExecDirectA函數(shù)用于執(zhí)行SQL語句。
2.插入數(shù)據(jù)
要想向數(shù)據(jù)庫中插入新的數(shù)據(jù)記錄,可以使用INSERT語句。例如,要向student表中插入學號為“002”的學生,可以使用如下的SQL語句:
“`sql
INSERT INTO student(sno, sname) VALUES(‘002’, ‘小紅’);
“`
這條SQL語句會在student表中添加一條新的數(shù)據(jù)記錄,將sno字段設(shè)為“002”,將sname字段設(shè)為“小紅”。
在C語言中執(zhí)行上述的SQL語句,可以使用如下的代碼:
“`c
char sql[1024] = { 0 };
sprintf(sql, “INSERT INTO student(sno, sname) VALUES(‘002’, ‘小紅’)”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
“`
3.刪除數(shù)據(jù)
要想從數(shù)據(jù)庫中刪除數(shù)據(jù)記錄,可以使用DELETE語句。例如,要從student表中刪除學號為“002”的學生,可以使用如下的SQL語句:
“`sql
DELETE FROM student WHERE sno=’002′;
“`
這條SQL語句會將student表中符合條件的數(shù)據(jù)記錄全部刪除。
在C語言中執(zhí)行上述的SQL語句,可以使用如下的代碼:
“`c
char sql[1024] = { 0 };
sprintf(sql, “DELETE FROM student WHERE sno=’002′”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
“`
三、關(guān)閉數(shù)據(jù)庫連接
在C語言中執(zhí)行完數(shù)據(jù)庫操作后,需要調(diào)用SQLDisconnect函數(shù)斷開與數(shù)據(jù)庫服務(wù)器的連接,并釋放ODBC的句柄空間。例如:
“`c
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
“`
SQLDisconnect函數(shù)用于斷開與數(shù)據(jù)庫服務(wù)器的連接,SQLFreeHandle函數(shù)用于釋放分配的句柄空間。
四、完整代碼
下面是使用C語言修改數(shù)據(jù)庫中數(shù)據(jù)的完整代碼:
“`c
#include
#include
#include
int mn(int argc, char* argv[])
{
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLRETURN retcode;
SQLCHAR* dsn = (SQLCHAR*)”Data Source=test”;
SQLCHAR* user = (SQLCHAR*)”root”;
SQLCHAR* pswd = (SQLCHAR*)”123456″;
SQLCHAR* serv = (SQLCHAR*)”localhost”;
SQLCHAR* db = (SQLCHAR*)”test”;
char sql[1024] = { 0 };
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
retcode = SQLConnectA(hdbc, serv, SQL_NTS, user, SQL_NTS, pswd, SQL_NTS);
if (retcode != SQL_SUCCESS) {
printf(“connect to mysql fled!\n”);
return 0;
}
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (retcode != SQL_SUCCESS) {
printf(“SQLAllocHandle fled!\n”);
return 0;
}
sprintf(sql, “SELECT * FROM student WHERE sno=’001′”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLCHAR sno[32] = { 0 };
SQLCHAR sname[64] = { 0 };
SQLINTEGER age = 0;
SQLLEN len1 = 0, len2 = 0, len3 = 0;
retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, sno, sizeof(sno), &len1);
retcode = SQLBindCol(hstmt, 2, SQL_C_CHAR, sname, sizeof(sname), &len2);
retcode = SQLBindCol(hstmt, 3, SQL_C_SLONG, &age, 0, &len3);
retcode = SQLFetch(hstmt);
if (retcode == SQL_NO_DATA) {
break;
}
printf(“sno:%s sname:%s age:%d\n”, sno, sname, age);
}
sprintf(sql, “UPDATE student SET sname=’小明’ WHERE sno=’001′”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
sprintf(sql, “SELECT * FROM student WHERE sno=’001′”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLCHAR sno[32] = { 0 };
SQLCHAR sname[64] = { 0 };
SQLINTEGER age = 0;
SQLLEN len1 = 0, len2 = 0, len3 = 0;
retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, sno, sizeof(sno), &len1);
retcode = SQLBindCol(hstmt, 2, SQL_C_CHAR, sname, sizeof(sname), &len2);
retcode = SQLBindCol(hstmt, 3, SQL_C_SLONG, &age, 0, &len3);
retcode = SQLFetch(hstmt);
if (retcode == SQL_NO_DATA) {
break;
}
printf(“sno:%s sname:%s age:%d\n”, sno, sname, age);
}
sprintf(sql, “INSERT INTO student(sno, sname) VALUES(‘002’, ‘小紅’)”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
sprintf(sql, “SELECT * FROM student WHERE sno=’002′”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLCHAR sno[32] = { 0 };
SQLCHAR sname[64] = { 0 };
SQLINTEGER age = 0;
SQLLEN len1 = 0, len2 = 0, len3 = 0;
retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, sno, sizeof(sno), &len1);
retcode = SQLBindCol(hstmt, 2, SQL_C_CHAR, sname, sizeof(sname), &len2);
retcode = SQLBindCol(hstmt, 3, SQL_C_SLONG, &age, 0, &len3);
retcode = SQLFetch(hstmt);
if (retcode == SQL_NO_DATA) {
break;
}
printf(“sno:%s sname:%s age:%d\n”, sno, sname, age);
}
sprintf(sql, “DELETE FROM student WHERE sno=’002′”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
sprintf(sql, “SELECT * FROM student WHERE sno=’002′”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLCHAR sno[32] = { 0 };
SQLCHAR sname[64] = { 0 };
SQLINTEGER age = 0;
SQLLEN len1 = 0, len2 = 0, len3 = 0;
retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, sno, sizeof(sno), &len1);
retcode = SQLBindCol(hstmt, 2, SQL_C_CHAR, sname, sizeof(sname), &len2);
retcode = SQLBindCol(hstmt, 3, SQL_C_SLONG, &age, 0, &len3);
retcode = SQLFetch(hstmt);
if (retcode == SQL_NO_DATA) {
break;
}
printf(“sno:%s sname:%s age:%d\n”, sno, sname, age);
}
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}
“`
相關(guān)問題拓展閱讀:
- c/s系統(tǒng),如何防止用戶直接連到數(shù)據(jù)庫修改數(shù)據(jù)
c/s系統(tǒng),如何防止用戶直接連到數(shù)據(jù)庫修改數(shù)據(jù)
1. 事實上,交易不幫你在這里多…除非你想有運行在多個HTTP請求(你很可能不希望)的交易。 有什么用在這些情況下是“樂觀鎖定”。 Django的ORM不支持,據(jù)我所知。但一直以來關(guān)于添加此功能。 那么,你是你自己的。基本上,你應(yīng)該做的就是添加一個“版本”字段,你的模型,并把它傳遞給一個隱藏字段。正常周期的更新是: 讀取數(shù)據(jù)并顯示給 用戶可以修改數(shù)據(jù) 用戶發(fā)布的數(shù)據(jù) 該應(yīng)用程序?qū)⑵浔4婊財?shù)據(jù)庫。 樂觀鎖,當你保存數(shù)據(jù),你檢查,如果你得到了從后面的版本是作為一個在數(shù)據(jù)庫中,然后更新數(shù)據(jù)庫和版本。如果它們不是,那有一直以來被加載的數(shù)據(jù)的變化。 你可以做到這一點與像一個單一的SQL調(diào)用:UPDATE … WHERE version = ‘version_from_user’;
這個調(diào)用將更新數(shù)據(jù)庫只有在版本仍然是
2. 我就是這樣做的Django的樂觀鎖:updated = Entry.objects.filter(Q(id=e.id) && Q(version=e.version))\
.update(updated_field=new_value, version=e.version+1)
if not updated:
raise ConcurrentModificationException()
上面列出的代碼可以在自定義管理。 我提出以下假設(shè): 篩選()。update()方法會導致在一個單一的數(shù)據(jù)庫查詢過濾器是懶惰 數(shù)據(jù)庫查詢是原子 這些假設(shè)都足以確保沒有其他人之前已經(jīng)更新了條目。如果有多個行被更新這樣你的交易。 警告Django的文件: 請注意,update()方法是 直接轉(zhuǎn)換為SQL 這是一個批量操作 直接更新。它不運行任何 保存(您的模型)的方法,或發(fā)出 該pre_save或post_save信號
3. 這個問題是有點老了,我的回答有點晚,但經(jīng)過我的理解使用這個已被固定在Django 1.4:select_for_update(nowait=True)
看到文檔 返回一個QuerySet,將鎖定行,直到事務(wù)結(jié)束,產(chǎn)生一個SELECT …有關(guān)支持的數(shù)據(jù)庫UPDATE的SQL。 通常情況下,如果另一個事務(wù)已獲得所選擇的行上的鎖,則查詢將阻塞,直到鎖被釋放。如果這不是你想要的行為,請致電select_for_update(NOWAIT=TRUE)。這將使調(diào)用非阻塞的。如果已經(jīng)獲取了沖突的鎖被另一個事務(wù)時的QuerySet進行評估,DatabaseError的將得到提升。 當然,這只會工作,如果后端支持的“選擇更新”功能,這對于例如SQLite不。不幸的是:nowait=True不支持MySql的,有你有nowait=False,這只會阻塞,直到鎖被釋放。
4. 對于未來的參考,退房離開的時候(在瀏覽器中,例如崩潰)的頁面,并鎖定它鎖定的方式,不留下永恒的鎖,通過javascript的解鎖的混合物。下
5. 你應(yīng)該Django的交易中間件,至少,甚至不管這個問題。 至于你實際有編輯數(shù)據(jù)的問題…是的,使用鎖?;颍?檢查什么版本正在更新對(這樣做牢固,譽裂不能簡單地破解系統(tǒng)說,他們正在更新的最新副本?。?,且僅當該版本是最新的更新。否則,返回一個新頁面與原來的版本,他們編輯,他們提交的版本,和別人寫的新版本(S)。問他們變成一體,完全取決于最新的版本。你可以嘗試類似的diff +補丁工具集,但你需要有方法工作失敗的案例,無論如何,所以開始了。此外,您將需要保存的版本歷史記錄,并允許管理員恢復(fù)的變化,在無意的情況下或向上,但你應(yīng)該有反正。 有很可能是Django應(yīng)用程序/庫,做這個最適合你。
6. 為了安全起見,數(shù)據(jù)庫需要支持事務(wù)。 如果字段是“自由形式”如文字等等,你需要允許可以編輯的字段(你不能有所有權(quán)的數(shù)據(jù)),你可以存儲在變量中的原始數(shù)據(jù)。 當committs,檢查輸入數(shù)據(jù)從原跡虛兆始數(shù)據(jù)更改(如果不是,你不姿租需要通過重寫舊數(shù)據(jù)打擾DB) 如果原來在數(shù)據(jù)庫中的當前數(shù)據(jù)是可以保存,如果它改變了你可以示區(qū)別,并問該怎么辦。 如果字段是一個數(shù)字如賬戶余額,在商店等項目的數(shù)量,你可以自動處理它,如果你計算出原始值(存儲開始時填寫表單)和新的價值,你就可以開始一個事務(wù)讀取當前值之間的差額新增的差別,然后結(jié)束交易。如果你不能有負值,則應(yīng)該中止交易,如果結(jié)果為負,并告訴 我不知道Django的,所以我不能給你德cod3s ..
7. 另一個需要注意的是這個詞“原子”.a個原子,你的數(shù)據(jù)庫的更改要么發(fā)生或無法快速搜索說明這個問題問Django中的原子操作。
8. 上面的想法updated = Entry.objects.filter(Q(id=e.id) && Q(version=e.version))\
.update(updated_field=new_value, version=e.version+1)
if not updated:
raise ConcurrentModificationException()
看起來不錯,應(yīng)該能正常運行,即使沒有序列化的交易。 問題是如何將deafult。保存()的行為,以不必須做人工管道來調(diào)用。update()方法。 我看著自定義管理想法。 我的計劃是覆蓋被稱為Model.save_base()來執(zhí)行更新的經(jīng)理。 這是在Django 1.3當前代碼def _update(self, values, **kwargs):
return self.get_query_set()._update(values, **kwargs)
什么需要恕我直言做的是這樣的:def _update(self, values, **kwargs):
#TODO Get version field value
v = self.get_version_field_value(values)
return self.get_query_set().filter(Q(version=v))._update(values, **kwargs)
類似的事情需要發(fā)生的刪除。但是刪除是有點難度的Django是相當巫術(shù)在這方面通過django.db.models.deletion.Collector。 這是奇怪的,像Django的modren工具缺乏對Optimictic Concurency控制指導。 當我解開這個謎,我會更新這個帖子。希望解決方案將是不涉及萬噸編碼,怪異的意見,跳繩重要部分的Django等的一個很好的Python的方式
9. 從這里開始: 我假設(shè)將舉行一個隱藏字段中你試圖挽救細節(jié)的表格。def save(self):
if(self.id):
foo = Foo.objects.get(pk=self.id)
if(foo.timestamp > self.timestamp):
raise Exception, “trying to save outdated Foo”
c修改數(shù)據(jù)庫中的數(shù)據(jù)的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于c修改數(shù)據(jù)庫中的數(shù)據(jù),C語言教程:如何修改數(shù)據(jù)庫中的數(shù)據(jù),c/s系統(tǒng),如何防止用戶直接連到數(shù)據(jù)庫修改數(shù)據(jù)的信息別忘了在本站進行查找喔。
成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡單好用,價格厚道的香港/美國云服務(wù)器和獨立服務(wù)器。創(chuàng)新互聯(lián)——四川成都IDC機房服務(wù)器托管/機柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機房租用、服務(wù)器托管、機柜租賃、大帶寬租用,高電服務(wù)器托管,算力服務(wù)器租用,可選線路電信、移動、聯(lián)通機房等。
當前名稱:C語言教程:如何修改數(shù)據(jù)庫中的數(shù)據(jù)(c修改數(shù)據(jù)庫中的數(shù)據(jù))
URL網(wǎng)址:http://www.5511xx.com/article/cdchehi.html


咨詢
建站咨詢
