.net中读写数据库需要用到那些类?他们的作用?

答:SqlConnection连接、SqlCommand操作、SqlDataReader读取、DataSet数据管理、
SqlDataAdapter数据适配

SqlConnection对象

要与数据库进行交互,您必须与其建立连接。该连接有助于识别数据库服务器,数据库名称,用户名,密码以及连接到数据库所需的其他参数。命令对象使用连接对象,因此它们将知道要在哪个数据库上执行命令。

using System;
using System.Data;
using System.Data.SqlClient;

/// <summary>
/// 演示如何使用SqlConnection对象
/// </summary>
class SqlConnectionDemo
{
    static void Main()
    {
        // 1. 实例化连接
        SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI");
        SqlDataReader rdr = null;
        try
        {
            // 2. 打开连接
            conn.Open();
            // 3. 将连接传递给命令对象
            SqlCommand cmd = new SqlCommand("select * from Customers", conn);
            //
            // 4. 使用连接
            //
            // 获取查询结果
            rdr = cmd.ExecuteReader();
            //打印每个记录的客户ID
            while (rdr.Read())
            {
                Console.WriteLine(rdr[0]);
            }
        }
        finally
        {
            // 关闭读取
            if (rdr != null)
            {
                rdr.Close();
            }
            // 5. 关闭连接
            if (conn != null)
            {
                conn.Close();
            }
        }
    }
}

获得单一值

SqlCommand cmd = new SqlCommand("select count(*) from Categories", conn);

int count = (int)cmd.ExecuteScalar();

清单1. SqlConnection演示

using System;
using System.Data;
using System.Data.SqlClient;

/// <summary>
/// 演示如何使用SqlCommand对象
/// </summary>
class SqlCommandDemo
{
    SqlConnection conn;
    public SqlCommandDemo()
    {
        // 实例化连接
        conn = new SqlConnection("Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI");
    }
    // 调用演示SqlCommand功能的方法
    static void Main()
    {
        SqlCommandDemo scd = new SqlCommandDemo();
        Console.WriteLine();
        Console.WriteLine("插入前的数据库");
        Console.WriteLine("------------------------");
        //使用ExecuteReader方法
        scd.ReadData();
        //使用ExecuteNonQuery方法插入
        scd.Insertdata();
        Console.WriteLine();
        Console.WriteLine("插入后的数据库");
        Console.WriteLine("------------------------------");
        scd.ReadData();
        //使用ExecuteNonQuery方法更新
        scd.UpdateData();
        Console.WriteLine();
        Console.WriteLine("更新后的数据库");
        Console.WriteLine("------------------------------");
        scd.ReadData();
        //使用ExecuteNonQuery方法删除
        scd.DeleteData();
        Console.WriteLine();
        Console.WriteLine("删除后的数据库");
        Console.WriteLine("------------------------------");
        scd.ReadData();
        //使用ExecuteScalar方法
        int numberOfRecords = scd.GetNumberOfRecords();
        Console.WriteLine();
        Console.WriteLine("记录数: {0}", numberOfRecords);
    }
    /// <summary>
    /// 使用ExecuteReader方法
    /// </summary>
    public void ReadData()
    {
        SqlDataReader rdr = null;
        try
        {
            //打开连接
            conn.Open();
            // 1.使用查询和连接实例化一个新命令
            SqlCommand cmd = new SqlCommand("select CategoryName from Categories", conn);
            // 2.调用Execute reader获取查询结果
            rdr = cmd.ExecuteReader();
            // 打印每个记录的类别名称
            while (rdr.Read())
            {
                Console.WriteLine(rdr[0]);
            }
        }
        finally
        {
            // 关闭读取器
            if (rdr != null)
            {
                rdr.Close();
            }
            // 关闭连接
            if (conn != null)
            {
                conn.Close();
            }
        }
    }
    /// <summary>
    /// 使用ExecuteNonQuery方法用于插入
    /// </summary>
    public void Insertdata()
    {
        try
        {
            // 打开连接
            conn.Open();
            // 准备命令串
            string insertString = @"insert into Categories (CategoryName, Description) values ('Miscellaneous', 'Whatever doesn''t fit elsewhere')";
            // 1. 使用查询和连接实例化一个新命令
            SqlCommand cmd = new SqlCommand(insertString, conn);
            // 2. 调用ExecuteNonQuery发送命令
            cmd.ExecuteNonQuery();
        }
        finally
        {
            // 关闭连接
            if (conn != null)
            {
                conn.Close();
            }
        }
    }
    /// <summary>
    /// 使用ExecuteNonQuery方法用于更新
    /// </summary>
    public void UpdateData()
    {
        try
        {
            // 打开连接
            conn.Open();
            // 准备命令字符串
            string updateString = @"update Categories set CategoryName = 'Other'where CategoryName = 'Miscellaneous'";
            // 1. 仅使用命令文本实例化新命令
            SqlCommand cmd = new SqlCommand(updateString);
            // 2. 设置连接属性
            cmd.Connection = conn;
            // 3. 调用ExecuteNonQuery发送命令
            cmd.ExecuteNonQuery();
        }
        finally
        {
            // 关闭连接
            if (conn != null)
            {
                conn.Close();
            }
        }
    }
    /// <summary>
    /// 使用ExecuteNonQuery删除方法
    /// </summary>
    public void DeleteData()
    {
        try
        {
            // 打开连接
            conn.Open();
            // 准备命令字符串
            string deleteString = @" delete from Categories where CategoryName = 'Other'";
            // 1. 实例化一个新命令
            SqlCommand cmd = new SqlCommand();
            // 2. 设置CommandText属性
            cmd.CommandText = deleteString;
            // 3. 设置Connection属性
            cmd.Connection = conn;
            // 4.调用ExecuteNonQuery发送命令
            cmd.ExecuteNonQuery();
        }
        finally
        {
            // 关闭连接
            if (conn != null)
            {
                conn.Close();
            }
        }
    }
    /// <summary>
    /// 使用ExecuteScalar方法
    /// </summary>
    /// <returns>记录数</returns>
    public int GetNumberOfRecords()
    {
        int count = -1;
        try
        {
            // 打开连接
            conn.Open();
            // 1. 实例化一个新命令
            SqlCommand cmd = new SqlCommand("select count(*) from Categories", conn);
            // 2. 调用ExecuteScalar发送命令
            count = (int)cmd.ExecuteScalar();
        }
        finally
        {
            // 关闭连接
            if (conn != null)
            {
                conn.Close();
            }
        }
        return count;
    }
}

SqlCommand对象

与数据库交互的过程意味着您必须指定要发生的操作。这是通过命令对象完成的。您使用命令对象将SQL语句发送到数据库。命令对象使用连接对象来确定要与哪个数据库通信。您可以单独使用命令对象,直接执行命令,或将命令对象的引用分配给SqlDataAdapter,SqlDataAdapter包含一组处理一组数据的命令,如下所述。

// 1. 使用查询和连接实例化一个新命令

SqlCommand cmd = new SqlCommand("select CategoryName from Categories", conn);
    // 2. 调用Execute reader获取查询结果
    SqlDataReader rdr = cmd.ExecuteReader();

插入数据

string insertString = @"insert into Categories(CategoryName, Description)values ('Miscellaneous', 'Whatever doesn''t fit elsewhere')";
            SqlCommand cmd = new SqlCommand(insertString, conn);
            cmd.ExecuteNonQuery();

更新数据

// 定义命令字符串
            string updateString = @"update Categories set CategoryName = 'Other'where CategoryName = 'Miscellaneous'";
            // 1. 仅使用命令文本实例化新命令
            SqlCommand cmd = new SqlCommand(updateString);
            // 2. 设置Connection属性
            cmd.Connection = conn;
            // 3. 调用ExecuteNonQuery发送命令
            cmd.ExecuteNonQuery();

删除数据

// 准备命令串
            string deleteString = @"delete from Categories where CategoryName = 'Other'";
            // 1. .实例化一个新命令
            SqlCommand cmd = new SqlCommand();
            // 2.设置CommandText属性
            cmd.CommandText = deleteString;
            // 3. 设置Connection属性
            cmd.Connection = conn;
            // 4. 调用ExecuteNonQuery发送命令
            cmd.ExecuteNonQuery();

SqlDataReader对象

许多数据操作要求您只获取用于读取的数据流。数据读取器对象允许您从命令对象获取SELECT语句的结果。出于性能原因,从数据读取器返回的数据是仅限快进的数据流。这意味着您只能以顺序方式从流中提取数据这对速度有利,但如果您需要操作数据,那么DataSet是一个更好的对象。

创建SqlDataReader对象

SqlDataReader rdr = cmd.ExecuteReader();

数据读取

while (rdr.Read())
    {
        // 获取每个列字符串的结果
        string contact = (string)rdr["ContactName"];
        string company = (string)rdr["CompanyName"];
        string city    = (string)rdr["City"];
        // 打印出结果
        Console.Write("{0,-25}", contact);
        Console.Write("{0,-20}", city);
        Console.Write("{0,-25}", company);
        Console.WriteLine();
    }

整理

try
    {
        // 数据访问代码    }
    finally
    {
        // 3. 关闭读取器
        if (rdr != null)
        {
            rdr.Close();
        }
        // 关闭连接
    }

清单1:使用SqlDataReader

using System;
using System.Data;
using System.Data.SqlClient;
namespace Lesson04
{
    class ReaderDemo
    {
        static void Main()
        {
            ReaderDemo rd = new ReaderDemo();
            rd.SimpleRead();
        }
        public void SimpleRead()
        {
            // 声明SqlDataReader中,这是在使用//两个try块和finally块 
            SqlDataReader rdr = null;
            // 创建连接对象
            SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI");
            // 创建一个命令对象 
            SqlCommand cmd = new SqlCommand("select * from Customers", conn);
            try
            {
                // 打开连接
                conn.Open();
                // 1. 获取SqlDataReader的实例 
                rdr = cmd.ExecuteReader();
                // 打印一组列标题 
                Console.WriteLine("Contact Name City Company Name");
                Console.WriteLine("--------------------------------");
                // 2. 打印每个必要的列记录
                while (rdr.Read())
                {
                    // 获取每个列字符串的结果
                    string contact = (string)rdr["ContactName"];
                    string company = (string)rdr["CompanyName"];
                    string city = (string)rdr["City"];
                    // 打印出结果
                    Console.Write("{0,-25}", contact);
                    Console.Write("{0,-20}", city);
                    Console.Write("{0,-25}", company);
                    Console.WriteLine();
                }
            }
            finally
            {
                // 3. 关闭读取器
                if (rdr != null)
                {
                    rdr.Close();
                }
                // 关闭连接
                if (conn != null)
                {
                    conn.Close();
                }
            }
        }
    }
}

DataSet对象

DataSet对象是数据的内存表示。它们包含多个Datatable对象,这些对象包含列和行,就像普通的数据库表一样。您甚至可以定义表之间的关系以创建父子关系。DataSet专门用于帮助管理内存中的数据,并在这种情况有意义时支持对数据的断开操作。DataSet是所有数据提供程序使用的对象,这就是它没有数据提供程序特定前缀的原因。

SqlDataAdapter对象

有时,您使用的数据主要是只读的,您很少需要对基础数据源进行更改。某些情况还要求在内存中缓存数据,以最大限度地减少不更改数据的数据库调用次数。通过数据适配器,您可以通过帮助以断开连接模式管理数据来轻松完成这些任务。数据适配器在读取数据时填充DataSet对象,并在将更改持久保存到数据库时在单个批处理中写入。数据适配器包含对连接对象的引用,并在读取或写入数据库时自动打开和关闭连接。此外,数据适配器包含对数据的SELECT,INSERT,UPDATE和DELETE操作的命令对象引用。您将为DataSet中的每个表定义一个数据适配器,它将为您处理与数据库的所有通信。您需要做的就是告诉数据适配器何时加载或写入数据库。

创建DataSet对象

DataSet dsCustomers = new DataSet();

创建SqlDataAdapter

SqlDataAdapter daCustomers = new SqlDataAdapter("select CustomerID, CompanyName from Customers", conn);

使用SqlCommandBuilder向SqlDataAdapter添加命令的方法:

SqlCommandBuilder cmdBldr = new SqlCommandBuilder(daCustomers);

填充DataSet

daCustomers.Fill(dsCustomers, "Customers");

使用DataSet

dgCustomers.DataSource = dsCustomers; 
dgCustomers.DataMember = "Customers";

更新更改

daCustomers.Update(dsCustomers, "Customers");

完整演示:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Windows.Forms;
class DisconnectedDataform : Form
{
    private SqlConnection conn;
    private SqlDataAdapter daCustomers;
    private DataSet dsCustomers;
    private DataGrid dgCustomers;
    private const string tableName = "Customers";
    //使用DataGrid和Button public 初始化表单
    public DisconnectedDataform()
    {
        // 填充数据集
        Initdata();
        // 设置datagrid
        dgCustomers = new DataGrid();
        dgCustomers.Location = new Point(5, 5);
        dgCustomers.Size = new Size(
            this.ClientRectangle.Size.Width - 10,
            this.ClientRectangle.Height - 50);
        dgCustomers.DataSource = dsCustomers;
        dgCustomers.DataMember = tableName;
        //创建更新按钮 
        Button btnUpdate = new Button();
        btnUpdate.Text = "Update";
        btnUpdate.Location = new Point(
            this.ClientRectangle.Width / 2 - btnUpdate.Width / 2,
            this.ClientRectangle.Height - (btnUpdate.Height + 10));
        btnUpdate.Click += new EventHandler(btnUpdateClicked);
        //确保控件出现在表单 
        Controls.AddRange(new Control[] { dgCustomers, btnUpdate });
    }
    //设置ADO.NET对象
    public void Initdata()
    {
        //实例化连接 
        conn = new SqlConnection( "Server=(local);DataBase=Northwind;Integrated Security=SSPI");
        // 1. 实例化一个新的DataSet
        dsCustomers = new DataSet();
        // 2. 使用select命令和连接 
        daCustomers = new SqlDataAdapter( "select CustomerID, CompanyName from Customers", conn);
        // 3.填写插入,更新和删除命令
        SqlCommandBuilder cmdBldr = new SqlCommandBuilder(daCustomers);
        // 4. 填充数据集
        daCustomers.Fill(dsCustomers, tableName);
    }
    // 单击更新按钮
    public void btnUpdateClicked(object sender, EventArgs e)
    {
        // 将更改写回DataBase
        daCustomers.Update(dsCustomers, tableName);
    }
    // 启动Windows窗体
    static void Main()
    {
        Application.Run(new DisconnectedDataForm());
    }
}

ADO.NET教程

相关推荐