一 ADO.NET是什么?
全名: ActiveX Data Objects
ado.net可让开发人员以一致的方式存取资料来源(例如 SQL Server 与 XML),以及透过 OLE DB 和 ODBC 所公开的资料来源。资料共用的消费者应用程序可使用ado.net 来连接至这些资料来源,并且撷取、处理及更新其中所含的资料。
ado.net类别 (Class) 位于 System.Data.dll 中,而且会与 System.Xml.dll 中的XML 类别整合。
ado.net可为撰写 Managed 程式码的开发人员提供类似于ActiveX Data Objects (ADO)提供给原生元件物件模型 (Component Object Model,COM)开发人员的功能。建议使用ado.net而非ADO来存取.NET 应用程序中的资料。
ADO .NET会提供最直接的方法,让开发人员在 .NET Framework 中进行资料存取。(以上内容来自百度百科)
简单来说, 就是与数据库进行交互(增删改查)的技术.程序要和数据库交互要通过ADO.Net进行, 通过ADO.Net就能在程序中执行SQL了,ADO.Net中提供了对各种不同数据库的统一操作接口.
二 ADO.NET技术的步骤
(1) 首先要连接服务器
连接服务器就需要连接字符串(程序通过连接字符串指定要连哪台服务器上的哪个*的哪个数据库、用什么用户名密码等.)
可以自己填入连接字符串.
SqlConnection conn = new SqlConnection("Data Source=.;也可以定义一个应用程序配置文件App.Config
Initial Catalog=MyTest;User ID=sa;Password=123456")
<?xml version="1.0" encoding="utf-8" ?>然后在引用中添加一个库 System.Configuration, 可以在App.Config中添加多个connectionString, 在SqlHelper类中可以通过name属性调用不同的连接字符串.
<configuration>
<connectionStrings>
<add name="dbconnStr" connectionString="Data Source=.;Initial Catalog=MyTest;User ID=sa;Password=123456"/>
</connectionStrings>
</configuration>
static string connStr = ConfigurationManager.ConnectionStrings["dbconnStr"].ConnectionString;之后就可以连接服务器了, 代码如下:
using (SqlConnection conn = new SqlConnection(connStr)) //using用于自动释放资源
{
conn.Open(); //服务器连接
}
(2) 声明命令的实例
using(SqlCommand cmd = conn.CreateCommand())
{
}
(3) 用字符串形式给命令赋值
简单的形式
cmd.CommandText = "Insert into T_Students(Name,Age) Values("aaa", 15)";但是实际使用中, 会需要使用外部的变量, 虽然可以使用字符串拼接如
cmd.CommandText = "Delete from T_Students where Name='" + TextBox.Text + "'";如果TextBox.Text是aaa, 就会在表中删除掉这一行, 但是如果传过来的字符串是 1' or '1'='1
这样命令的字符串拼接起来就会是
cmd.CommandText = "Delete from T_Students where Name='1' or '1'='1'";这个命令一旦执行就会删除表中所有内容, 这个就是SQL注入攻击. 解决这个的方法就是使用参数传递.
cmd.CommandText = “Select * from T_Students where Name=@Name or Age<@Age”;这样就不会有SQL注入攻击. 当自己写了SqlHelper类后, 就可以通过函数参数来传递.
cmd.Parameters.Add(“@Name”, “某某”);
cmd.Parameter.Add(“@Age”,”15”);
(4) 执行
cmd.ExecuteScalar(); //object类型
这个执行命令只会返回第一行第一列的对象, 其余都忽略.
cmd.ExecuteNonQuery(); //int类型
顾名思义, 执行非查询操作, 因为它只会返回受到影响的行数, 一般执行insert, update, delete
cmd.ExecuteReader(); //SqlDataReader
会返回一个SqlDataReader类型的, 类似于在服务器中查询结果的指针. 服务器连接中断就会无法查询.
所以如果使用using语句的话, 需要在范围内就完成对数据的操作.
SqlDataReader reader = cmd.ExecuteReader();
while(reader.Reader()) //需要注意的是, reader一开始指向的查询结果的上一行, 即什么都没有
{ //而Reader()将reader指针向下一行移动, 如果有值就返回true.
long ID = (long)reader.GetValue(0); //ID是long类型
string Name = reader.GetString(1); //第二列是姓名, string类型
int Age = reader.GetInt32(2); //第三列是年龄, int类型
MessageBox.Show("ID:" + ID.ToString() +
" Name:" + Name + " Age:" + Age.ToString());
}
DataSet 数据集, 这个与cmd.ExecuteReader()类似, 但是它是将查询结果返回到客户端. 通常用于小数据的查询. 操作也比较方便
DataSet dataset = new DataSet();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(dataset); //查询的结果就会以DataTable类型存储在DataSet集合中, 一般情况下只有一张表.
DataTable table = dataset.Tables[0]; //DataTable本身就类似于一张表, 有Rows和Columns属性
foreach(DataRow row in table.Rows) //DataTable类型的Rows类型就是一个Dictionary集合,以查询结果列名为键
{ //table.Rows是DataRowsCollection类型
long ID = row["Id"];
string Name = row["Name"];
int Age = row["Age"];
MessageBox.Show("ID:"+ID.ToString()+" Name:"+Name+" Age:"+Age.ToString());
}
部分代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data.SqlClient;
using System.Data;
namespace ADO.NET技术
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
//IDisposible
//using(类型 d = new....)
//{.......}
//在大括号外资源回收, 只要继承了IDisposible
using (SqlConnection conn =
new SqlConnection(
"Data Source=.;Initial Catalog=MyTest;User ID=sa;Password=123456"))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "Insert into T_Students(Name,Age) Values('大雄', 10)";
cmd.ExecuteNonQuery();
}
}
MessageBox.Show("执行完成");
}
private void button2_Click(object sender, RoutedEventArgs e)
{
using (SqlConnection conn = new SqlConnection(
"Data Source=.;Initial Catalog=MyTest;User ID=sa;Password=123456"))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
//cmd.CommandText = "select count(*) from T_Students where Age<100";
//object obj = cmd.ExecuteScalar();
//int i = (int)obj;
//MessageBox.Show(i+"条数据.");
//cmd.CommandText = "Insert into T_Students (Name,Age) output Inserted.Id Values('鲁鲁修', 16)";
//long i = (long)cmd.ExecuteScalar();
//MessageBox.Show(i.ToString());
cmd.CommandText = "select Age from T_Students where Name='鲁鲁修'";
int age = (int)cmd.ExecuteScalar();
MessageBox.Show("鲁鲁修"+age+"岁");
}
}
}
private void button3_Click(object sender, RoutedEventArgs e)
{
using (SqlConnection conn = new SqlConnection(
"Data Source=.;Initial Catalog=MyTest;User ID=sa;Password=123456"))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select * from T_Students";
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
string name = reader.GetValue(1).ToString();
MessageBox.Show(name);
}
}
}
}
private void btnSc_Click(object sender, RoutedEventArgs e)
{
using (SqlConnection conn = new SqlConnection(
"Data Source=.;Initial Catalog=MyTest;User ID=sa;Password=123456"))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
//cmd.CommandText = "select Age from T_Students where Name='" + txtBox.Text + "'";
//SqlDataReader reader = cmd.ExecuteReader();
//字符串拼接是一定不能的
cmd.CommandText = "select age from T_Students where Name=@Name";
cmd.Parameters.Add(new SqlParameter("@Name", txtBox.Text));
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
int age = reader.GetInt32(0);
MessageBox.Show(txtBox.Text + age.ToString());
}
}
}
}
private void button4_Click(object sender, RoutedEventArgs e)
{
using (SqlConnection conn = new SqlConnection(
"Data Source=.;Initial Catalog=MyTest;User ID=sa;Password=123456"))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select * from T_Students where Age<@Age";
cmd.Parameters.Add("@Age", 20);
//SqlDataReader reader = cmd.ExecuteReader();
//SqlDataAdapter是一个帮我们把SqlCommand查询结果填充到DataSet中的类
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
//DataSet相当于本地的一个复杂集合List<Person>)
DataSet dataset = new DataSet();
adapter.Fill(dataset); //执行cmd,并把SqlCommand查询结果填充到DataSet
//一般只有一张表
//但是在用CommandText传命令的时候可以一次性传多个select语句
//这样可以返回多个表, 但是一般不会这么做的
DataTable table = dataset.Tables[0];
DataRowCollection rows = table.Rows;
//for (int i = 0; i < rows.Count; i++)
//{
// DataRow row = rows[i];
// int age = (int)row["Age"];
// string name = (string)row["Name"];
// MessageBox.Show(name + "," + age);
foreach(DataRow row in rows)
{
int age = (int)row["Age"];
string name = (string)row["Name"];
MessageBox.Show(name + "," + age);
}
}
}
}
}
}
---------------------- ASP.Net+Unity开发、 .Net培训、期待与您交流! ----------------------详细请查看: www.itheima.com