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. 姓名或年龄是否可以为空?年龄不是数字?没有任何意外值的测试,您也永远不会知道。

  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;


}

请注意,如果您确定年龄或姓名永远不会为空,那么您可以简化中间部分:

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 回答