2016-12-21 29 views
1

InqIDを介した検索は正常に機能していますが、InqNameで検索するコードを入力すると、エラーが発生します(すべての接続は適切です)。 System.Data.dllで 'System.Data.OleDb.OleDbException'型の未処理の例外が発生しました。C#とアクセスデータベースの名前を使用して検索

追加情報:1つまたは複数の必須パラメータに値は指定されていません。

private void btnSearch_Click(object sender, EventArgs e) 
{ 
    DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqID=" +txtInqID.Text, CON); 
    DS.Clear(); 
    DA.Fill(DS); 
    dataGridView.DataSource = DS.Tables[0]; 

    CON.Open(); 
    DA.SelectCommand.ExecuteNonQuery(); 
    CON.Close(); 
} 

private void btnNameSearch_Click(object sender, EventArgs e) 
{ 
    DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName=" + txtInqName.Text, CON); 
    DS.Clear(); 
    DA.Fill(DS); 
    dataGridView.DataSource = DS.Tables[0]; 

    CON.Open(); 
    DA.SelectCommand.ExecuteNonQuery(); 
    CON.Close(); 
} 
+0

"INQUIREt WHERE InqName = '" + txtInqName.Text + "'"、CON – jose

+1

@jose:[injection](http://www.w3schools.com/sql/sql_injection)を気にかけないでください。 .asp)? –

答えて

2

を使用して選択されるよう

DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE [email protected] " , CON); 
DS.Clear(); 
DA.SelectCommand.Parameters.AddWithValue("@Name",txtInqName.Text); 
DA.Fill(DS); 
dataGridView.DataSource = DS.Tables[0]; 

また、あなたは、コードの下に必要のない答えのほとんどは、あなたがパラメータを使用する必要があることを教えてくれ、それは良いです。 また、周囲に一重引用符を含めた場合は、が正しくないことがわかります。です。一重引用符を追加することは解決策ではなく、いくつかの値(すべてではありませんが多くの場合)でのみ機能し、SQLインジェクション攻撃には広く開放されています。

正しい方法とパラメータを使用する方法があります。 OleDbでは、パラメータの名前は付けられませんが、位置は固定です。しかし、アクセスすると、名前の前に@を付けることで名前付きパラメーターを使用できます。

private void btnSearch_Click(object sender, EventArgs e) 
{ 
    DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE [email protected]", CON); 
    DA.SelectCommand.Parameters.Add("@ID", OleDbType.VarChar).Value = txtInqID.Text;  
    DS.Clear(); 
    DA.Fill(DS); 
    dataGridView.DataSource = null; 
    dataGridView.DataSource = DS.Tables[0]; 
} 

private void btnNameSearch_Click(object sender, EventArgs e) 
{ 
    DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE [email protected]", CON); 
    DA.SelectCommand.Parameters.Add("@name", OleDbType.VarChar).Value = txtInqName.Text; 
    DS.Clear(); 
    DA.Fill(DS); 
    dataGridView.DataSource = null; 
    dataGridView.DataSource = DS.Tables[0]; 
} 

PS:DataSetとDataAdapterを奇妙な方法で使用していますが、これは問題ありません。

0

あなたのクエリであなたのtxtInqID.TextInqName.Text値を囲む引用符が欠落している:それはvery bad practiceあるよう

DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqID = '" + txtInqID.Text + "'", CON); 

DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName = '" + txtInqName.Text + "'", CON); 

はまた、動的にクエリ文字列を構築します。

DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqID = ?", CON); 
DA.SelectCommand.Parameters.Add("InqID").Value = txtInqID.Text; 

DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName = ?" , CON); 
DA.SelectCommand.Parameters.Add("InqName").Value = txtInqName.Text; 
0

あなたは次のように、あなたが引用符を追加する必要があり、検索文字列パラメータを指定しない:

DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName='" + txtInqName.Text + "'", CON); 

をしかし、stringが有効と読めないようクエリ文字列を構築する代わりに、コマンドparametersを使用することを検討してください途中、良い練習は次のようにOleDbParametersを使用することです:

DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName=?", CON); 
DA.SelectCommand.Parameters.AddWithValue("?", txtInqName.Text); 
0

あなたは値を囲む必要があります引用符で囲まれたNameの名前ですが、Parameterized Sqlを使用する方がよいでしょう。既にデータがデータアダプター

CON.Open(); 
DA.SelectCommand.ExecuteNonQuery(); 
CON.Close(); 
関連する問題