2017-12-03 2 views
-1

SQL 테이블 행의 첫 번째 결과를 얻으려고합니다. 하지만 결과를 얻기 위해 클래스를 사용하여 제약 조건을 얻습니다. 먼저 공급자 전자 메일을 입력하여 공급자 코드를 표시하려고합니다.다른 클래스에 값을 던져 SQL 테이블의 첫 번째 행의 값을 가져옵니다.

public string tampil_register(string email_supplier) 
    { 
     SqlCommand command = new SqlCommand(); 

     command.CommandText = "SELECT kode_supplier FROM tb_supplier WHERE email_supplier = @email_supplier"; 
     command.Parameters.AddWithValue("@email_supplier", email_supplier); 
     command.CommandType = CommandType.Text; 
     command.Connection = con; 

     con.Open(); 
     SqlDataReader dr = command.ExecuteReader(); 
     string hasil; 
     while (dr.Read()) 
     { 
      hasil = dr.GetValue(0).ToString(); 
      return hasil; 
     } 
    } 

클래스 프로그램

protected void Button_register_supplier_Click(object sender, EventArgs e) 
    { 
     string email_supplier = TextBox_email_supplier.Text; 

     c_supplier reg = new c_supplier(); 

     reg.tampil_register(email_supplier); 

     Label_tampil_kode_user.Text = reg.tampil_register().ToString(); 
    } 

클래스 공급자는 그래서 사용자 코드 값을 얻기 위해 공급 업체 클래스에 내 프로그램 클래스에서 값을 발생합니다. 그런 다음이 사용자 코드가 텍스트 레이블에 표시되어 프로그램 클래스에 다시 표시됩니다.

+3

정확히이 코드는 작동하지 않습니까? – rene

+0

예,이 코드는 작동하지 않습니다. 문제는 클래스 공급자와'reg.tampil_register()에있는'return hasil '에 있습니다. ToString();'클래스 프로그램에 있음 @rene –

+0

정확히 ** 무엇이 문제입니까? – mjwills

답변

0

귀하의 c_supplier 클래스에는 디자인 결함이 있습니다. 클래스 레벨 SQLConnection 인스턴스를 사용하고 있습니다. 이는 내장 된 연결 풀을 이용하지 않는다는 것을 의미하기 때문에 (그리고 메모리 누수의 위험이있는 IDisposable 인터페이스를 구현하고 있기 때문에) 문제가됩니다. SQLConnection에 항상 지역 변수를 사용하고 가능한 한 빨리 처리해야합니다. 또한 ExecuteScalar을 사용해야하는 경우 ExecuteReader을 사용 중이므로 SQLCommand 인스턴스도 삭제하지 않습니다.

더 나은 코드는 다음과 같이 될 것이다 : - 한 번 문자열로 한 번없이 -

, 당신은 또한 두 번 tampil_register 방법을 호출했다되고 그건
public string tampil_register(string email_supplier) 
{ 
    using(var con = new SqlConnection(connectionString)) 
    { 
     using(var command = new SqlCommand("SELECT kode_supplier FROM tb_supplier WHERE email_supplier = @email_supplier", con)) 
     { 
      command.Parameters.Add("@email_supplier", SqlDbType.VarChar).Value = email_supplier; 
      con.Open(); 
      var hasil = command.ExecuteScalar(); 
      if(hasil != null && hasil != DBNull.Value) 
      { 
       return hasil.ToString(); 
      } 
     } 
    } 
    return ""; // in case no record was found 
} 

것은 그래서 당신의 버튼 클릭 코드는 아마되어야합니다 :

protected void Button_register_supplier_Click(object sender, EventArgs e) 
{ 
    c_supplier reg = new c_supplier(); 
    Label_tampil_kode_user.Text = reg.tampil_register(TextBox_email_supplier.Text); 
} 
+0

이 코드는 예상대로 작동하며 매우 유용합니다. 고마워요 @ ZoharPeled –

+0

[도움을 기쁘게 : -)] (http://meta.stackoverflow.com/questions/291325/how-to-show-appreciation-to-a-user-on-stackoverflow/291327#291327) –