###1、连接一个表,将表中的数据显示到表格控件中
private void Form1_Load(object sender, EventArgs e)
{
//设置连接字符串
SqlConnection conn = new SqlConnection(@"Data Source=张连康;
Initial Catalog=charge_sys;Persist Security Info=True;User ID=sa;Password=123456");
//打开连接
conn.Open();
//设置sql语句
string sql = "select * from user_info";
//适配器,作为一个桥梁,使用扩展sql语句将数据库映射到DataSet对象中
SqlDataAdapter adapter = new SqlDataAdapter(sql,conn);
//创建数据集合对象
DataTable dt = new DataTable();
//调用fill方法来填充DataSet对象
adapter.Fill(dt);
//设置表格控件的数据源为dt临时表
dataGridView1.DataSource = dt;
//关闭连接
conn.Close();
}
####SqlDataAdapter对象
SqlDataAdapter是 DataSet和 SQL Server之间的桥接器,用于检索和保存数据。SqlDataAdapter通过对数据源使用适当的Transact-SQL语句映射 Fill(它可更改DataSet中的数据以匹配数据源中的数据)和 Update(它可更改数据源中的数据以匹配 DataSet中的数据)来提供这一桥接。当SqlDataAdapter填充 DataSet时,它为返回的数据创建必需的表和列(如果这些表和列尚不存在)
####DataSet对象
可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合。所谓独立,就是说,即使断开数据链路,或者关闭数据库,DataSet依然是可用的,DataSet在内部是用XML来描述数据的,由于XML是一种与平台无关、与语言无关的数据描述语言,而且可以描述复杂关系的数据,比如父子关系的数据,所以DataSet实际上可以容纳具有复杂关系的数据,而且不再依赖于数据库链路。
###2、读取一条数据
private void Form1_Load(object sender, EventArgs e)
{
//设置连接字符串
SqlConnection conn = new SqlConnection(@"Data Source=张连康;
Initial Catalog=charge_sys;Persist Security Info=True;User ID=sa;Password=123456");
//打开连接
conn.Open();
//设置sql语句
string sql = "select * from user_info";
string userid=""; //初始化
//执行对象,定义并使用构造函数给SqlCommand里的Connection属性、CommandText属性赋值
SqlCommand cmd = new SqlCommand(sql,conn);
//读取对象,它没有构造函数,需要使用SqlCommand对象的ExecuterReader方法创建
SqlDataReader reader = reader = cmd.ExecuteReader();
//这个判断必须加,否则编译器会认为reader对象没有任何数据
if (reader.Read())
{
userid = reader["userid"].ToString(); //将从数据库中读到的数据转换成字符型,数据库中的数据类型是Sqlstring
}
//SqlDataReader对象一定要关闭
reader.Close();
//将读取到的userid的值显示在label控件中
labUserName.Text = userid;
//关闭数据库连接
conn.Close();
}
####SqlDataReader对象,注意事项
1、当SqlDataReader没有关闭之前,数据库连接会一直保持open状态,所以在使用SqlDataReader时,使用完毕应该马上调用SqlDataReader.Close()关闭它。
2、一个连接只能被一个SqlDataReader使用,这也是为什么要尽早关闭SqlDataReader的原因。
3、使用完SqlDataReader后,你可以在程序中显示的调用数据库连接对象的Close方法关闭连接,也可以在调用Command对象的ExecuteReader方法时传递CommandBehavior.CloseConnection 这个枚举变量,这样在调用SqlDataReader的Close方法时会自动关闭数据库连接。
4、使用SqlDataReader时尽量使用和数据库字段类型匹配的方法来取得相应的值,比如对于整形的字段使用GetInt32,对字符类型的字段使用GetString。这样会减少因为类型不一致而额外增加的类型转换操作。
5、使用SqlDataReader获取多条记录时,如果没有访问到取出记录的末尾时想要关闭SqlDataReader,应该先调用Command对象的Cancel方法,然后再调用SqlDataReader的Close方法。Command对象的Cancel方法使得数据库不再把SqlDataReader中未访问的数据发送到调用端,如果不调用此方法直接关闭SqlDataReader,数据库会发送和SqlDataReader未访问数据等长的空数据流到调用端。
6、如果想通过SqlCommand的ExecuteReader方法获取存储过程的返回值或者输出参数,必须先调用SqlDataReader的Close方法后,才能获取输出参数的值或者返回值。
7、如果使用SqlDataReader只返回一条记录,那么在调用Command的ExecuteReader方法时,指定CommandBehavior.SingleRow参数,这个参数的是否使用对SQL Server .NET Data Provider没有什么影响,但是当你使用OLE DB .NET Data Provider时,指定这个参数后,DataPrivider内部将使用IRow接口,而不是使用相对来说耗费资源的IRowSet接口。
总结:花了4小时,终于连上了。经验感悟,不要上来就直接用三层架构写连接,因为还不熟悉,不用三层架构将数据库连上,并成功读取数据之后,在使用三层架构改进。在这个过程中,可以了解连接数据库需要那些对象,这些对象的作用是什么。我觉得这样做,会大大提高效率,而且不会把自己搞乱。
巨人的肩膀是伟大的,但要学会使用搜索引擎,会让我们得到的信息更加精确、有效。