第六周学习笔记(1)

                                                          一. 思维导图

 

 

 

二、DataSet 操作数据库(数据的读入与读出)

DataSet 类是 ADO.NET 中最核心的成员之一,也是各种开发基于.Net 平台程序语言开发数据库应用程序最常接触的类。在从数据库完成数据抽取后,DataSet 就是数据的存放地,它是各种数据源中的数据在计算机内存中映射成的缓存 所以在脱机状态下,也能对 DataSet 中的数据表进行操作。

1、创建一个 DataSet 对象

a) 可以指定一个数据集的名称

b) 如果不指定名称,则默认被设为"NewDataSet"

DataSet 数据集对象 = new DataSet("数据集的名称字符串");

2、使用 DataAdapter 对象填充数据集

1)创建 SqlDataAdapter 对象

SqlDataAdapter 对象名 = new SqlDataAdapter(查询用 sql 语句, 数据库连接);

2)填充 DataSet

DataAdapter 对象. Fill(数据集对象, "数据表名称字符串");

(3)举例说明:

string cnnstring ="Data Source=HP;Initial Catalog=Xk;Integrated Security=True";

SqlConnection sqlcnn = new SqlConnection(cnnstring);

string SQLsting = "select * from student ";

da1 = new SqlDataAdapter(SQLsting, cnnstring);

ds1= new DataSet();

da1.Fill(ds1, "student");

注:sqlcnn 对象不需要 open 打开,直接由 da1.Fill 方法填充。

3DataSet 数据集数据的编辑(增删改)

DataSet 数据集一般是与数据控件绑定使用,来达到显示、修改、插入、删除数据记录。但只是对 DataSet 数据集做了插、删、改。并没有对数据库中的数据进行插、删、改,可以通过 DataAdapter 对象操作 DataSet 实现更新数据库。

DataAdapter 是通过其 Update 方法实现以 DataSet 中数据来更新数据库的。当 DataSet 实例中包含数据发生更改后,此时调用 Update 方法,DataAdapter 将分析已作出的更改并执行相应的命令(INSERT、UPDATE 或 DELETE),并以此命令来更新数据库中的数据。如果 DataSet 中的 DataTable 是映射到单个数据库表或从单个数据库表生成,则可以利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteCommand、InsertCommand 和 UpdateCommand。

SqlCommandBuilder mycbd = new SqlCommandBuilder(da1); //自动生成插删改命令

da1.Update(ds1.Tables["student"]);

但上述命令只对单表数据集更新方便,对多表数据集不能操作。对于多表数据集的插、删、改操作,用 sqlcommand类来完成

三、c#数据库操作函数分析SqlCommand.ExecuteNonQuery 方法对连接执行 Transact-SQL 语句并返回受影响的行数。可以写也可以读。

1.可以使用ExecuteNonQuery 来执行目录操作(例如查询数据库的结构或创建诸如表等的数据库对象),

2.对于Update、Insert 和 Delete 语句,返回值为该命令所影响的行数。

3.对于所有其他类型的语句,返回值为-1。如果发生回滚,返回值也为 -1.

4.执行Select子句,数据库并无变化,自然返回-1。同样适合ODBC、OLEDB等数据源,因为都实现IDbCommand.ExecuteNonQuery方法。

ExecuteScalar():执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。仅可以读。

语法: public abstract Object ExecuteScalar() 返回值: 类型: System.Object,结果集中第一行的第一列。

备注: 使用 ExecuteScalar 方法从数据库中检索单个值(例如一个聚合值)。如果找不到结果集中第一行的第一列;则返回 null 引用(在 Visual Basic 中为 Nothing)。 如果数据库中的该值为 null,此查询将返回 DBNull.Value。

  • 对于查询单个字段,不包括函数的 select 语句,例如 select a字段 from 表A ,如果不存在值,DbCommand.ExecuteScalar 方法的返回值是 null,调用者需要使用 result == null 来判断。
  • 对于使用函数的select 语句,例如select sum(a字段) from 表A,如果不存在值,DbCommand.ExceuteScalar 方法的返回值是 DBNull.Value,调用者需要用 result is DBNull 或者 result == DBNull.Value 来判断。

ADO.NET 的 DbCommand.ExecuteScalar 方法的调用者来说,要注意根据所使用的 SQL 语句来选择使用 result == null 还是使用 result is DBNull 来判断查询结果是否为空。如果使用 result == null || result is DBNull 来判断查询结果是否为空就更保险了,能够适应这两种 SQL 语句的写法,但是运行效率会有所降低。

ExecuteReader 返回一个 SqlDataReader 对象。

SqlDataAdapter 获取一个DateSet对象。

Command 对象公开了几个可用于执行所需操作的 Execute 方法。当以数据流的形式返回结果时,使用 ExecuteReader 可返回 DataReader 对象。使用 ExecuteScalar 可返回单个值。使用 ExecuteNonQuery 可执行不返回行的命令。

当您将 Command 对象用于存储过程时,可以将 Command 对象的 CommandType 属性设置为 StoredProcedure。当 CommandType 为 StoredProcedure 时,可以使用 Command 的 Parameters 属性来访问输入及输出参数和返回值。无论调用哪一个 Execute 方法,都可以访问 Parameters 属性。但是,当调用 ExecuteReader 时,在 DataReader 关闭之前,将无法访问返回值和输出参数。

三、c#数据库具体操作代码

1、添加引用
using System.Data;
using System.Data.SqlData;

2、建立于数据库的连接,建议将它做成一个方法,方便多次利用。
string sqlconnection = "data source = "注解1";database = 注解2;uid = "注解3";pwd ="注解4"";(其实还有很多种写法)

3、经常用到的对象有:SqlConnection,SqlAdapter,SqlCommand、Dataset、DataGrid和 DataReader等,以SqlConnection,SqlAdapter,SqlCommand、Dataset、DataGrid对象,操作 SQL的实例数据库Northwind中的Categorys表为例说明(假定数据库在本地,数据库访问的用户名为user,密码为123456):
接下来做一下四个操作的实现


第一、查询数据:

string MyConn="server=127.0.0.1;uid=user;pwd=123456;database=Northwind;Trusted_Connection=no";//定义数据库连接参数
SqlConnection MyConnection=new SqlConnection(MyConn);//定义一个数据连接实例
SqlCommand MyCommand=new SqlCommand("SELECT CategoryID, CategoryName, Description FROM Categories",MyConnection); //定义一个数据库操作指令
SqlDataAdapter SelectAdapter=new SqlDataAdapter();//定义一个数据适配器
SelectAdapter.SelectCommand=MyCommand;//定义数据适配器的操作指令
DataSet MyDataSet=new DataSet();//定义一个数据集
MyConnection.Open();//打开数据库连接
SelectAdapter.SelectCommand.ExecuteNonQuery();//执行数据库查询指令
MyConnection.Close();//关闭数据库
SelectAdapter.Fill(MyDataSet);//填充数据集
DataGrid1.DataSource=MyDataSet;
DataGrid1.DataBind();//将数据表格用数据集中的数据填充




第二、添加数据

string MyConn="server=127.0.0.1;uid=user;pwd=123456;database=Northwind;Trusted_Connection=no";
SqlConnection MyConnection=new SqlConnection(MyConn);
string MyInsert="insert into Categories(CategoryName, Description)values('"+Convert.ToString(TextBox2.Text)+"','"+Convert.ToString(TextBox3.Text)+"')";
SqlCommand MyCommand=new SqlCommand(MyInsert,MyConnection);
try//异常处理
{
  MyConnection.Open();
  MyCommand.ExecuteNonQuery();
  MyConnection.Close();
}
catch(Exception ex)
{
  Console.WriteLine("{0} Exception caught.", ex);
}



第三、修改数据

string categoryName=TextBox2.Text;
string categoryDescription=TextBox3.Text;
string MyConn="server=127.0.0.1;uid=user;pwd=123456;database=Northwind;Trusted_Connection=no";
SqlConnection MyConnection=new SqlConnection(MyConn);
string MyUpdate="Update Categories set CategoryName='"+categoryName+"',Description='"+categoryDescription+"' where CategoryID="+TextBox1.Text;
SqlCommand MyCommand=new SqlCommand(MyUpdate,MyConnection);
try
{
  MyConnection.Open();
  MyCommand.ExecuteNonQuery();
  MyConnection.Close();
  TextBox1.Text="";
}
catch(Exception ex)
{
  Console.WriteLine("{0} Exception caught.", ex);
}



第四、删除数据

string MyConn="server=127.0.0.1;uid=user;pwd=123456;database=Northwind;Trusted_Connection=no";
SqlConnection MyConnection=new SqlConnection(MyConn);
string MyDelete="Delete from Categories where CategoryID="+TextBox1.Text;
SqlCommand MyCommand=new SqlCommand(MyDelete,MyConnection);
try
{
  MyConnection.Open();
  MyCommand.ExecuteNonQuery();
  MyConnection.Close();
  TextBox1.Text="";
}
catch(Exception ex)
{
  Console.WriteLine("{0} Exception caught.", ex);
} 

猜你喜欢

转载自www.cnblogs.com/lgy316/p/9807014.html