第一种方法:利用SqlDataAdapter的Fill()方法,
优点:可以不用考虑数据库表中每一列的数据类型,将数据一次性导入到表中;
缺点:不能在查询过程中编辑查询的数据
string sql = "select ordernumber,materialscode,productname,materialsquantity from OrderDetails where ordernumber = @ordernumber";
SqlParameter[] pms = new SqlParameter[] {
new SqlParameter("@ordernumber",SqlDbType.Int){Value= this.txtordernumber.Text.Trim()}
};
public static DataTable ExecuteDataTable(string sql,params SqlParameter [] pms)
{
DataTable dt = new DataTable();
//dt = null;
using (SqlDataAdapter sda = new SqlDataAdapter(sql,constr))
{
if (pms != null)
{
sda.SelectCommand.Parameters.AddRange(pms);
}
sda.Fill(dt);
}
return dt;
}
dt = SQLHelper.ExecuteDataTable(sql,pms);
第二种方法:先创建一个类,类的属性包含所有需要查询的数据库表中的列名,然后再创建一个List<类类型>集合,利用SqlDataReader 将表中的数据逐行读取保存到list集合中,最后将list集合赋值给datagridview的datasouce.
优点:可以在查询过程中,编辑所查询出的数据;
缺点:需要考虑数据库表中每一列的数据类型和所创建的类的属性数据类型保持一致,至少能够自动转换。有时如果表中的列的数据类型是float,类中该列的属性必须需设置为double才能转换,否则该列数据查询时会出现异常,float和double精度不一样。
private List<OrderSchedule> GetOrderScheduleValue()
{
List<OrderSchedule> list = new List<OrderSchedule>();
string sql = "select orderstartdate,ordernumber,orderstatus,orderfinishdate from OrderSchedule where orderstartdate = @orderstartdate";
SqlParameter[] pms = new SqlParameter[]{
new SqlParameter("@orderstartdate",SqlDbType.Date){Value = dtpOrderDate.Text.Trim()}
};
using (SqlDataReader Reader = SQLHelper.ExecuteReader(sql, pms))
{
if (Reader.HasRows)
{
while (Reader.Read())
{
OrderSchedule ObjOrderSchedule = new OrderSchedule();
ObjOrderSchedule.orderdate = (Reader.GetDateTime(0).ToString()).Substring(0,10);
ObjOrderSchedule.ordernumber = Reader.GetString(1);
if (Reader.GetBoolean(2))
{
ObjOrderSchedule.orderstatus = "已完成";
}
else
{
ObjOrderSchedule.orderstatus = "没完成";
}
if (Reader.IsDBNull(3))//如果查询到一行的orderfinisheddate列中字段为null
{
ObjOrderSchedule.orderfinisheddate = "";
}
else
{
ObjOrderSchedule.orderfinisheddate = (Reader.GetDateTime(3).ToString()).Substring(0, 10);
}
list.Add(ObjOrderSchedule);
}
}
}
return list;
}
List<OrderSchedule> objOrderSchedule = GetOrderScheduleValue();
dgvFrmCheckList.DataSource = objOrderSchedule;