2

C#とSQL Sever 2008を使用していますが、レコードを検索するためのコマンドを作成しようとすると、「無効な列名」という例外が発生しました。

これは私のコードです:

void cari()
        {
            koneksi.Open();
            DataTable dt = new DataTable();
            SqlDataAdapter SDA = new SqlDataAdapter("SELECT * FROM jadwalkuliah where Subject = "+ textBox1.Text, koneksi);
            SDA.Fill(dt);
            koneksi.Close();

            dataGridView1.DataSource = dt;
        }`

検索コマンドは検索エンジンとして機能するはずですが、誰か助けてもらえますか?

4

2 に答える 2

5

さて、当面の問題は、WHERE句が次のようになることです。

where Subject = Foo

これは、Subject列の値をFoo列の値と比較しようとしています。

これを修正するためのハッキーな方法は、値を引用符で囲むことです。より良い解決策は、パラメーター化されたSQLを使用することです。

string sql = "SELECT * FROM jadwalkuliah where Subject = @Subject";
using (SqlConnection connection = new SqlConnection(...))
using (SqlDataAdapter adapter = new SqlDataAdapter(sql, connection))
{
    connection.Open();
    adapter.SelectCommand.Parameters.Add("@Subject", SqlDbType.VarChar)
                                    .Value = textBox1.Text;
    adapter.Fill(dt);
}

さらに、GUIスレッドからデータベースアクセスを実行するべきではないことに注意してください。これがWebアプリ(この場合は問題ありません)なのか、WPF / WinForms(この場合はそうでない場合)なのかは明確ではありません。

それでも完全に一致させようとすることに注意してください。「ワイルドカード」一致の場合は、次のように変更する必要があります。

SELECT * FROM jadwalkuliah where Subject LIKE @Subject

...そして。のようなものでパラメータを追加します"%" + textBox1.Text + "%"。(次に、その値の範囲内でエスケープすることを検討する必要がありますが、それは別の問題です...)

于 2012-08-02T08:09:06.743 に答える
4

件名の値を引用していません:

SqlDataAdapter SDA = new SqlDataAdapter("SELECT * FROM jadwalkuliah where Subject = '"+ textBox1.Text + "'", 

koneksi);

または、包含検索の場合:SqlDataAdapter SDA = new SqlDataAdapter( "SELECT * FROM jadwalkuliah where Subject ='%" + textBox1.Text + "%'"、koneksi);

この方法でクエリを作成しないでください。SQLインジェクション攻撃の影響を受けやすくなっています。

于 2012-08-02T08:07:53.267 に答える