0

私の問題の背景は次のとおりです。ユーザーが入力を開始すると、データベーステーブルの列から提案されたアイテムを取得するコンボボックスがあります。ユーザーが名前の入力を開始すると、プログラムは姓と名の両方を見て名前を提案する必要があります (データベースには両方のテーブルがあります)。

これが私が持っていたコードです:

        try{
            String temp = nameCBox.Text;
            AutoCompleteStringCollection namesSuggestion = new AutoCompleteStringCollection();
            OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.Oledb.12.0;Data Source=C:\\LogEntry\\LogEntry.accdb; Persist Security Info = False;");
            OleDbDataReader reader;
            conn.Open();
            String text2send = "Select Name from [Teachers] where FName like '" + temp + "' OR LName like '" + temp + "' Group by [Name]";
            OleDbCommand cmd = new OleDbCommand(text2send, conn);
            reader = cmd.ExecuteReader();
            if (reader.HasRows == true)
            {
                while (reader.Read())
                    namesSuggestion.Add(reader["temp"].ToString());
            }
            reader.Close();
            nameCBox.AutoCompleteCustomSource = namesSuggestion;

            conn.Close();
            }

エラー: 1) コンボ ボックスに候補が表示されない 2) コンボ ボックスに入力すると、テキストが強調表示され、別の文字を再度入力すると、前に入力した文字が上書きされます。

デスクトップメーカーを助けてください

4

2 に答える 2

0

ええと

これは何をしているの?

namesSuggestion.Add(reader["temp"].ToString()); 

リーダーは Name.. という名前の列を返しています。

検索文字列にワイルドカードが含まれていることを期待して、ユーザーが入力していない限り、私はそうしません。

たとえばLike 'John%'、またはLike '%Smith'標準の sql では、アクセスは % の代わりに * を使用しているようです。

ああ、おそらくあなたはSQLインジェクション攻撃について心配していませんか??

于 2012-08-29T10:45:54.140 に答える
0

Like 演算子を使用しているため、間の入力を次のようにしてみてください:次の%input% ようなものを取得するには:

これを見てください、それは役立つかもしれません

var sql = String.Format("Select Name from [Teachers] WHERE FName Like '%{0}%' OR LName Like '%{0}%'", temp);

現在のコードに関する他のポイントが役立つ場合があります。

  • usingコードでステートメントを使用すると、リソースが破棄され、接続の場合は閉じます。

    using(var conn = new OleDbConnection("ConnectionStrong"))
    {
        //code
    }
    
  • 最良の方法は、パラメーター化されたクエリリンクを使用することです

于 2012-08-29T10:33:30.957 に答える