2017-02-21 79 views
0

所以我正在製作一個圖書館系統,並且在借閱和返還書籍時遇到問題。掃描我的表c#mysql

當我借了一本書,然後返回它改變狀態返回,然後借用同一本書再次成功,然後當我返回它時,我陷入退貨書消息顯示。

sql = "SELECT * FROM tbltransactionbooks WHERE fBarCodeNo LIKE '" + txtBARCODE_R.Text.Trim() + "%'"; 
cfgotcall.engageQuery(sql); 
if (cfgotcall.tbl.Rows[0]["fStatus"].ToString().Equals("Borrowed")) 
{ 
    txtTITLE_R.Text = cfgotcall.tbl.Rows[0]["fBookTitle"].ToString(); 
    txtAUTHOR_R.Text = cfgotcall.tbl.Rows[0]["fAuthor"].ToString(); 
    txtYEAR_R.Text = cfgotcall.tbl.Rows[0]["fBookYr"].ToString(); 
    txtACCNO_R.Text = cfgotcall.tbl.Rows[0]["fAccNo"].ToString(); 
    txtCALLNO_R.Text = cfgotcall.tbl.Rows[0]["fCallNo"].ToString(); 
    txtBARCODE_BR.Text = cfgotcall.tbl.Rows[0]["fBarcodeNo"].ToString(); 
    txtSEARCH.Text = cfgotcall.tbl.Rows[0]["fStudent"].ToString(); 
    txtReturnDate.Text = cfgotcall.tbl.Rows[0]["fBorrowDate"].ToString(); 
    txtIDNO.Text = cfgotcall.tbl.Rows[0]["fIDStudent"].ToString(); 
    txtLEVEL.Text = cfgotcall.tbl.Rows[0]["fLevel"].ToString(); 
} 
else 
{ 
    MessageBox.Show("Book already returned."); 
} 

我調試自己的代碼在PIC是它不掃描在tbltransactionbooks完整行它只讀取我的表first row

33 123 NAME IT 2/20/2017 2/20/2017 [HISTORY OF] COMPUTERS: THE MACHINES WE THINK WITH Returned 
33 123 NAME IT 2/21/2017 2/21/2017 [HISTORY OF] COMPUTERS: THE MACHINES WE THINK WITH Borrowed 

[2]:http://i66.tinypic.com/28ajgwg.jpg

如何道瓊斯我掃描我的餐桌的全行?如果我上面的代碼看起來不太好,我會建議我如何使它變得乾淨。謝謝

+1

你確實需要清理你的輸入。 – maniak1982

+0

對不起,我第一次來這裏,在google上找不到我的問題。 – user3415509

+0

這與你的問題無關,這在下面得到了回答(你只能從第一行結果中讀取)。這是一個不同的問題,您不小心讓人們​​通過直接將文本輸入讀入SQL查詢來編輯數據庫。有人可以輸入文本框';掉桌用戶; --'如果你有這張表,你的數據庫將執行該指令。 – maniak1982

回答

1

cfgotcall.tbl.Rows[0]指的第一排只有

你應該遍歷每一行:

sql = "SELECT * FROM tbltransactionbooks WHERE fBarCodeNo LIKE '" + txtBARCODE_R.Text.Trim() + "%'"; 
cfgotcall.engageQuery(sql); 

foreach(var row in cfgotcall.tbl.Rows) 
{ 
    if (row["fStatus"].ToString().Equals("Borrowed")) 
    { 
    txtTITLE_R.Text = row["fBookTitle"].ToString(); 
    txtAUTHOR_R.Text = row["fAuthor"].ToString(); 
    txtYEAR_R.Text = row["fBookYr"].ToString(); 
    txtACCNO_R.Text = row["fAccNo"].ToString(); 
    txtCALLNO_R.Text = row["fCallNo"].ToString(); 
    txtBARCODE_BR.Text = row["fBarcodeNo"].ToString(); 
    txtSEARCH.Text = row["fStudent"].ToString(); 
    txtReturnDate.Text = row["fBorrowDate"].ToString(); 
    txtIDNO.Text = row["fIDStudent"].ToString(); 
    txtLEVEL.Text = row["fLevel"].ToString(); 
    } 
    else 
    { 
     MessageBox.Show("Book already returned."); 
    } 
} 

要避免遇到運行時錯誤歸因於列名和SQL查詢錯別字,可使用LINQ to SQLEntity Framework。這樣每一行都被轉換爲一個對象,並且您可以通過訪問對象屬性\ field來訪問每一列。

0

您只能訪問表格的第一行[0]。你需要使用for或foreach循環遍歷它們。

附註:我想這是一個家庭作業。如果你在互聯網上找到完整的解決方案,它不會對你有任何好處。您應該試着瞭解集合/數組如何工作以及如何使用循環遍歷它們。

一對夫婦的教程,以幫助您與任務:

https://msdn.microsoft.com/en-us/library/aa288462(v=vs.71).aspx

http://csharp.net-informations.com/collection/csharp-collection-tutorial.htm

+0

先生你可以請張貼一些關於如何使用foreach循環訪問數據庫的例子,我會試着研究它。只是例子 – user3415509

+0

下面的KernelMode的答案是你正在尋找的。 foreach(var in cfgotcall.tbl.Rows)... –

+0

是的這是一個過期的作業,我同意它也不會對我有任何好處,因爲我現在做的事情會反映在我的職業生涯中。我只是分析代碼並調整它們而已 – user3415509

0

第一行檢查,因爲使用僅訪問第一行:

if (cfgotcall.tbl.Rows[0]...) 

要檢查所有的行,無論是使用的或foreach循環通過cfgotcall.tbl.Rows訪問集合。