2011-09-19 21 views
0

我有一個表:警告用戶,如果錯誤的值不在表(MYSQL + C)

For_Sconti | Cat_Sconti | Sconto 

    7148    A1   451.00 

我怎樣才能防止用戶插入錯誤的(未在表中)For_Sconti值時 試圖更新Sconto字段?

簡而言之,通過C接口,我想更新上面提到的表格。

do { 
    printf("Insert For_Sconti: \n"); 
    scanf("%s", For_Sconti); 
    } 
    while (strlen(For_Sconti)>5); 

在這裏,我想只要他/她插入For_Sconti值不是在表中向用戶發出警告。

我想到這個問題:

strcat(query, "SELECT For_Sconti,Cat_Sconti FROM Sconti;"); 
result = mysql_store_result (conn); 
mysql_field_seek (result, 0);   
row = mysql_fetch_row (result);  

但我相信,這只是無稽之談。

有人可以幫助我嗎?

+0

你想要的是'For_Sconti'是一個[外鍵](http://www.w3schools.com/sql/sql_foreignkey.asp)。 –

+0

我想要的是防止插入重複..Actuallu用戶不應該插入不在表中的值... For_Sconti和Cat_Sconti是外鍵 – Vera

回答

0

嘗試使用mysql_affected_rows()函數。如果結果爲0,則用戶嘗試修改不存在的For_Sconti。

+0

謝謝...我嘗試過,但我不能再進一步的memset(查詢,0,200); \t strcat(query,「SELECT For_Sconti FROM Sconti WHERE For_Sconti ='」); \t strcat(query,For_Sconti); strcat(query,「'AND Cat_Sconti ='」); \t strcat(query,Cat_Sconti); \t strcat(query,「';」); \t strcat(query,「';」); \t result = mysql_store_result(conn); – Vera

+0

然後一旦我存儲了查詢結果,我該如何使用mysql_affected_rows()? – Vera

+0

在INSERT/UPDATE/DELETE命令後面使用此命令。它會說有多少行受到影響。 – Devart

0

以下是您必須遵循的步驟: 1.-獲取For_Sconti值。 2.-撰寫如下查詢: sprintf(outString「SELECT%s FROM myTable」,readValue);

3.-然後檢查結果,看看它是否包含某些東西,然後允許用戶插入新值,否則警告用戶有關錯誤。

0

主鍵防止重複;外鍵限制允許值的範圍。

假設您有外鍵約束,您可能只想嘗試插入用戶提供的數據,並在違反外鍵約束時捕獲C接口庫返回的錯誤。此方法只需要一次往返數據庫。

如果您想知道用戶提供的值是否存在於數據庫中,請執行像這樣的查詢並檢查其返回值。

SELECT (COUNT(*) > 0) as For_sconti_exists 
FROM Sconti 
WHERE For_sconti = <the user-supplied value> 

此方法需要兩個往返有效值 - 一個確定值是否存在,以及一個插入的行。您也可以

  • 講究事務隔離級別,
  • 執行單個事務中的兩個語句(或有人可以刪除你覺得有時間之間的有效值您選擇行和一次插入) ,並且
  • 無論如何陷阱錯誤。