ADO.NET数据库操作

一、连接数据库

关于SqlConnection类,MSDN中有详细解释:http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection.aspx

(1)直接在VS中创建数据库

 static void Main(string[] args)
        {
            string dataDir = AppDomain.CurrentDomain.BaseDirectory;
            if (dataDir.EndsWith(@"\bin\Debug\") || dataDir.EndsWith(@"\bin\Release\"))
            {
                dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
                AppDomain.CurrentDomain.SetData("Data Directory", dataDir);
            }
            SqlConnection conn = new SqlConnection(@"Data source=.\SQLEXPRESS;
                  AttachDBFilename=|DataDirectory|\Database2.mdf;Integrated Security=True;User Instance=True");
            conn.Open();
            Console.WriteLine("数据库连接成功");
            Console.ReadLine();
        }

(2)连接到SQL Server上

string connectionText = "Data Source=(local);Database=testDB;Integrated Security=true";
 SqlConnection myConn = new SqlConnection();
myConn.Open();

二、与数据库交互
(1)使用SqlCommand提交命令

SqlCommand类在MSDN中的解释:http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlcommand.aspx

 using(SqlConnection myConn=new SqlConnection(connectionText))
            {
                myConn.Open();
                string updateCmdText = "update student set stuName='"+txtStuName.Text.Trim()+"' where stuNumber='"+txtStuNumber.Text.Trim()+"'";
                SqlCommand cmd = new SqlCommand(updateCmdText,myConn);
                //如果不添加 cmd.ExecuteNonQuery();好像提交不到数据库中,查查为什么!
                cmd.ExecuteNonQuery();
                MessageBox.Show("更新成功!");
            }

(2)使用DataAdapter提交命令

SqlDataAdapter类在MSDN中的解释:http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqldataadapter.aspx

private static DataSet SelectRows(DataSet dataset,
    string connectionString,string queryString) 
{
    using (SqlConnection connection = 
        new SqlConnection(connectionString))
    {
        SqlDataAdapter adapter = new SqlDataAdapter();
        adapter.SelectCommand = new SqlCommand(
            queryString, connection);
        adapter.Fill(dataset);
        return dataset;
    }
}

其中SqlDataAdapter包含有:SelectCommand、InsertCommand、DeleteCommand、Fill
三、管理内存数据

  当完成对数据库的查询后,需要把所获得的数据保留下来,ADO.NET使用数据集对象在内存中缓存结果数据。

(1)使用DataTable实现内存表

DataTable在MSDN中的解释:http://msdn.microsoft.com/zh-cn/library/system.data.datatable.aspx

DataTable:数据表

DataCloumn:数据列

DataRow:数据行

Constraint:约束

DataRelation:关系

 private void btnCreateAndShow_Click(object sender, EventArgs e)
        {
            //首先声明一个DataTable
            DataTable myDT = new DataTable("StudentInfo");

            //生成学号列,并放入DataTable中
            DataColumn myDCStuNumber = new DataColumn();
            //设置学号列的数据类型Int32
            myDCStuNumber.DataType = System.Type.GetType("System.Int32");
            //设置学号的列名为学号
            myDCStuNumber.ColumnName = "学号";
            myDT.Columns.Add(myDCStuNumber);

            //生成姓名列,并放入DataTable中
            DataColumn myDTStuName = new DataColumn();
            //设置姓名列的数据类型为String类型
            myDTStuName.DataType = System.Type.GetType("System.String");
            //设置姓名列的列名为姓名
            myDTStuName.ColumnName = "姓名";
            myDT.Columns.Add(myDTStuName);

            //设置学号列作为DataTable主键
            DataColumn [] PrimaryKeyColumns=new DataColumn[1];
            PrimaryKeyColumns[0]=myDT.Columns["学号"];
            myDT.PrimaryKey = PrimaryKeyColumns;
            
            //向DataTable中插入数据
            DataRow myDR1 = myDT.NewRow();
            myDR1["学号"] = 2010181001;
            myDR1["姓名"] = "春天";
            myDT.Rows.Add(myDR1);

            DataRow myDR2 = myDT.NewRow();
            myDR2["学号"] = 2010181002;
            myDR2["姓名"] = "夏天";
            myDT.Rows.Add(myDR2);

            DataRow myDR3 = myDT.NewRow();
            myDR3["学号"] = 2010181003;
            myDR3["姓名"] = "秋天天";
            myDT.Rows.Add(myDR3);


            DataRow myDR4 = myDT.NewRow();
            myDR4["学号"] = 2010181004;
            myDR4["姓名"] = "冬天";
            myDT.Rows.Add(myDR4);

            //显示DataTable中的数据
            this.dataGridView1.DataSource = myDT;
        }

(2)使用DataSet管理数据

如果内存表DataTable对应的是数据库的表,那么DataSet对象则对应整个数据库。

DataSet是从数据源中检索到的数据在内存中的缓存,可以包含多个DataTable对象。

DataSet在MSDN中的解释:http://msdn.microsoft.com/zh-cn/library/system.data.dataset.aspx

<1>合并DataSet中的内容(Merge方法)

  private void Form1_Load(object sender, EventArgs e)
        {
            //连接数据库
            string connectionText = "Data Source=(local);Database=testDB;Integrated Security=true";
            using(SqlConnection myConn=new SqlConnection(connectionText))
            {
                //创建两个DataSet对象
                DataSet ds1 = new DataSet();
                DataSet ds2 = new DataSet();
                //创建一个SqlDataReader对象
                string sqlText1 = "select * from student";
                SqlDataAdapter sda1 = new SqlDataAdapter(sqlText1,myConn);
                //使用Fill()方法填充DataSet对象
                sda1.Fill(ds1);
                //创建第二个SqlDataReader对象
                string sqlText2 = "select * from employee";
                SqlDataAdapter sda2 = new SqlDataAdapter(sqlText2,myConn);
                sda2.Fill(ds2);
                ds1.Merge(ds2,true,MissingSchemaAction.AddWithKey);
                dataGridView1.DataSource=ds1.Tables[0];
            }
        }

<2>复制DataSet中的内容(Copy)

DataSet myDS;
        private void btnShow_Click(object sender, EventArgs e)
        {
            //创建到数据库的连接
            string connectionText = "Data Source=(local);Database=testDB;Integrated Security=true";
            using(SqlConnection myConn=new SqlConnection(connectionText))
            {
                //查询语句
                string selectText = "select * from Employee";
                //创建一个SqlDataAdapter对象
                SqlDataAdapter mySDA = new SqlDataAdapter(selectText,myConn);
                //创建一个DataSet对象
                myDS = new DataSet();
                //使用Fill方法填充DataSet对象
                mySDA.Fill(myDS);
                //设置dataGridView的数据源
                dataGridView1.DataSource=myDS.Tables[0];

            }
        }

        private void btnCopy_Click(object sender, EventArgs e)
        {
            DataSet myDS2 = myDS.Copy();
            dataGridView2.DataSource=myDS2.Tables[0];
        }

注:DataSet中可以复制到的内容有:
1>创建DataSet的原样副本(其中包含架构、数据、行状态信息和行版本)

2>创建包含现有的DataSet的架构,但仅包含已修改行的DataSet

3>仅复制DataSet的架构(即关系结构)

例如:Copy()方法就是一个深拷贝方法,深拷贝复制原对象的所有成员,对于引用类型成员亦复制其所指的堆上的对象。

        浅拷贝创建原对象类型的一个新实例,复制原对象的所有值类型数据

        Clone()方法只拷贝DataTable的结构(不包含数据)

(3)使用DataReader获取只读数据

SqlDataReader在MSDN中的解释:http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqldatareader.aspx

static void Main()
    {
        string str = "Data Source=(local);Initial Catalog=Northwind;"
            + "Integrated Security=SSPI";
        ReadOrderData(str);
    }

    private static void ReadOrderData(string connectionString)
    {
        string queryString =
            "SELECT OrderID, CustomerID FROM dbo.Orders;";

        using (SqlConnection connection =
                   new SqlConnection(connectionString))
        {
            SqlCommand command =
                new SqlCommand(queryString, connection);
            connection.Open();

            SqlDataReader reader = command.ExecuteReader();

            // Call Read before accessing data.
            while (reader.Read())
            {
                ReadSingleRow((IDataRecord)reader);
            }

            // Call Close when done reading.
            reader.Close();
        }
    }

    private static void ReadSingleRow(IDataRecord record)
    {
        Console.WriteLine(String.Format("{0}, {1}", record[0], record[1]));
    }

三、数据绑定

数据绑定:指系统在运行时自动将数据赋予控件的技术。

.NET中绑定技术包括两种方式:

(1)绑定数据到单值控件。单值控件可以一次显示一个数据值,包括TextBox、Label等。

(2)绑定数据到多值控件。多值控件可以同时显示一个或多个数据记录,包括列表控件ListBox、CheckBoxList、ComboBox等,复合绑定控件DataGridView、ListView等。

绑定到ComboxBox

 private void Form1_Load(object sender, EventArgs e)
        {
            TestData();
        }
        public void TestData()
        {
            string connectionText = "Data Source=(local);Database=testDB;Integrated Security=true";
            using(SqlConnection myConn=new SqlConnection(connectionText))
            {
                if(myConn.State==ConnectionState.Closed)
                {
                    myConn.Open();
                }
                //使用SqlCommand提交查询命令
                SqlCommand myCmd = new SqlCommand("select * from student",myConn);
                //获取数据适配器
                SqlDataAdapter mySDA = new SqlDataAdapter();
                mySDA.SelectCommand = myCmd;
                //填充DataSet
                DataSet myDS = new DataSet();
                mySDA.Fill(myDS);
                //将DataSet对象上的数据绑定到ComboxBox
                //cmbDataShow.DisplayMember = "stuNumber";
                cmbDataShow.ValueMember = "stuName";
                cmbDataShow.DataSource = myDS.Tables[0].DefaultView;
                //断开连接
                myConn.Close();
            }
        }

绑定到ListBox上

 string connectionText = "Data Source=(local);Database=testDB;Integrated Security=true";
             using (SqlConnection myConn = new SqlConnection(connectionText))
             {
                 if (myConn.State == ConnectionState.Closed)
                 {
                     myConn.Open();
                 }
                 //使用SqlCommand提交查询命令
                 SqlCommand myCmd = new SqlCommand("select * from student", myConn);
                 //获取数据适配器
                 SqlDataAdapter mySDA = new SqlDataAdapter();
                 mySDA.SelectCommand = myCmd;
                 SqlDataReader mySDR = myCmd.ExecuteReader();
                 while(mySDR.Read())
                 {
                     listBox1.Items.Add(mySDR[1].ToString());
                 }
                 myConn.Close();
             }

绑定到ListView上

 string connectionText = "Data Source=(local);Database=testDB;Integrated Security=true";
             using (SqlConnection myConn = new SqlConnection(connectionText))
             {
                 if (myConn.State == ConnectionState.Closed)
                 {
                     myConn.Open();
                 }
                 //使用SqlCommand提交查询命令
                 SqlCommand myCmd = new SqlCommand("select * from student", myConn);
                 //获取数据适配器
                 SqlDataAdapter mySDA = new SqlDataAdapter();
                 mySDA.SelectCommand = myCmd;
                 SqlDataReader mySDR = myCmd.ExecuteReader();
                 while(mySDR.Read())
                 {
                     listBox1.Items.Add(mySDR[1].ToString());
                 }
                 myConn.Close();
             }

将数据绑定到ListView

string connectionText = "Data Source=(local);Database=testDB;Integrated Security=true";
            using (SqlConnection myConn = new SqlConnection(connectionText))
            {
                if (myConn.State == ConnectionState.Closed)
                {
                    myConn.Open();
                }
                //使用SqlCommand提交查询命令
                SqlCommand myCmd = new SqlCommand("select * from student", myConn);
                SqlDataReader mySDR = myCmd.ExecuteReader();
                listView1.View = View.Details;
                listView1.FullRowSelect = true;
                while (mySDR.Read())
                {
                    ListViewItem myLVI = new ListViewItem(mySDR[0].ToString());
                    myLVI.SubItems.Add(mySDR[1].ToString());
                    listView1.Items.Add(myLVI);
                }
                myConn.Close();
            }

将数据绑定到DataGridView中

string connectionText = "Data Source=(local);Database=testDB;Integrated Security=true";
        private void btnPresent_Click(object sender, EventArgs e)
        {
            using(SqlConnection myConn=new SqlConnection(connectionText))
            {
                if(myConn.State==ConnectionState.Closed)
                {
                    myConn.Open();
                }
                //查询字符串
                string selectCommandText = "select * from student where stuNumber=' "+txtStuNumber.Text.Trim()+"'";
                //根据连接对象和SQL语句创建SqlCommand对象
                SqlCommand myComd = new SqlCommand(selectCommandText,myConn);
                //使用Command对象创建SqlDataReader对象
                SqlDataAdapter sda = new SqlDataAdapter(selectCommandText,myConn);
                DataSet ds = new DataSet();
                sda.Fill(ds,"student");
                dgvShow.DataSource=ds.Tables[0];
                
            }

实例:
http://www.cnblogs.com/chenyongblog/archive/2013/03/13/chenyongblog.html

原文地址:https://www.cnblogs.com/chenyongblog/p/2979764.html