>

Visual Studio 2008 및 SQL Server 2008로 작업하고 있으며 테이블이 있습니다. bookdat  이 열과 함께 :

title varchar(200), author varchar(100), publication varchar(200),
accno varchar(200) not null primary key, price int, quantity int

이제 Visual Studio에서 사용자는 하나의 열 (확인란에서)을 사용하여 데이터를 검색하고 텍스트 상자에 값을 입력하여 데이터베이스 테이블에서 해당 데이터를 찾을 수있는 검색 데이터베이스 기능을 만들고 있습니다.

이 기능은 내가 accno, 가격 및 수량을 검색 할 때 잘 작동합니다. 그러나 제목, 저자, 출판물을 검색 할 때 예외가 발생합니다.

심지어 pyzwyz를 사용하여 값을 string 또는 int로 변환하려고 시도했습니다.  등) 작동하지 않습니다.

내 C # 코드는 여기에 있습니다 (b/w convert.tostring 를 선언했습니다) SqlConnection con  그리고 SqlCommand  공개 클래스 형태로) :

SqlDataAdapter

private void button3_Click(object sender, EventArgs e) { if (!string.IsNullOrEmpty(comboBox2.Text) && !string.IsNullOrEmpty(textBox8.Text)) { cmd = new SqlCommand("SELECT * FROM bookdat WHERE title=@fdata OR author=@fdata OR publication=@fdata OR accno=@fdata OR price=@fdata OR quantity=@fdata", con); if (comboBox2.SelectedIndex == 0) cmd.Parameters.AddWithValue("@fdata", textBox8.Text); else if (comboBox2.SelectedIndex == 1) cmd.Parameters.AddWithValue("@fdata", textBox8.Text); else if (comboBox2.SelectedIndex == 2) cmd.Parameters.AddWithValue("@fdata", textBox8.Text); else if (comboBox2.SelectedIndex == 3) cmd.Parameters.AddWithValue("@fdata", textBox8.Text); else if (comboBox2.SelectedIndex == 4) cmd.Parameters.AddWithValue("@fdata", textBox8.Text); else if (comboBox2.SelectedIndex == 5) cmd.Parameters.AddWithValue("@fdata", textBox8.Text); da = new SqlDataAdapter(cmd); try { DataTable dt = new DataTable(); con.Open(); da.Fill(dt); cmd.ExecuteNonQuery(); dataGridView2.DataSource = dt; con.Close(); if (dt.Rows.Count> 0) { MessageBox.Show("Record Found!!"); comboBox2.Text = ""; textBox8.Text = ""; } else { MessageBox.Show("No Records Found!!"); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } else { MessageBox.Show("Please Fill The Required Fields To Find Data !!"); } }

  • 답변 # 1

    private void button3_Click(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(comboBox2.Text) && !string.IsNullOrEmpty(textBox8.Text))
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("SELECT * FROM bookdat WHERE");
    
           SqlCommand cmd = new SqlCommand(con);
            if (comboBox2.SelectedIndex == 0)
                {
                cmd.Parameters.AddWithValue("@fdata", textBox8.Text);
                sb.Append(" title=@fdata ");
            }
            else if (comboBox2.SelectedIndex == 1)
                {
                cmd.Parameters.AddWithValue("@fdata", textBox8.Text);
                sb.Append(" author=@fdata ");
                }
            else if (comboBox2.SelectedIndex == 2)
                {
                cmd.Parameters.AddWithValue("@fdata", textBox8.Text);
                sb.Append(" publication=@fdata ");
                }
            else if (comboBox2.SelectedIndex == 3)
                {
                cmd.Parameters.AddWithValue("@fdata", textBox8.Text);
                sb.Append(" accno=@fdata ");
                }
            else if (comboBox2.SelectedIndex == 4)
                {
                cmd.Parameters.AddWithValue("@fdata",int.Parse( textBox8.Text));
                sb.Append(" price=@fdata ");
                }
            else if (comboBox2.SelectedIndex == 5)
                {
                cmd.Parameters.AddWithValue("@fdata",int.Parse( textBox8.Text));
                sb.Append(" quantity=@fdata ");
                }
            cmd.CommandText  =sb.ToString();
            da = new SqlDataAdapter(cmd);
            try
            {
                DataTable dt = new DataTable();
                con.Open();
                da.Fill(dt);
                cmd.ExecuteNonQuery();
                dataGridView2.DataSource = dt;
                con.Close();
                if (dt.Rows.Count> 0)
                {
                    MessageBox.Show("Record Found!!");
                    comboBox2.Text = "";
                    textBox8.Text = "";
                }
                else
                {
                    MessageBox.Show("No Records Found!!");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
        else
        {
            MessageBox.Show("Please Fill The Required Fields To Find Data !!");
        }
    }
    
    

  • 답변 # 2

    실수는 다음과 같은 줄에 있습니다 :

    cmd.Parameters.AddWithValue("@fdata", textBox8.Text);
    
    

    암시 적 변환이 실패하므로 int로 변환

    cmd.Parameters.AddWithValue("@fdata", Convert.ToInt32(textBox8.Text));
    
    

    textBox8에 텍스트가 있는지 확인해야합니다.

    어쨌든 해결하기가 훨씬 쉬운 작업을 수행하기 위해 많은 논리를 갖고있는 것 같습니다.

    와이즈 비즈  예를 들어 statement는 훨씬 더 깨끗할 수 있습니다.

    if
    
    

  • 답변 # 3

    여기서는 테이블 구조 나 세부 사항을 잘 모르지만 여기에 어떻게 접근해야하는지에 대한 추측이 여전히 많습니다.

    첫 번째 단계는 다양한 열을 기반으로 bookdat에서 데이터를 찾을 수있는 저장 프로 시저를 만드는 것입니다. 이와 같은 것이 작동해야합니다. RECOMPILE 옵션을 확인하십시오. 이것이 중요한 이유에 대한 자세한 내용은 원래 의견의 기사를 참조하십시오.

    if (comboBox2.SelectedIndex == 0 || comboBox2.SelectedIndex == 1 || comboBox2.SelectedIndex == 2 || comboBox2.SelectedIndex == 3 || comboBox2.SelectedIndex == 4 || comboBox2.SelectedIndex == 5)
    {
         cmd.Parameters.AddWithValue("@fdata", textBox8.Text);
    }
    
    

    이제 데이터베이스에서 데이터를 검색 할 수있는 방법이 있으므로 dotnet 코드를 설정해야합니다. USING 명세서를 사용하고 있습니다. 이것은 IDisposable 인터페이스를 상속하는 객체에서 수행해야하는 작업입니다. 범위를 벗어난 객체는 항상 올바르게 처리되도록합니다. 데이터베이스 연결에 매우 중요합니다. 그렇지 않으면 연결 풀에 과부하가 걸립니다.

    특히 언어를 배우는 것처럼 보이므로 실제로 의미가있는 객체 이름을 사용합니다. 기본 번호가 지정된 이름 만 사용하는 것은 좋지 않습니다. 앞으로 코드를 유지해야 할 때는 이름이 아무 의미가없는 텍스트 상자가 무엇인지 기억하려고 노력하게 될 것입니다.

    create procedure bookdat_Search
    (
        @title varchar(50)
        , @author varchar(50)
        , @publication  varchar(50)
        , @accno int
        , @price int
        , @quantity int
    ) WITH RECOMPILE as begin
        set nocount on;
        SELECT * --explicitly name columns here, not all columns in the table.
        FROM bookdat b
        WHERE title = coalesce(@title, b.title)
            OR author = coalesce(@author, b.author)
            OR publication = coalesce(@publication, b.publication)
            OR accno = coalesce(@accno, b.accno)
            OR price = coalesce(@price, b.price)
            OR quantity = coalesce(@quantity, b.quantity)
    end
    
    
    private void button3_Click(object sender, EventArgs e) { try { if (string.IsNullOrEmpty(comboBox2.Text) || string.IsNullOrEmpty(textBox8.Text)) { MessageBox.Show("Please Fill The Required Fields To Find Data !!"); } else { using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["YourConnectionString"].ConnectionString)) { conn.Open(); using (SqlCommand cmd = new SqlCommand("bookdat_Search", conn)) { cmd.CommandType = System.Data.CommandType.StoredProcedure; switch (comboBox2.SelectedIndex) { case 1: cmd.Parameters.Add("@title", SqlDbType.VarChar, 50).Value = textBox8.Text; break; case 2: cmd.Parameters.Add("@author", SqlDbType.VarChar, 50).Value = textBox8.Text; break; case 3: cmd.Parameters.Add("@publication", SqlDbType.VarChar, 50).Value = textBox8.Text; break; case 4: cmd.Parameters.Add("@accno", SqlDbType.Int).Value = int.Parse(textBox8.Text); break; case 5: cmd.Parameters.Add("@price", SqlDbType.Int).Value = int.Parse(textBox8.Text); break; case 6: cmd.Parameters.Add("@quantity", SqlDbType.Int).Value = int.Parse(textBox8.Text); break; } using (SqlDataReader reader = cmd.ExecuteReader()) { if (reader.Read()) { MessageBox.Show("Record Found!!"); } else { MessageBox.Show("No Record Found!!"); } } } } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }

관련 자료

  • 이전 c++ - "Hello, world!"데스크톱 응용 프로그램 QT를 실행하려고하면 여러 오류가 발생합니다
  • 다음 android - 많은 항목이있는 중첩 된 RecyclerView의 높이를 "wrap_content"