C#连接SQL数据库

###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小时,终于连上了。经验感悟,不要上来就直接用三层架构写连接,因为还不熟悉,不用三层架构将数据库连上,并成功读取数据之后,在使用三层架构改进。在这个过程中,可以了解连接数据库需要那些对象,这些对象的作用是什么。我觉得这样做,会大大提高效率,而且不会把自己搞乱。
  巨人的肩膀是伟大的,但要学会使用搜索引擎,会让我们得到的信息更加精确、有效。

你可能感兴趣的:(C#,C#)