0

データグリッドを使用して SQL Server から WinForm にデータを表示するようにもっとお願いしたいと思います。私はデータグリッドを作成しており、データを表示するストアドプロシージャは

ALTER PROC [dbo].[SP_GetData]
AS
  SELECT nama , nim
  FROM tabledata

データベースにアクセスする関数とストアド プロシージャを C# で作成しました。

string Sp_Name = "dbo.SP_GetData";

SqlConnection SqlCon = new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DBMahasiswa;Data Source=.");
SqlCon.Open();

SqlCommand SqlCom = new SqlCommand(Sp_Name , SqlCon);
SqlCom.CommandType = CommandType.StoredProcedure;

List<mahasiswaData> listMahasiswa = new List<mahasiswaData>();

using (SqlDataReader sqlDataReader = SqlCom.ExecuteReader())
{
   if (sqlDataReader.HasRows)
   {
      while (sqlDataReader.Read())
      {
         mahasiswaData DataMhs = new mahasiswaData();
         DataMhs.Nama = sqlDataReader["Name"].ToString();
         DataMhs.Umur = Convert.ToInt32(sqlDataReader["Age"]);
         listMahasiswa.Add(DataMhs);
      }
   }
}

SqlCon.Close();
return listMahasiswa;

最後に、表示ボタンにこのコードを追加します

dgvmahasiswa.DataSource = new MahasiswaDB().LoadMahasiswa();

誰かが障害がどこにあるのか、または代替案を教えてもらえますか?

どうもありがとうございます!:D

4

1 に答える 1

2

考慮すべき点:

  1. 現時点では、コードで例外が発生した場合、SqlConnection がぶらぶらしたままになります。SqlDataReader の using パターンを使用しました。すべての使い捨てオブジェクトに拡張する必要があります。

  2. あなたは例外を飲み込んでいます。クエリが失敗した場合、接続を確立できない場合、または他の何かが発生した場合、実際にはわかりません。関数は null を返すだけです。

  3. 名前や年齢が null になる可能性はありますか? 年齢は非数値ですか?予想外の値に対するテストはありません。これについても決して知ることはありません。

  4. レコードがない場合は、空のリストが返されます。これは望ましいことですか?それとも記録がないことを知りたいですか?

次のようなものを見ることをお勧めします。

public List<mahasiswaData> GetData(){


    List<mahasiswaData> gridData = new List<mahasiswaData>();


    try{

        using(SqlConnection conn = new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DBMahasiswa;Data Source=."))
        {
            using(SqlCommand command = new SqlCommand())
            {
                command.Connection = conn;
                command.CommandType = CommandType.StoredProcedure;
                command.Text = "dbo.SP_GetData";

                using(SqlDataReader reader = command.ExecuteReader())
                {
                    if(reader.HasRows){
                        while(reader.Read())
                        {
                           object rawName = reader.GetValue(reader.GetOrdinal("Name"));
                           object rawAge = reader.GetValue(reader.GetOrdinal("Age"));

                           if(rawName == DBNull.Value || rawAge == DBNull.Value)
                           {
                               //Use logging to indicate name or age is null and continue onto the next record
                               continue;
                           }
                           //Use the object intializer syntax to create a mahasiswaData object inline for simplicity
                           gridData.Add(new mahasiswaData()
                                                   {
                                Nama = Convert.ToString(rawName),
                                                        Umur = Convert.ToInt32(rawAge) 
                                                   });


                        }
                    }
                    else{
                        //Use logging or similar to record that there are no rows. You may also want to raise an exception if this is important.
                    }

                }

            }


        }


    }
    catch(Exception e)
    {
       //Use your favourite logging implementation here to record the error. Many projects use log4Net
       throw; //Throw the error - display and explain to the end user or caller that something has gone wrong!
    }


    return gridData;


}

age や name が null にならないことが確実な場合は、中央のセクションを単純化できます。

while (reader.Read())
{
    //Use the object intializer syntax to create a mahasiswaData object inline for simplicity
    gridData.Add(new mahasiswaData()
    {
        Nama = reader.GetString(reader.GetOrdinal("Name")),
        Umur = reader.GetInt32(reader.GetOrdinal("Age"))
    });

}
于 2012-04-22T15:27:39.257 に答える