这篇文章上次修改于 238 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

对象与数据库连接

Connection对象用于与特定数据源的连接。通过属性可描述数据源和用户身份验证,通过提供的方法与数据源建立连接或断开连接

名称命名空间描述
SqlConnectionSystem.Data.SqlClient表示与SQL Server数据源的连接
OleDbConnectionSystem.Data.OleDb表示与OleDb数据源的连接
OdbcConnectionSystem.Data.Odbc表示与ODBC数据源的连接
OracleConnectionSystem.Data.OracleClient表示与Oracle数据源的连接

数据库连接字符串常用参数已经说明

参数说明
Provider用于设置或返回连接提供程序的名称,仅用于 OleDbConnection对象
Connection Timeout在终止尝试并产生异常前,等待连接到服务器的连接时间长度,默认 15 s
Initial Catalog 或 Database数据库的名称
Data Source 或 Server连接打开时使用的SQL Server名称,或是 Microsoft Access数据库的文件名
Password 或 pwdSQL Server 账户的登录密码
User ID 或 uidSQL Server登录账户
Integrated Security此参数决定连接是否是安全连接,可能的值有 True,False 和 SSPI
namespace _01数据库的连接
{
    class Program
    {
        static void Main(string[] args)
        {
            // 1. 创建连接字符串
            String conStr1 = 
                "Data Source=DESKTOP-72OOJRR; " +
                "Initial Catalog=MyDB;Integrated " +
                "Security=true"
                ;
            // 1.2 简单方法 vs 自动生成
            String conStr2 = "Data Source=DESKTOP-72OOJRR;Initial Catalog=MyDB;Integrated Security=True";

            // 1.3 用户名密码登录
            String conStr3 = "Data Source=DESKTOP-72OOJRR;Initial Catalog=MyDB;User ID=sa;Password=***********";

            // 2. 创建数据库连接对象
            SqlConnection conn = new SqlConnection(conStr1);
            // 3. 打开数据库的连接
            Console.WriteLine(conn.State);
            conn.Open();
            Console.WriteLine("数据库的连接已经打开了");
            Console.WriteLine(conn.State);
            // 4. 关闭连接、释放资源
            conn.Close();
            conn.Dispose();
            Console.WriteLine("数据库的连接已经关闭了");
            Console.WriteLine(conn.State);
        }
    }
}

课后作业

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _01数据库连接_作业
{
    public partial class Form1 : Form
    {
        public static String conStr = "Data Source=DESKTOP-72OOJRR;Initial Catalog=MyDB;Integrated Security=True";
        public static SqlConnection conn = new SqlConnection(conStr);
        public Form1()
        {
            InitializeComponent();
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (label2.Text == "Open")
            {
                MessageBox.Show("数据库已经连接了");
            }
            else
            {
                conn.Open();
                label2.Text = "Open";
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
           

        }

        private void button2_Click(object sender, EventArgs e)
        {

            if (label2.Text == "Closed")
            {
                MessageBox.Show("数据库已经关闭了");
            }
            else
            {
                conn.Close();
                label2.Text = "Closed";
            }

        }
    }
}

Over

Command命令 对象 执行命令

与数据源建立连接后,可以使用 Command对象对数据源执行添加、删除、修改和查询等操作,如果数据源是SqlServer,则需要 SqlCommand对象

方法说明
ExecuteNonQuery用于执行非SELECT命令,比如INSERT、DELETE或者UPDATE命令,并返回受影响的行数
ExecuteScalar用于执行SELECT命令,返回结果集中的第一行的第一列,该方法通常用来执行那些用到COUNT或SUM函数的SELECT命令
ExecuteReader用于执行SELECT命令,并返回一个DataReader对象,这个DataReader对象是一个只读向前的数据集
using System;
using System.Data.SqlClient;

namespace _02_SqlCommand命令对象
{
    class Program
    {
        static void Main(string[] args)
        {
            // 1. 创建数据库连接字符串
            // 2. 创建连接对象
            // 3. 编写Sql语句
            // 4. 创建执行Sql语句的命令对象
            // 5. 打开数据库连接
            // 6. 执行sql语句
            // 7. 关闭连接,释放资源

            #region 1. 增加记录
            // 1. 创建数据库连接字符串
            String conStr = "Data Source=DESKTOP-72OOJRR;Initial Catalog=MyDB;Integrated Security=True";
            // 2. 创建连接对象 类似 python 中的 with open,会有自动关闭效果
            using (SqlConnection conn = new SqlConnection(conStr))
            {
                // 3. 编写Sql语句
                string sql = "Insert into Person (Name, Age) values('张三', 16)";
                // 4. 创建执行Sql语句的命令对象
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {

                    // 5. 打开数据库连接
                    conn.Open();
                    // 6. 执行sql语句
                    int n = cmd.ExecuteNonQuery();
                    if (n > 0)
                    {
                        Console.WriteLine("成功添加了{0}条记录", n);
                    }
                    else
                    {
                        Console.WriteLine("记录添加失败");
                    }
                    // 7. 关闭连接,释放资源
                }
            }
            #endregion
            #region 2. 删除记录
            // 1. 创建数据库连接字符串
            //String conStr = "Data Source=DESKTOP-72OOJRR;Initial Catalog=MyDB;Integrated Security=True";
            // 2. 创建连接对象 类似 python 中的 with open,会有自动关闭效果
            using (SqlConnection conn = new SqlConnection(conStr))
            {
                // 3. 编写Sql语句
                string sql = "delete from Person where Name = '张三'";
                // 4. 创建执行Sql语句的命令对象
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {

                    // 5. 打开数据库连接
                    conn.Open();
                    // 6. 执行sql语句
                    int n = cmd.ExecuteNonQuery();
                    if (n > 0)
                    {
                        Console.WriteLine("成功删除了了{0}条记录", n);
                    }
                    else
                    {
                        Console.WriteLine("记录删除失败");
                    }
                    // 7. 关闭连接,释放资源
                }
            }
            #endregion

            #region 3. 修改记录
            // 2. 创建连接对象 类似 python 中的 with open,会有自动关闭效果
            using (SqlConnection conn = new SqlConnection(conStr))
            {
                // 3. 编写Sql语句
                string sql = "update Person set Name = '大明' where ID = 1";
                // 4. 创建执行Sql语句的命令对象
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {

                    // 5. 打开数据库连接
                    conn.Open();
                    // 6. 执行sql语句
                    int n = cmd.ExecuteNonQuery();
                    if (n > 0)
                    {
                        Console.WriteLine("成功修改了{0}条记录", n);
                    }
                    else
                    {
                        Console.WriteLine("记录修改失败");
                    }
                    // 7. 关闭连接,释放资源
                }
            }
            #endregion
            #region 4. 查询记录的条数
            // 1. 创建数据库连接字符串
            //String conStr = "Data Source=DESKTOP-72OOJRR;Initial Catalog=MyDB;Integrated Security=True";
            // 2. 创建连接对象 类似 python 中的 with open,会有自动关闭效果
            using (SqlConnection conn = new SqlConnection(conStr))
            {
                // 3. 编写Sql语句
                string sql = "select count(*) from Person";
                // 4. 创建执行Sql语句的命令对象
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {

                    // 5. 打开数据库连接
                    conn.Open();
                    // 6. 执行sql语句
                    int n = (int)cmd.ExecuteScalar();
                    if (n > 0)
                    {
                        Console.WriteLine("成功查询了{0}条记录", n);
                    }
                    else
                    {
                        Console.WriteLine("记录查询失败");
                    }
                    // 7. 关闭连接,释放资源
                }
            }
            #endregion
        }
    }
}

DataReader 数据读取对象

DataReader对象是一个简单的数据集,它主要是从数据源中读取只读的数据集,常用于检索大量数据。使用DataReader对象读取数据时,必须一直保持与数据库的连接,所以也被称为连线模式

using System;
using System.Data.SqlClient;

namespace _02控制台_DataReader
{
    class Program
    {
        static void Main(string[] args)
        {
            // 1. 创建数据库连接字符串
            string conStr = "Data Source=DESKTOP-72OOJRR;Initial Catalog=MyDB;Integrated Security=True";

            // 2. 创建连接对象
            using (SqlConnection conn = new SqlConnection(conStr))
            {
                // 3. 编写 sql 语句
                string sql = "select * from Person";

                // 4. 创建执行 sql 语句的命令对象
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    // 5. 打开数据库
                    conn.Open();
                    // 6. 执行sql语句
                    SqlDataReader reader = cmd.ExecuteReader();
                    // 判断是否有记录
                    if (reader.HasRows)
                    {
                        // 每一列
                        while (reader.Read())
                        {
                            Console.WriteLine(reader["ID"] + " " + reader["Name"] + " " + reader["Age"]);
                        }
                    }
                    else
                    {
                        Console.WriteLine("Person表中没有记录");
                    }
                }
            }
        }
    }
}

窗体

DataGridView 控件

  • From1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            LoadData();
        }
        List<Person> list;
        private void LoadData()
        {
            // 1. 创建数据库连接字符串
            string conStr = "Data Source=DESKTOP-72OOJRR;Initial Catalog=MyDB;Integrated Security=True";

            // 2. 创建连接对象
            using (SqlConnection conn = new SqlConnection(conStr))
            {
                // 3. 编写 sql 语句
                string sql = "select * from Person";

                // 4. 创建执行 sql 语句的命令对象
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    // 5. 打开数据库
                    conn.Open();
                    // 6. 执行sql语句
                    SqlDataReader reader = cmd.ExecuteReader();
                    // 判断是否有记录
                    if (reader.HasRows)
                    {
                        list = new List<Person>();
                        // 每一列
                        while (reader.Read())
                        {

                            //Console.WriteLine(reader["ID"] + " " + reader["Name"] + " " + reader["Age"]);
                            int id = reader.GetInt32(0);
                            string name = reader.GetString(1);
                            int age = reader.GetInt32(2);

                            Person person = new Person(id, name, age);
                            list.Add(person);
                        }
                        dataGridView1.DataSource = list; // 数据绑定
                    }
                    else
                    {
                        Console.WriteLine("Person表中没有记录");
                    }
                }
            }

        }
    }
}
  • Person.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace WindowsFormsApp2
    {
        class Person
        {
            private int ID;
            private String name;
            private int age;
    
            public int ID1 { get => ID; set => ID = value; }
            public string Name { get => name; set => name = value; }
            public int Age { get => age; set => age = value; }
    
            public Person(int iD, string name, int age)
            {
                ID = iD;
                this.name = name;
                this.age = age;
            }
        }
    }
    

### DataSet对象 和 DataAdapter对象

DataSet对象是 ADO.NET的核心成员,它是支持 ADO.NET段开式、分布式数据方案的核心,也是实现基于非连接数据查询的核心组件。一个 DataSet对象可以包含多个DataTable对象

DataAdapter对象(数据适配器)是专门为 DataSet对象服务的,用来充当 DataSet对象与实际数据源之间桥梁

  • 从数据源中检索数据,并将检索到的结果集填充到DataSet对象中
  • 把用户对DataSet对象作出的更改写入到数据源中
方法说明
Fill从数据源中提取数据以填充数据集
Update更新数据源
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            LoadData();
        }

        private void LoadData()
        {
            string conStr = "Data Source=DESKTOP-72OOJRR;Initial Catalog=MyDB;Integrated Security=True";
            using(SqlConnection conn = new SqlConnection(conStr))
            {
                string sql = "select * from Person";
                using (SqlDataAdapter adapter = new SqlDataAdapter(sql, conn))
                {
                    DataSet ds = new DataSet();
                    adapter.Fill(ds, "person");
                    dataGridView1.DataSource = ds.Tables["person"];
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            int n;
            string conStr = "Data Source=DESKTOP-72OOJRR;Initial Catalog=MyDB;Integrated Security=True";
            using (SqlConnection conn = new SqlConnection(conStr))
            {
                string sql = "select * from Person";
                using (SqlDataAdapter adapter = new SqlDataAdapter(sql, conn))
                {
                    DataSet ds = new DataSet();
                    adapter.Fill(ds, "person");
                    DataTable dt = ds.Tables["person"];
                    // 都是以行的形式
                    DataRow row = dt.NewRow();
                    // 添加一条记录
                    row["Name"] = "张三";
                    row["Age"] = 20;
                    dt.Rows.Add(row);
                    // 更新数据源, 观察结果,判断(自动生成更新语句)
                    SqlCommandBuilder sc = new SqlCommandBuilder(adapter);
                    n = adapter.Update(dt);
                }
            }
            if (n > 0)
            {
                LoadData();
                MessageBox.Show("记录添加成功");
            }
            else
            {
                MessageBox.Show("记录添加失败");
            }
        }
    }
}

Over