2

現在、Visual StudioでC#を使用しており、アクセスデータベースを使用しています。リストボックスから顧客を選択したときに、データベースからデータを取り戻そうとしています。これは、SQLがたとえば次のようにハードコーディングされている場合に完全に機能します。

command.CommandText = "SELECT * FROM Customers WHERE CustomerID = 2 ";

ただし、文字列変数を使用して選択したユーザーIDを保存しようとすると、「基準式のデータ型の不一致」が表示されます。

"OleDbDataReader reader = command.ExecuteReader();".

メッセージボックスを使用して、選択時にs2変数に正しいIDが含まれていることを確認したので、問題がわかりません。

誰かがこの問題の解決策を知っていますか?

    private void lst_disp_SelectedIndexChanged(object sender, EventArgs e)
    {
        String s = (String)lst_disp.SelectedItem; // the s string contains the selected customers ID + name,
        string s2 = s.Split(' ').FirstOrDefault(); // by spliting we can gain only the ID and store in s2
        MessageBox.Show("Selected " + s2);
        showCust(s2);
    }

    private void showCust(string s2)
    {
        dataGridView1.AllowUserToAddRows = false;

        dataGridView1.Columns.Add("CustomerID", "Customer ID");
        dataGridView1.Columns.Add("CustomerName", "Customer Name");
        dataGridView1.Columns.Add("Description", "Description");
        dataGridView1.Columns.Add("Email", "Email");
        dataGridView1.Columns.Add("Telephone", "Telephone");
        dataGridView1.Columns.Add("DeliveryAddress", "Delivery Address");
        dataGridView1.Columns.Add("Notes", "Notes");

        OleDbConnection connect = new OleDbConnection();
        connect.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\Uni\Year 3\Final Year Project\independent foods\coding\showCustomers\Database1.accdb;Persist Security Info=False";
        connect.Open();
        MessageBox.Show("Connection open");

        OleDbCommand command = new OleDbCommand();
        command.Connection = connect;

        MessageBox.Show("SELECT * FROM Customers WHERE CustomerID = '" + s2 + "' ");
        command.CommandText = "SELECT * FROM Customers WHERE CustomerID = '" + s2 + "' ";


        try
        {
            OleDbDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {

                dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells["CustomerID"].Value = reader[0].ToString();
                dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells["CustomerName"].Value = reader[1].ToString();
                dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells["Description"].Value = reader[2].ToString();
                dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells["Email"].Value = reader[3].ToString();
                dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells["Telephone"].Value = reader[4].ToString();
                dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells["DeliveryAddress"].Value = reader[5].ToString();
                dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells["Notes"].Value = reader[6].ToString();
            }
        }
        catch(Exception e)
        {
    MessageBox.Show("The File  cann't be read. Error: " + e.Message);
        }
    }
4

3 に答える 3

3

一重引用符を削除します。列がintのように見えます。

command.CommandText = "SELECT * FROM Customers WHERE CustomerID = " + s2;

また、SQLインジェクション(このようなもの)を防ぐために、これをパラメーター化する必要があります。

SqlParameter custID = new SqlParameter("custID",s2);
command.Parameters.Add(custID);
command.CommandText = "SELECT * FROM Customers WHERE CustomerID = @custID";

この投稿をご覧になるか、クエリをパラメータ化するための簡単な検索を行ってください。

于 2013-03-05T17:11:00.353 に答える
-1

簡単なGoogleがパラメータの使用方法を示していますMSDN

于 2013-03-05T17:08:57.310 に答える
-1

これは、そのようにパラメーター化すると、結果のクエリが同じにならないためです。

元のハードコードされたステートメントでは、

SELECT * FROM Customers WHERE CustomerID = 2

あなたの新しい声明では、あなたは

SELECT * FROM Customers WHERE CustomerID = '2'

CustomerIDはintですが、2番目の例の文字列と比較しようとしています。

代わりに、次のコード行を試してください。

        command.CommandText = "SELECT * FROM Customers WHERE CustomerID = " + s2;

一重引用符を削除しました。

編集マイクCは本当に良い点を作ります。さらに信頼性を高めるために、代わりにパラメータ化する必要があります。

于 2013-03-05T17:11:44.910 に答える