黑马程序员 C#学习笔记② ADO.NET技术步骤

时间:2022-05-07 09:55:19
---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

 一 ADO.NET是什么?  

     全名: ActiveX Data Objects

    ado.net可让开发人员以一致的方式存取资料来源(例如 SQL Server 与 XML),以及透过 OLE DB 和 ODBC 所公开的资料来源。资料共用的消费者应用程序可使用ado.net 来连接至这些资料来源,并且撷取、处理及更新其中所含的资料。

    ado.net可将资料管理的资料存取分成不连续的元件,这些元件可分开使用,也可串联使用ado.net也包含 .NET Framework 资料提供者,以用于连接资料库、执行命令和撷取结果。这些结果会直接处理、放入ado.net DataSet 物件中以便利用机器操作 (Ad Hoc)的方式公开给使用者、与多个来源的资料结合,或在各层之间进行传递。DataSet 物件也可以与.NET Framework 资料提供者分开使用,以便管理应用程序本机的资料或来自 XML 的资料。
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=.;
Initial Catalog=MyTest;User ID=sa;Password=123456")
    也可以定义一个应用程序配置文件App.Config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="dbconnStr" connectionString="Data Source=.;Initial Catalog=MyTest;User ID=sa;Password=123456"/>
</connectionStrings>
</configuration>
     然后在引用中添加一个库 System.Configuration, 可以在App.Config中添加多个connectionString, 在SqlHelper类中可以通过name属性调用不同的连接字符串.
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”;
cmd.Parameters.Add(“@Name”, “某某”);
cmd.Parameter.Add(“@Age”,”15”);
    这样就不会有SQL注入攻击. 当自己写了SqlHelper类后, 就可以通过函数参数来传递.
(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);  //IDlong类型

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