.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()); } }