日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C語言教程:如何修改數(shù)據(jù)庫中的數(shù)據(jù)(c修改數(shù)據(jù)庫中的數(shù)據(jù))

隨著信息化時代的不斷發(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