答:SqlConnection连接、SqlCommand操作、SqlDataReader读取、DataSet数据管理、
SqlDataAdapter数据适配
SqlConnection对象
要与数据库进行交互,您必须与其建立连接。该连接有助于识别数据库服务器,数据库名称,用户名,密码以及连接到数据库所需的其他参数。命令对象使用连接对象,因此它们将知道要在哪个数据库上执行命令。
using System;
using System.Data;
using System.Data.SqlClient;
///
/// 演示如何使用SqlConnection对象
///
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;
///
/// 演示如何使用SqlCommand对象
///
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);
}
///
/// 使用ExecuteReader方法
///
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();
}
}
}
///
/// 使用ExecuteNonQuery方法用于插入
///
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();
}
}
}
///
/// 使用ExecuteNonQuery方法用于更新
///
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();
}
}
}
///
/// 使用ExecuteNonQuery删除方法
///
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();
}
}
}
///
/// 使用ExecuteScalar方法
///
/// 记录数
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教程