我正在嘗試透過我的程式使用預存程序搜尋我的資料庫。其目標是使用輸入的三個條件中的任何一個進行搜尋。 ID#、名字和/或姓氏。我在 MySql 中建立了以下預存程序:
CREATE DEFINER=`mainuser`@`localhost` PROCEDURE `searchvisitor`( enteredid int, enteredfn varchar(25), enteredln varchar(25) ) begin select visitors.visitorid, visitors.firstname, visitors.lastname, visitors.middleinitial from visitors where visitors.visitorid = enteredid or visitors.firstname like '%entered%' or visitors. end
我的C#程式碼如下:
資料庫查詢:
public DataView searchUserQuery(int id, string fn, string ln) { using (MySqlConnection conn = new MySqlConnection(Helper.connVal("ntpantry"))) { conn.Open(); DataTable dt = new DataTable(); string lgquery = "searchvisitor"; MySqlCommand cmd = new MySqlCommand(lgquery, conn); cmd.Connection = conn; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("enteredid", id); cmd.Parameters.AddWithValue("enteredfn", fn); cmd.Parameters.AddWithValue("enteredln", ln); MySqlDataReader dr = cmd.ExecuteReader(); dt.Load(dr); DataView dv = new DataView(dt); return dv; } }
橋接查詢(嘗試在一個地方編輯或刪除額外的邏輯):
public DataView Searchvisitor() { if (GetVisitor.VisitorFirstName.Length == 0) { GetVisitor.VisitorFirstName = " "; } if (GetVisitor.VisitorLastName.Length == 0) { GetVisitor.VisitorLastName = " "; } return dq.searchUserQuery(Convert.ToInt32(GetVisitor.VisitorID), GetVisitor.VisitorFirstName, GetVisitor.VisitorLastName); }
點擊搜尋按鈕後的呼叫:
private void button2_Click(object sender, EventArgs e) { //Add get set to put logic in bridge data instead GetVisitor.VisitorID = Convert.ToInt32(textBox_searchid.Text); GetVisitor.VisitorFirstName = textBox_searchfn.Text; GetVisitor.VisitorLastName = textBox_searchln.Text; data_searchresults.DataSource = bd.Searchvisitor(); DataGridViewColumn columnid = data_searchresults.Columns[0]; columnid.Width = 40; DataGridViewColumn columnfn = data_searchresults.Columns[1]; columnfn.Width = 60; DataGridViewColumn columnln = data_searchresults.Columns[2]; columnln.Width = 60; //was currently working on fixing search results. works for id but not first name or last name. Also results box only shows 2 items }
如果需要,這裡是我使用的屬性:
public class GetVisitor { public static int VisitorID { get; set; } public static string VisitorFirstName { get; set;} public static string VisitorLastName { get; set;} }
搜尋 ID 時效果非常好!但如果我嘗試只搜尋名字和/或姓氏,我會收到以下錯誤:
System.FormatException: 'Input string was not in a correct format.'
我的想法是,名稱為空,導致其在空白處出現格式問題,因此我嘗試輸入一個空格來添加一些內容,但它不起作用。它會回到我的預存程序的設定方式還是在 C# 程式碼中?我嘗試了一段時間,但遇到了麻煩。
提前致謝!
P粉5305192342024-03-20 14:34:57
幾乎可以肯定,這個問題中有很多不相關的資訊。幾乎可以肯定,這與資料庫或查詢或除了將 string
轉換為數字之外的任何內容無關。您甚至沒有告訴我們異常在哪裡拋出,但我猜它就在這裡:
GetVisitor.VisitorID = Convert.ToInt32(textBox_searchid.Text);
如果 TextBox
不包含 32 位元整數的有效表示,則程式碼將失敗並顯示該錯誤訊息。顯而易見的解決方案是在將使用者輸入轉換為數字之前驗證使用者輸入。畢竟它是一個 TextBox
,因此用戶可能會輸入任何內容。
我建議您先測試使用者是否輸入了任何內容。如果他們沒有,那麼您可以假設他們沒有嘗試透過 ID 進行搜尋並進行相應操作。如何做到這一點取決於你自己,但我會採取完全不同的做法。但這超出了這個問題的範圍。如果他們輸入了某些內容,那麼您應該檢查它是否是有效的數字,如果不是則停止。只有在這種情況下您才應該繼續。任何數值類型(以及其他一些)的 TryParse
方法都可以一步完成驗證和轉換,例如
if (textBox_searchid.TextLength == 0) { // No ID entered } else if (int.TryParse(textBox_searchid.Text, out var id)) { // Use id here } else { // Invalid ID entered }