プログラムでストアド プロシージャを使用してデータベースを検索しようとしています。目的は、入力した 3 つの基準のいずれかを使用して検索することです。 ID番号、名および/または姓。 MySql で次のストアド プロシージャを作成しました:
CREATE DEFINER=`mainuser`@`localhost` PROCEDURE `searchvisitor`( 入力されたID int、 入力されたfn varchar(25)、 enterln varchar(25) ) 始める 訪問者から、visitors.visitorid、visitors.firstname、visitors.lastname、visitors.middleinitial を選択します。ここで、visitors.visitorid = enterid、またはvisitors.firstname ('%enteredfn%' など)、またはvisitors.lastname ('%enteredln%')。 終わり###私の C# コードは次のとおりです:
データベースクエリ:
public DataView searchUserQuery(int id, string fn, string ln) { using (MySqlConnection conn = new MySqlConnection(Helper.connVal("ntpantry"))) { conn.Open(); DataTable dt = 新しい DataTable(); 文字列 lgquery = "検索訪問者"; MySqlCommand cmd = new MySqlCommand(lgquery, conn); cmd.Connection = 接続; 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 = 新しい DataView(dt); DVを返す。 } }
ブリッジ クエリ (1 か所で余分なロジックを編集または削除してみてください):
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(オブジェクト送信者、EventArgs e) { //代わりにロジックをブリッジ データに配置するために get set を追加します GetVisitor.VisitorID = Convert.ToInt32(textBox_searchid.Text); GetVisitor.VisitorFirstName = textBox_searchfn.Text; GetVisitor.VisitorLastName = textBox_searchln.Text; data_searchresults.DataSource = bd.Searchvisitor(); DataGridViewColumn 列 ID = data_searchresults.Columns[0]; 列ID.幅 = 40; DataGridViewColumn 列 fn = data_searchresults.Columns[1]; 列fn.幅 = 60; DataGridViewColumn 列 ln = data_searchresults.Columns[2]; 列幅 = 60; //現在、検索結果の修正に取り組んでいます。ID には機能しますが、名や姓には機能しません。また、結果ボックスには 2 つの項目しか表示されません }
必要に応じて、私が使用する属性を次に示します:
パブリック クラス GetVisitor { public static int VisitorID { get; set; } public static string VisitorFirstName { get; set;} public static string VisitorLastName { get; set;} }
ID検索に効果絶大!しかし、名または姓のみを検索しようとすると、次のエラーが表示されます:
System.FormatException: '入力文字列の形式が正しくありませんでした。'
名前が空であるために空白部分の書式設定に問題があるのではないかと考え、スペースを入力して内容を追加しようとしましたが、うまくいきませんでした。ストアド プロシージャの設定方法または C# コードに戻るのでしょうか?しばらく試してみましたが、問題が発生しました。
###前もって感謝します!P粉5305192342024-03-20 14:34:57
この質問には、ほぼ確実に無関係な情報が多数含まれています。これは、データベースやクエリ、string
を数値に変換すること以外には、ほぼ確実に何の関係もありません。例外がスローされた場所さえ教えてくれませんでしたが、おそらくここにあると思います:
GetVisitor.VisitorID = Convert.ToInt32(textBox_searchid.Text);
TextBox
に 32 ビット整数の有効な表現が含まれていない場合、コードはこのエラー メッセージで失敗します。明らかな解決策は、ユーザー入力を数値に変換する前に検証することです。結局のところ、これは TextBox
なので、ユーザーは何でも入力できます。
まず、ユーザーが何かを入力したかどうかをテストすることをお勧めします。そうでない場合は、ID による検索を試みていないと考えて、それに応じて行動することができます。これをどうするかはあなた次第ですが、私ならまったく別の方法をとります。しかし、これはこの質問の範囲を超えています。彼らが何かを入力した場合は、それが有効な番号であるかどうかを確認し、そうでない場合は停止する必要があります。この場合にのみ、続行する必要があります。任意の数値型 (およびその他の数値型) の TryParse
メソッドは、検証と変換を 1 ステップで完了できます。例:
if (textBox_searchid.TextLength == 0) { // IDが入力されていません } else if (int.TryParse(textBox_searchid.Text, out var id)) { // ここでIDを使用します } それ以外 { //無効なIDが入力されました }