S1/C#语言和数据库技术基础/15-使用ADO.NET查询和操作数据

String和StringBuilder

在使用String类时常常存在这样一个问题:当每次为同一个字符串重新赋值时,都会在内存中创建一个新的字符串对象,需要为该新对象分配新的空间,这样会加大系统的开销。因为system.String类是一个不可变的数据类型,一旦对一个字符串对象进行初始化后,该字符串对象的值就不能改变了。当对该字符串的值做修改时,实际上是又创建了一个新的字符串对象。现在我们来分析由以下三个语句组成的这段代码的输出结果是什么。

String   strText   =   "Hello";

strText   +=   "World";

Console.WriteLine(strText);

答案很简单 ,不难看出上面这段代码的输出结果是“HelloWorld”。但是,这段代码创建了几个对象呢?让我们用图示的方式进行说明。在执行第一个语句时,首先创建了一个String类对象,值为“Hello”,然后通过赋值运算符将该对象的引用赋给strText。

执行第二个语句时,从表面上看strText更新了值。但实际上内存中又新创建了两个新的对象,其值分别是“World”和“HelloWorld”。此时,内存中存在三个对象,分别是Hello、World和HelloWorld。而strTest所引用的是HelloWorld对象。如果程序中出现这种反复多次修改内容的String对象,系统开销耗费很大,可能会造成应用程序运行性能的降低。如何避免这种情况呢?有没有一个类既能重复修改又不必创建新的对象呢?有,这就是C#中的StringBuilder类。

接下来介绍StringBuilder类对象的定义及处理方法。

为了解决上面的问题,Microsoft提供了System.Text.StringBuilder类,表示可变字符串。虽然StringBuilder类不想String类具有很多字符串处理的方法,但是在替换、添加或删除字符串时,StringBuilder类对象的执行速度要比String类对象快得多。现在我们来看下StringBuilder类对象是如何定义的。

语法:

//声明一个空的StringBuilder对象

StringBuilder   对象名称   =   new   StringBuilder(  );

//声明一个StringBuilder对象,值为“字符串初始值”

StringBuilder   对象名称   =   new   StringBuilder("字符串初始值");

例如,

System.Text.StringBuilder   sbText   =   new   StringBuilder(  );

sbText.Append("Hello");

sbText.Append("HelloWorld");

在上面这段代码中,使用StringBuilder类时先要引用System.Text命名空间,然后创建StringBuilder对象sbText。当sbText对象调用Append()方法时,在sbText对象的原字符串后面追加新的字符串,而不是创建一个新对象。StringBuilder类是动态分配空间的,允许扩充它所封装的字符串中的字符数。如果需要,可以使用ToString()方法把sbText对象的值转换为String类型输出。

StringBuilder常用的属性和方法


属性


说明


Capacity


获取或设置可包含在当前对象所分配的内存中的最大字符个数


Length


获取或设置当前对象的长度


方法


说明


StringBuilder   Append(string   value)


在结尾追加


StringBuilder   Append(string   format,object   arg0,object   arg1)


添加特定格式的字符串


StringBuilder   Insert(int   index,string   value)


在指定位置插入指定字符串


Remove(int    startIndex,int   length)


移除指定字符串

  • 在程序调试状态弹出“文本可视化工具”对话框的步骤如下。

设置断点→启动调试→将查看值放入监视窗口→单机监视窗口中“值”列右侧的放大镜小图标,即可弹出“文本可视化工具”对话框。

  • 编写SQL语句时,在数据库的表名、列名两端添加一对方括号[],可以区别一些特殊的不符合命名规则的字符串,或防止数据库表的列名与系统关键字相冲突。如假设表明为Select,SQL语句为“SELECT   *   FROM   Select;”将会产生语法错误。但是如果改为“SELECT   *   FROM   [Select];”,这就是一个正确的SQL语句,可以正常执行。

注意:

  • 如果要将StringBuilder类对象转换为String类对象,唯一的方式是使用ToString()方法。
  • StringBuilder类并不总能提高性能,他基本上在处理多个字符串时使用。如果只是连接两个字符串,使用System.String类会比较好。

查询数据

上一章中,我们讲解了如何通过Connection对象将应用程序与数据库建立连接,使用Command对象的ExecuteScalar()方法从查询数据库获得单个值。实际工作中,我们可能会查询数据库以返回多条记录,如何获得一次查询得到的多行多列的数据值呢?我们可以使用Command对象的ExecuteReader()方法返回一个DataReader对象,通过DataReader就可以从数据库中读取多条记录了。

DataReader对象

ADO.NET的DataReader对象可以从数据源中检索只读、只进的数据流,每次从数据源中只提取一条记录。使用DataReader可以提高应用程序的运行性能,减少系统开销。DataReader属于.NET数据提供程序,每一种.NET数据提供程序都有与之对应的DataReader类。

.NET数据提供程序及其DataReader类


.NET数据提供程序


DataReader类


命名空间


SQL数据提供程序


SqlDataReader


System.Data.SqlClient


OLE  DB数据提供程序


OleDbDataReader


System.Data.OleDb


ODBC数据提供程序


OdbcDataReader


System.Data.Odbc


Oracle数据提供程序


OracleDataReader


System.Data.OracleClient

时间: 2024-12-16 12:16:06

S1/C#语言和数据库技术基础/15-使用ADO.NET查询和操作数据的相关文章

S1/C#语言和数据库技术基础/14-使用ADO.NET访问数据库

ADO.NET提供了两个组件,用来访问和处理数据:.NET Framework数据提供程序和DataSet(数据集) .NET Framework数据提供程序是专门为数据处理及快速地只进.只读访问数据而设计的组件.使用它可以连接数据源.执行命令和检索结果,直接对数据源进行操作. DataSet是专门为独立于任何数据源的数据访问而设计的.使用它,可以不必直接和数据源打交道,大批量的操作数据,也可以将数据绑定在控件上. .NET Framework数据提供程序 .NET Framework数据提供程

S1/C#语言和数据库技术基础/11-连接查询和分组查询

分组查询 采用分组查询的T-SQL语句如下. SELECT   CourseID,AVG(Score)   AS   课程平均成绩 FROM   Score GROUP   BY   CourseID (1)查询男女学生的人数各是多少 SELECT   COUNT(*)    AS   人数,SSex    FROM   Students GROUP   BY   SSex (2)查询每个年级的总人数 SELECT   COUNT(*)   AS   年级人数,SGrade   FROM   S

S1/C#语言和数据库技术基础/09-数据查询基础

查询的机制: 查询是针对表中已经存在的数据行而言的,可以简单地理解为“筛选”,将符合条件的数据抽取出来. 数据表在接受查询请求的时候,可以简单的理解为“他将逐行判断”,判断是否符合查询条件,如果符合查询条件就提取出来,然后把所有选中的行组织在一起,形成另外一个类似于表的结构,构成查询的结果,通常叫做结果集(RecordSet). 由于结果集的结果实际上和表的结构类似,都是由行组成的,因此在记录集上依然可以进行再次查询. 使用SELECT语句进行查询 查询使用SELECT语句,最简单的查询语句的格

S1/C#语言和数据库技术基础/08-用SQL语句操作数据

SQL语言主要由以下几部分组成: DML(Data Manipulation Language,数据操作语言,也称为数据操纵语言):用来插入.修改和删除数据库中的数据,如INSERT.UPDATE及DELETE等. DDL(Data Definition Language,数据定义语言):用来建立数据库.数据库对象和定义其列,大部分是以CREATE开头的命令,如CREATE TABLE,CREATE VIEW及DROP TABLE等. DQL(Data Query Language,数据查询语言

S1/C#语言和数据库技术基础/07-用表组织数据

SQL Server提供了以下四种类型的约束 1.实体完整性约束 实体完整性要求表中的每一行数据都反映不同的实体,不能存在相同的数据行. 通过索引.唯一约束.主键约束或标识列属性,可以实现表的实体完整性.这些方法的实现将在后面说明. 2.域完整性约束 域完整性指的是给定列输入的有效性. 通过限制数据类型.检查约束.输入格式.外键约束.默认值.非空约束等多种方法,可以实现表的域完整性. 3.引用完整性约束 在输入或删除数据行时,引用完整性约束用来保持表之间已定义的关系. 例如,在管理学生信息的时候

S1/C#语言和数据库技术基础/01-第一个C#程序

执行C#应用程序时,可以使用.NET Framework提供的以下快捷键. F5:启动. Ctrl+F5:开始执行不调试. Ctrl+Atl+L:显示解决方案资源管理器,或者点开菜单栏选择“工具”→“选项”选项对话框,在左边选择“项目和解决方案”选项,在右边勾选“总是显示解决方案”复选框即可. 认识C#程序 namespace关键字,namespace(命名空间)是C#中组织代码的方式,它的作用类似java中的package(包),这样我们就可以把紧密相关的一些代码放在同一个命名空间中,大大提高

S1/C#语言和数据库技术基础/03-使用属性升级MyBank

访问修饰符 在应用程序中,访问修饰符可以用来修饰类成员字段和方法,以此限定类成员的可访问级别.如果将类的成员(变量或者方法)声明为public,就表示这些类成员可以被其他类访问.如果使用private限制类成员的访问权限,那么这些类成员就只能在该类里面使用,其他类对他们没有访问权限. 如果将某个字段或者方法声明为public,就表示其他类可以访问这个字段或方法:如果声明为private,那么该字段或方法就只能在本类中使用,其他类不能访问. 访问修饰符 访问权限 访问级别 Public 不受任何限

S1/C#语言和数据库技术基础/06-程序数据集散地:数据库

实体和记录 实体,所有客观存在的.可以被描述的事务. 记录,数据库中存储的数据表格,每一“行”(Row)实际上对应一个实体,在数据库中通常叫作一条“记录”(Record). 表格中的每一个“列”,如编号.姓名.年龄.民族等,在数据库中,通常称之为“字段”. 数据库管理系统(DataBase Management System,DBMS)是一种系统软件,由一个互相关联的数据集合和一组访问数据的程序构成.这个数据集合通常称为数据库,其中包含了有用的数据信息.数据库管理系统的基本目标是要提供一个可以方

S1/C#语言和数据库技术基础/04-深入C#的String类

常用字符串处理方法 方法 说明 Bool Equals(string value) 比较一个字符串与另一个字符串value的值是否相等.若二者相等,则返回true:若不相等,则返回false Int Compare(string strA,string strB) 比较两个字符串的大小关系,返回一个整数.若strA小于strB,则返回值小于0:若strA等于strB,则返回值为0:若strA大于strB,则返回值大于0 Int IndexOf(char ,string value) 获取指定的v