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

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


咨詢
建站咨詢
