2017-12-03 1 views
-1

SQLテーブルの行から最初の結果を取得しようとしています。しかし、クラスを使用して結果を取得することで制約が得られます。 私は最初にこのようなサプライヤーの電子メールを入力してサプライヤーコードを表示したいと思います。別のクラスに値をスローして、SQLテーブルの最初の行の値を取得します。

クラスプログラム

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(); 
    } 

クラスサプライヤ

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; 
     } 
    } 

だから私は、ユーザーコードの値を取得するためにサプライヤークラスに私のプログラムのクラスから値をスローします。このユーザーコードは、テキストラベルに表示することで、プログラムクラスに再び表示されます。

+3

このコードは正確には動作しません。 – rene

+0

はい、このコードは動作しません。問題はClass Supplierと 'reg.tampil_register()にある' return hasil'にあります。 ToString(); 'はクラスプログラムにあります@rene –

+0

何が**正確に**問題ですか? – mjwills

答えて

0

あなたのc_supplierクラスには設計上の欠陥があります。クラスレベルのSQLConnectionインスタンスを使用しています。これは、組み込みの接続プールを利用していない(そして、メモリリークの危険性があるIDisposableインターフェイスを実装しているため)、問題です。 SQLConnectionには常にローカル変数を使用し、できるだけ早く処分する必要があります。また、ExecuteScalarを使用する必要がある場合はExecuteReaderを使用しており、SQLCommandインスタンスも廃棄していません。

良いコードはこのようなものになるだろう: - 一度文字列を使用して、一度なし - 言われていること

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 
} 

、あなたはまた、二回tampil_registerメソッドを呼び出しているので、あなたのボタンクリックのコードは、おそらく次のようになります。

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) –

関連する問題