文档库 最新最全的文档下载
当前位置:文档库 › 使用DataSet访问数据库

使用DataSet访问数据库

使用DataSet访问数据库
使用DataSet访问数据库

第10章使用DataSet访问数据库

DataSet(数据集)相当于内存中暂时存放的数据库,它不仅可以包括多张数据表,还可以包括数据表之间的关系和约束,这是DataSet与上一章中介绍的DataTable的关键不同。允许将不同类型的数据表复制到同一个数据集中,甚至还允许数据表与XML文档组合到一起协同操作。

DataSet提供了对数据库的断开操作模式(也称为离线操作模式),当DataSet从数据源获取数据后就断开了与数据源之间的连接。允许在DataSet中定义约束和表关系,添加、删除或编辑记录,还可以对数据集中的数据进行查询、统计等。当完成了各项数据操作后,还可以将DataSet中的数据送回到数据源以更新数据库记录。

10.1 DataSet概述

DataSet(数据集)对象是https://www.wendangku.net/doc/1713499988.html,的核心构件之一,它是数据的内存主流表示形式,提供了独立于数据源的一致关系编程模型。DataSet表示整个数据集,其中包括有表、约束和表与表之间的关系。由于DataSet独立于数据源,故其中可以包含应用程序的本地数据,也可以包含来自多个数据源的数据。

10.1.1 DataSet与DataAdapter

DataSet是实现https://www.wendangku.net/doc/1713499988.html,断开式连接的核心,它通过DataAdapter从数据源获得数据后就断开了与数据源之间的连接(这一点与前面介绍过的DataReader对象完全不同),此后应用程序所有对数据源的操作(定义约束和关系、添加、删除、修改、查询、排序、统计等等)均转向到DataSet,当所有这些操作完成后可以通过DataAdapter提供的数据源更新方法将修改后的数据写入数据库。

图10-1表示了DataSet、DataAdapter和数据源之间的关系,从图中可以看到DataSet对象并没有直接连接数据源,它与数据源之间的连接是通过DataAdapter对象来完成的。

图10-1 DataSet、DataAdapter和数据源之间的关系

需要说明的是对于不同的数据源DataAdapter对象也有不同的形式,如用于连接Access

数据库的OleDbDataAdapter,用于连接SQL Server数据库的SQL DataAdapter、用于连接ODBC 数据源的OdbcDataAdapter、用于连接Oracle数据库的OracleDataAdapter等。

10.1.2 DataSet的组成

如图10-2所示,DataSet主要由DataRelationCollection(数据关系集合)、DataTableCollection (数据表集合)和ExtendedProperties对象组成。其中最基本,也是最常用的是DataTableCollection。

图10-2 DataSet组成结构简图

1. DataRelationCollection

DataRelationCollection对象用于表示DataSet中两个DataTable对象之间的父子关系,它使一个DataTable中的行与另一个DataTable中的行相关联,这种关联类似于关系数据库中数据表之间的主键列和外键列之间的关联。DataRelationCollection对象管理DataSet中所有DataTable之间的DataRelation关系。

2. DataT ableCollection

在每一个DataSet对象中可以包含由DataTable(数据表)对象表示的若干个数据表的集合。而DataTableCollection对象则包含了DataSet对象中的所有DataTable对象。

DataTable在System.Data命名空间中定义,表示内存驻留数据的单个表。其中包含由DataColumnCollection(数据列集合)表示的数据列集合以及由ConstraintCollection表示的约束集合,这两个集合共同定义表的架构。隶属于DataColumnCollection对象的DataColumn(数据列)对象则表示了数据表中某一列的数据。

此外,DataTable对象还包含有DataRowCollection所表示的数据行集合,而DataRow(数据行)对象则表示数据表中某行的数据。除了反应当前数据状态之外,DataRow还会保留数据的当前版本和初始版本,以标识数据是否曾被修改。

隶属于DataTable对象的DataView(数据视图)对象创建存储在DataTable中的数据的不同视图。通过使用DataView,可以使用不同的排序顺序公开表中的数据,并且可以按行状态或基于过滤器表达式来过滤数据。

3. ExtendedProperties

ExtendedProperties对象其实是一个属性集合(PropertyCollection),用户可以在其中放入自定义的信息,如用于产生结果集的Select语句,或生成数据的时间/日期标志。

因为ExtendedProperties可以包含自定义信息,所以在其中可以存储额外的、用户定义的DataSet(DataTable或DataColumn)数据。

10.1.3 DataSet中的对象、属性和方法

在DataSet内部是一个或多个DataTable的集合。每个DataTable由DataColumn、DataRow 和Constraint(约束)的集合以及DataRelation的集合组成。DataTable内部的DataRelation集合对应于父关系和子关系,二者建立了DataTable之间的连接。

1. DataSet中的对象

DataSet由大量相关的数据结构组成,其中最常用的有如下5个子对象,其名称及功能说明见表10-1。

表10-1 DataSet对常用子对象及说明

一致的关系编程模型。DataSet表示整个数据集,其中包含对数据进行包含、排序和约束的表以及表间的关系。

2. DataSet对象的常用属性

DataSet对象的常用属性,见表10-2。

表10-2 DataSet对象的常用属性及说明

3. DataSet对象的常用方法

DataSet对象的常用方法,见表10-3。

表10-3 DataSet对象的常用方法及说明

使用DataSet的方法有若干种,这些方法可以单独应用,也可以结合应用。常用的应用形式有以下3种。

1) 以编程方式在DataSet中创建DataTable、DataRelation和Constraint,并使用数据填充表。

2) 通过DataAdapter用现有关系数据源中的数据表填充DataSet。

3) 使用XML加载和保持DataSet内容。

10.2 使用DataSet访问数据库

DataSet的基本工作过程为:首先完成与数据库的连接,DataSet在存放https://www.wendangku.net/doc/1713499988.html,网站的服务器上为每一个用户开辟一块内存,通过DataAdapter(数据适配器),将得到的数据填充到DataSet中,然后把DataSet中的数据发送给客户端。

https://www.wendangku.net/doc/1713499988.html,网站服务器中的DataSet使用完以后,将释放DataSet所占用的内存。客户端读入数据后,在内存中保存一份DataSet的副本,随后断开与数据库的连接。

在这种方式下应用程序所有针对数据库的操作都是指向DataSet的,并不会立即引起数据库的更新。待数据库操作完毕后,可通过DataSet、DataAdapter提供的方法将更新后的数据一次性保存到数据库中。

10.2.1 创建DataSet

创建数据集对象的语法格式为:

DataSet 数据集对象名= new DataSet();

或:

DataSet 数据集对象名= new DataSet("表名");

其中,前一个语法格式表示要先创建一个空数据集,以后再将已经建立的数据表(DataTable)包含进来;后一条语句是先建立数据表,然后建立包含该数据表的数据集。

10.2.2 填充DataSet

所谓“填充”是指将DataAdapter对象通过执行SQL语句从数据源得到的返回结果,使用DataAdapter对象的Fill方法传递给DataSet对象。

其常用语法格式如下所示:

Adapter.Fill(ds);

或:

Adapter.Fill(ds, tablename);

其中,Adapter为DataSetAdapter对象实例;ds为DataSet对象;tablename为用于数据表映射的源表名称。在第一种格式中仅实现了DataSet对象的填充,而第二种格式则实现了填充DataSet对象和指定一个可以引用的别名两项任务。

需要说明的时Fill方法的重载方式(语法格式)有很多(共有13种),上面介绍的仅是最常用的两种,读者可查阅MSDN来了解其他重载方式。

【例10-1】使用DataSet浏览数据库。程序运行后能将SQL Server数据库StudentDB中StudentInfo表中所有记录显示到GridView控件中。程序运行结果如图10-3所示。

图10-3 使用DataSet浏览数据库

本例是一个典型的DataSet和DataAdapter配合使用的例子。程序功能的实现主要经过了以下几个步骤:

1) 建立与数据库的连接。

2) 通过DataAdapter对象从数据库中取出需要的数据。

3) 使用DataAdapter对象的Fill方法填充DataSet。

4) 通过GridView控件将DataSet中的数据输送到表示层显示出来。

程序代码如下所示。

为了在GridView控件中显示中文列标题和适当的日期格式,需要切换到Default.aspx页面的源视图,按如下所示修改控件的定义代码:

DataFormatString="{0:yyyy-M-d}" HtmlEncode="False" />

使用DataSet对象和SQL Server数据库时,必须引用如下命名空间。后面的介绍也是如此,今后不再赘述。

using System.Data; //提供对DataSet对象的支持

using System.Data.SqlClient; //提供对SQL Server数据库操作的支持

页面装入时执行的事件代码如下:

protected void Page_Load(object sender, EventArgs e)

{

SqlConnection conn = new SqlConnection(); //创建SQL Server连接对象

//为连接对象的连接字符串属性赋值,其中“vm2k3s”为SQL Server服务器计算机名称,

//“StudentDB”为数据库名称,“aaa-111”为sa用户的密码,

//使用时应更换为自己的数据,以后不再赘述。

conn.ConnectionString = "server = vm2k3s; Initial Catalog = StudentDB;

uid = sa; pwd = aaa-111;";

SqlDataAdapter da = new SqlDataAdapter(); //创建DataAdapter对象

string SelectSql = "select * from StudentInfo";

//设置DataAdapter对象的SelectCommand使用conn指定的连接,

//执行SelectSql指定的SQL语句

da.SelectCommand = new SqlCommand(SelectSql, conn);

DataSet ds = new DataSet(); //创建一个空DataSet对象

//将DataAdapter执行SQL语句返回的结果填充到DataSet对象

da.Fill(ds);

GridView1.DataSource = ds; //设置填充后的DataSet对象为GridView控件的数据源

GridView1.DataBind();

}

10.2.3 多结果集填充

DataSet对象支持多结果集的填充,也就是说可以将来自同一数据表或不同数据表中不同的数据集合同时填充到DataSet中。

例如,下列代码将来自同一数据表的不同数据集合(性别为“女”的所有记录和电子邮箱地址中包含“163”的所有记录),填充到了同一个DataSet对象中。然后,通过DataSet 对象的Tables属性分别将它们显示到两个不同的GridView控件中。

protected void Page_Load(object sender, EventArgs e)

{

SqlConnection conn = new SqlConnection(); //创建SQL Server连接对象

conn.ConnectionString = "server = vm2k3s;

Initial Catalog = StudentDB;uid = sa; pwd = abc-123" ;

SqlDataAdapter da = new SqlDataAdapter(); //创建DataAdapter对象

string SelectSql = "select * from StudentInfo where Sex = '女';" +

"select * from StudentInfo where Email like '%163%'";

da.SelectCommand = new SqlCommand(SelectSql, conn);

DataSet ds = new DataSet(); //创建一个空DataSet对象

da.Fill(ds);

GridView1.Caption = "性别为“女”的所有记录";

GridView1.DataSource = ds.Tables[0]; //使用第一个结果集为GridView1的数据源

GridView1.DataBind();

GridView2.Caption = "电子邮箱地址中包含“163”的所有记录";

GridView2.DataSource = ds.Tables[1]; //使用第二个结果集为GridView2的数据源

GridView2.DataBind();

conn.Close();

}

程序运行结果如图10-4所示。

图10-4 向DataSet中填充多个结果集

10.2.4 添加新记录

DataAdapter是DataSet与数据源之间的桥梁,它不但可以从数据源返回结果集并填充到DataSet中,还可以调用其Update()方法将应用程序对DataSet的修改(添加、删除、更新)回传到数据源,完成数据库记录的更新。

当调用Update()方法时,DataAdapter将分析已做出的更改,并执行相应命令(如,插入、更新或删除)。

DataAdapter的InsertCommand、UpdateCommand和DeleteCommand属性也是Command 对象,用于按照DataSet中数据的修改来管理对数据源相应数据的更新。

通过DataSet向数据表添加新记录的一般方法如下:

1) 建立与数据库的连接。

2) 通过DataAdapter对象从数据库中取出需要的数据。

3) 实例化一个SqlCommandBuilder类对象,并为DataAdapter自动生成更新命令。

4) 使用DataAdapter对象的Fill方法填充DataSet。

5) 使用NewRow()方法向DataSet中填充的表对象中添加一个新行。

6) 为新行中各字段赋值

7) 将新行添加到DataSet中填充的表对象中。

8) 调用DataAdapter对象的Update()方法将数据保存到数据库。

例如,下列代码实现了向StudentDB数据库的StudentInfo表中添加一条新记录。

protected void ButtonAdd_Click(object sender, EventArgs e)

{

SqlConnection conn = new SqlConnection();

conn.ConnectionString = "server = vm2k3s;Initial Catalog = StudentDB;

uid = sa; pwd = abc-123" ;

SqlDataAdapter da = new SqlDataAdapter();

string SelectSql = "select * from StudentInfo";

da.SelectCommand = new SqlCommand(SelectSql, conn); //取出数据库中需要的数据

SqlCommandBuilder scb = new SqlCommandBuilder(da); //为DataAdapter自动生成更新命令

DataSet ds = new DataSet();

da.Fill(ds); //填充DataSet对象

DataRow NewRow = ds.Tables[0].NewRow(); //向DataSet第一个表对象中添加一个新行

NewRow["StudentID"] = "200902601103"; //为新行的各字段赋值

NewRow["StudentName"] = "刘东风";

NewRow["Sex"] = "男";

NewRow["DateOfBirth"] = "1992-3-28";

NewRow["Specialty"] = "计算机应用";

NewRow["Email"] = "ldf@https://www.wendangku.net/doc/1713499988.html,";

ds.Tables[0].Rows.Add(NewRow); //将新建行添加到DataSet第一个表对象中

da.Update(ds); //将DataSet中数据变化提交到数据库(更新数据库)

conn.Close();

Response.Write("");

}

需要说明的是,使用SqlCommandBuilder对象自动生成DataAdapter对象的更新命令(DeleteCommand、InsertCommand和UpdateCommand)时,填充到DataSet中的DataTable 对象只能映射到单个数据表或从单个数据表生成,而且数据库表必须定义有主键。所以说常把由SqlCommandBuilder对象自动生成的更新命令称为“单表命令”。

10.2.5 修改记录

通过DataSet修改现有数据表记录的操作方法与添加新记录非常相似,唯一不同的地方是无需使用NewRow()添加新行,而是创建一个DataRow对象后,从表对象中获得需要修改的行并赋给新建的DataRow对象,根据需要修改各列的值(为各字段赋以新值)。最后仍需要调用DataAdapter对象的Update()方法将更新提交到数据库。

例如,下列代码按照指定“学号”字段值返回需要修改的记录,修改数据后将修改结果提交到数据库完成修改记录的操作。

protected void ButtonEdit_Click(object sender, EventArgs e)

{

SqlConnection conn = new SqlConnection(); //建立数据库连接

conn.ConnectionString = "server = vm2k3s;Initial Catalog = StudentDB; uid = sa; pwd = abc-123" ;

SqlDataAdapter da = new SqlDataAdapter(); //创建一个DataAdapter对象

//得到要修改的记录

string SelectSql = "select * from StudentInfo where StudentID='200902601100'";

da.SelectCommand = new SqlCommand(SelectSql, conn);

SqlCommandBuilder scb = new SqlCommandBuilder(da); //为DataAdapter自动生成更新命令

DataSet ds = new DataSet();

da.Fill(ds); //将要修改的记录填充到DataSet对象中

DataRow MyRow = ds.Tables[0].Rows[0]; //从DataSet中得到要修改的行

MyRow[1] = "张大民"; //为第2个字段赋以新值,学号字段为主键不能修改

MyRow[2] = "男"; //为第3个字段赋以新值

MyRow[3] = "1992-2-19";

MyRow[4] = "软件技术";

MyRow[5] = "zdm@https://www.wendangku.net/doc/1713499988.html,";

da.Update(ds); //将DataSet中数据变化提交到数据库(更新数据库)

conn.Close();

Response.Write("");

}

10.2.6 删除记录

使用DataSet从填充的表对象中删除行时需要创建一个DataRow对象,并将要删除的行赋值给该对象,而后调用DataRow对象的Delete()方法将该行删除。当然此时的删除仅是针对DataSet对象的,若需从数据库中删除该行,还需要调用DataAdapter对象的Update()方法将删除操作提交到数据库。

“删除记录”按钮被单击时执行的事件代码如下:

protected void DelRecord_Click(object sender, EventArgs e)

{

SqlConnection conn = new SqlConnection(); //建立数据库连接

conn.ConnectionString = "server = vm2k3s;Initial Catalog = StudentDB; uid = sa; pwd = abc-123";

SqlDataAdapter da = new SqlDataAdapter();

//仅返回要删除的行

string SelectSql = "select * from StudentInfo where StudentID='200902601100'";

da.SelectCommand = new SqlCommand(SelectSql, conn);

SqlCommandBuilder scb = new SqlCommandBuilder(da); //为DataAdapter自动生成更新命令

DataSet ds = new DataSet();

da.Fill(ds); //将要删除的记录填充到DataSet对象中

DataRow DeleteRow = ds.Tables[0].Rows[0]; //得到要删除的行

DeleteRow.Delete(); //调用DataRow对象的Delete()方法,从数据表中删除行

da.Update(ds); //更新数据库

conn.Close();

Response.Write("");

}

10.3 DataSet应用实例(网站用户管理)

多数https://www.wendangku.net/doc/1713499988.html,应用程序中都包含有一个用户管理模块,网站管理员或用户可以通过该模块实现用户登录(身份验证)、注册新用户、浏览用户、修改密码、找回遗忘的密码、改变用户级别或删除用户等操作。本节将使用DataSet和DataAdapter对象相配合设计一个通用的网站用户管理模块。

10.4.1 用户管理模块应具有的功能

通用网站用户管理模块的功能抽象的讲,就是通过编程实现对用户数据表进行基本的增、删、改、查操作功能。本例使用存放在SQL Server中的users数据库,操作对象为userinfo表,其数据库结构如图10-5所示。数据表中包含有,uname(用户

名)、upwd(用户密码)、uemail(用户电子邮箱)和ulevel(用

户级别)、uquestion(安全问题)、uanswer(安全问题的答案)

6个字段,uname字段为主键。

向userinfo表中添加了一条初始记录。其中各字段初始值

见表10-4。程序设计完毕后,可对这些初始值进行修改。

表10-4 初始记录各字段的值

1. 用户登录

程序运行后显示图10-6所示的界面,输入用户名和密码后单击“登录”链接按钮,程序能判断是否为合法用户及用户级别,并通过弹出信息框显示出来。

图10-6 用户登录页面图10-7 判断是否为合法用户及用户级别

图10-5 userinfo表结构

2. 注册新用户

在用户登录页面(Default.aspx)中单击“注册”链接按钮,将打开图10-8所示的新用户注册页面(Reg.aspx)。在页面中填写完整的注册信息后,单击“提交”链接按钮可向数据库中添加一条用户级别为“user”(普通用户)的新用户记录。注意,通过本页面注册的所有用户都是普通用户,管理员级别用户需要在用户管理页面中进行设置。

数据库中用户名字段(uname)为表的主键,不允许有重复数据,故单击“检查用户名”或“提交”链接按钮时,程序会首先检查用户名是否存在,并显示图10-9所示的提示信息。此外,如果用户填写信息不完整(有任何一个文本框为空)或两次输入的密码不相同,程序都会给出相应的出错提示。

为提高程序安全性,要求用户密码和安全问题答案数据,以MD5加密的形式保存在数据库中。单击“返回”按钮可跳转到用户登陆页面Default.aspx。

图10-8 用户注册界面图10-9 检查用户名

3. 找回遗忘的密码

在用户登录页面中输入用户名,单击“忘记密码?”链接按钮打开图10-10所示的找回遗忘的密码页面Repwd.aspx。程序根据用户输入的用户名,在页面中显示注册时填写的安全问题,若用户能正确回答安全问题答案,程序将弹出图10-11所示的信息框,显示一个临时的随机密码,使用该密码登陆后可进行重新设置。如果,用户输入的用户不存在或安全问题答案错误程序均能给出相应的提示。

单击“返回”链接按钮可返回到登陆页面Default.aspx。

图10-10 找回被遗忘的密码图10-11 提示信息

4. 修改用户信息

根据用户级别不同,具有的管理权限也不同。普通用户可修改自己的密码、电子邮箱数据。管理员用户除具有普通用户的权限外,还可以删除用户,可以提升某用户为管理员或将某管理员降级为普通用户。

在用户登录页面中输入用户名和密码,单击“修改用户信息”链接按钮将打开用户管理页面(Manage.aspx)。管理员用户可以使用页面中的所有功能,而普通用户则只能修改自己

的密码、电子邮箱信息。图10-12所示的是管理员用户登录后看到的页面,图10-13所示的是普通用户登录后看到的页面。

从图中可以看出,普通用户无法通过“用户名”下拉列表框和“用户级别”下拉列表框修改数据,也无法执行删除用户的操作。

图10-12 管理员登录后看到的页面图10-13 普通用户登录后看到的页面

管理员用户可以通过下拉列表框选择了某用户名后,单击“删除”链接按钮实现删除用户的操作。为了安全起见,程序限制了密码修改权限,即便是管理员也不能修改他人的密码。而且安全问题和安全问题的答案只能在注册新用户时设定,不能修改。

10.4.2 模块功能的实现

1. 用户登录功能的实现(Default.aspx)

(1) 设计Web页面

新建一个https://www.wendangku.net/doc/1713499988.html,网站,向Default.aspx页面中添加一个用于布局的HTML表格,向表格中添加2个文本框控件TextBox1和TextBox2;添加4个链接按钮LinkButton1~LinkButton4;添加必要的说明文字,适当调整各控件的大小及位置。

(2) 设置对象属性

设置TextBox1的ID属性为“TextName”,TextBox2的ID属性为“TextPwd”;设置LinkButton1~LinkButton4的ID属性分别为LinkLogin、LinkReg、LinkRePwd和LinkEdit;设置LinkButton1~LinkButton4的Text属性分别为“登录”、“注册”、“忘记密码?”和“修改用户信息”;设置LinkButton2(注册)链接按钮的PostBackUrl属性指向新用户注册页面Reg.aspx。

(3) 编写登录页面的程序代码

在web.config文件中添加数据库连接字符串的设置(使用时应注意将服务器名称、sa用户密码等修改为自己计算机的相关信息):

添加对如下命名空间的引用:

using System.Web.Security;

using System.Data;

using System.Data.SqlClient;

“登录”链接按钮被单击时执行的事件代码如下:

protected void LinkLogin_Click(object sender, EventArgs e)

//设置Conn对象的连接字符串

string ConnSql =

System.Configuration.ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;

//声明Conn为一个SQL Server连接对象

SqlConnection Conn = new SqlConnection(ConnSql);

Conn.Open(); //打开连接

//使用MD5算法加密用户口令

string SecPwd =

FormsAuthentication.HashPasswordForStoringInConfigFile(TextPwd.Text, "MD5");

string SelectSql = "select * from userinfo where uname='" + TextName.Text +

"' and upwd='" + SecPwd + "'";

SqlDataAdapter da = new SqlDataAdapter(); //创建DataAdapter对象

da.SelectCommand = new SqlCommand(SelectSql, Conn);

DataSet ds = new DataSet(); //创建一个空DataSet对象

//将DataAdapter执行SQL语句返回的结果填充到DataSet对象

da.Fill(ds);

Conn.Close();

if (ds.Tables[0].Rows.Count == 0) //若果返回的记录条数为0,则表示没有符合条件的用户

{

Response.Write("");

return;

}

DataRow MyRow = ds.Tables[0].Rows[0]; //从DataSet中得到要修改的行

if (MyRow[3].ToString().Trim() == "admin") //如果索引值为3的列(第4列)的值为“admin”

{

Response.Write("");

}

else

{

Response.Write("");

}

}

“忘记密码?”链接按钮被单击时执行的事件代码如下:

protected void LinkRePwd_Click(object sender, EventArgs e)

{

if (TextName.Text =="")

{

Response.Write("");

return;

}

//通过查询字符串将用户名传递给目标页面

Response.Redirect("Repwd.aspx?username=" + TextName.Text);

“修改用户信息”链接按钮被单击时执行的事件代码如下:

protected void LinkEdit_Click(object sender, EventArgs e)

{

string ConnSql =

System.Configuration.ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;

//声明Conn为一个SQL Server连接对象

SqlConnection Conn = new SqlConnection(ConnSql);

Conn.Open(); //打开连接

//使用MD5算法加密用户口令

string SecPwd =

FormsAuthentication.HashPasswordForStoringInConfigFile(TextPwd.Text, "MD5");

string SelectSql = "select * from userinfo where uname='" + TextName.Text +

"' and upwd='" + SecPwd + "'";

SqlDataAdapter da = new SqlDataAdapter(); //创建DataAdapter对象

da.SelectCommand = new SqlCommand(SelectSql, Conn);

DataSet ds = new DataSet(); //创建一个空DataSet对象

//将DataAdapter执行SQL语句返回的结果填充到DataSet对象

da.Fill(ds);

Conn.Close();

if (ds.Tables[0].Rows.Count == 0)

{

Response.Write("");

return;

}

//用户身份经验证后,将用户级别和用户名保存到Session对象中

Session["userlevel"] = ds.Tables[0].Rows[0][3].ToString().Trim();

Session["username"] = TextName.Text;

Response.Redirect("Update.aspx"); //跳转到目标页面

}

2. 注册新用户(Reg.aspx)

(1) 设计Web页面

通过解决方案资源管理器向网站中添加一个新Web窗体,并将其命名为Reg.aspx。向页面中添加一个用于布局的HTML表格,向表格中添加6个文本框TextBox1~TextBox6和3个链接按钮LinkButton1~LinkButton3。向页面中添加必要的说明文字,适当调整各控件的大小及位置。

(2) 设置对象属性

设置6个文本框的ID属性分别为“TextName”、“TextPwd”、“TextRePwd”、“TextEmail”、“TextQuestion”和“TextAnswer”;设置TextPwd和TextRePwd文本框的TextMode属性为“Password”。

设置3个链接按钮的ID属性分别为“LinkCheckName”、“LinkSubmit”和“LinkBack”,设置其Text属性分别为“检查用户名”、“提交”和“返回”;设置“返回”链接按钮的PostBackUrl

属性执行登录页面Default.aspx。

(3) 编写注册页面的程序代码

添加对如下命名空间的引用:

using System.Web.Security;

using System.Data;

using System.Data.SqlClient;

“检查用户名”链接按钮被单击时执行的事件代码如下:

protected void LinkCheckName_Click(object sender, EventArgs e)

{

string ConnSql =

System.Configuration.ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;

//声明Conn为一个SQL Server连接对象

SqlConnection Conn = new SqlConnection(ConnSql);

Conn.Open();

string SelectSql = "select * from userinfo where uname='" + TextName.Text + "'";

SqlDataAdapter da = new SqlDataAdapter(); //创建DataAdapter对象

da.SelectCommand = new SqlCommand(SelectSql, Conn);

DataSet ds = new DataSet(); //创建一个空DataSet对象

//将DataAdapter执行SQL语句返回的结果填充到DataSet对象

da.Fill(ds);

Conn.Close();

if (ds.Tables[0].Rows.Count != 0) //返回记录条数不为0,表示用户名已在使用

{

Response.Write("");

}

else

{

Response.Write("");

}

}

“提交”链接按钮被单击时执行的事件代码如下:

protected void LinkSubmit_Click(object sender, EventArgs e)

{

if (TextName.Text == "" || TextPwd.Text == "" || TextRePwd.Text == "" ||

TextEmail.Text == "" || TextQuestion.Text == "" || TextAnswer.Text == "") {

Response.Write("");

return;

}

if (TextPwd.Text != TextRePwd.Text)

{

Response.Write("");

return;

}

string ConnSql =

System.Configuration.ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;

//声明Conn为一个SQL Server连接对象

SqlConnection Conn = new SqlConnection(ConnSql);

Conn.Open();

string SelectSql = "select * from userinfo where uname='" + TextName.Text + "'";

SqlDataAdapter da = new SqlDataAdapter(); //创建DataAdapter对象

da.SelectCommand = new SqlCommand(SelectSql, Conn);

DataSet ds = new DataSet(); //创建一个空DataSet对象

//将DataAdapter执行SQL语句返回的结果填充到DataSet对象

da.Fill(ds);

if (ds.Tables[0].Rows.Count != 0) //检查用户名是否已在使用

{

Response.Write("");

return;

}

SelectSql = "select * from userinfo";

da.SelectCommand = new SqlCommand(SelectSql, Conn); //取出数据库中需要的数据

SqlCommandBuilder scb = new SqlCommandBuilder(da); //为DataAdapter自动生成更新命令da.Fill(ds); //填充DataSet对象

DataRow NewRow = ds.Tables[0].NewRow(); //向DataSet第一个表对象中添加一个新行NewRow["uname"] = TextName.Text; //为新行的各字段赋值

//使用MD5算法加密用户密码

string SecPwd =

FormsAuthentication.HashPasswordForStoringInConfigFile(TextPwd.Text, "MD5");

NewRow["upwd"] = SecPwd;

NewRow["uemail"] = TextEmail.Text;

NewRow["uquestion"] = TextQuestion.Text;

//使用MD5算法加密用户安全问题的答案

string SecAnswer =

FormsAuthentication.HashPasswordForStoringInConfigFile(TextAnswer.Text, "MD5");

NewRow["uanswer"] = SecAnswer;

NewRow["ulevel"] = "user"; //通过注册页面添加的所有用户都是普通用户级别

ds.Tables[0].Rows.Add(NewRow); //将新建行添加到DataSet第1个表对象中

da.Update(ds); //将DataSet中数据变化提交到数据库(更新数据库)

Conn.Close();

Response.Write("");

}

3. 找回被遗忘的密码

(1) 设计Web页面

通过解决方案资源管理器向网站中添加一个新Web窗体,并将其命名为Repwd.aspx。向页面中添加一个用于布局的HTML表格,向表格中添加2个标签控件Label和Label2;添加1个文本框控件TextBox1;添加2个链接按钮LinkButton1和LinkButton2。向页面中添加必要的说明文字,适当调整各控件的大小及位置。

(2) 设置对象属性

设置2个标签控件的ID属性分别为“LabelName”和“LabelQuestion”,设置它们的Text 属性为空;设置文本框的ID属性为“TextAnswer”;设置2个链接按钮的ID属性分别为“LinkOK”和“LinkBack”,设置它们的Text属性分别为“确定”和“返回”;设置“返回”链接按钮的PostBackUrl属性指向登录页面Default.aspx。

(3) 编写Repwd.aspx页面的程序代码

添加对如下命名空间的引用:

using System.Web.Security;

using System.Data;

using System.Data.SqlClient;

Reg.aspx页面装入时执行的事件代码如下:

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack) 如果页面时首次加载

{

if (Request.QueryString["username"] == null)

{

Response.Redirect("Default.aspx"); //若查询字符串值为null,则返回登录页面}

}

//将登录页面传递来的用户名显示到标签控件中

LabelName.Text = Request.QueryString["username"];

string ConnSql =

System.Configuration.ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;

//声明Conn为一个SQL Server连接对象

SqlConnection Conn = new SqlConnection(ConnSql);

Conn.Open(); //打开连接

string SelectSql = "select * from userinfo where uname='" + LabelName.Text + "'";

SqlDataAdapter da = new SqlDataAdapter(); //创建DataAdapter对象

da.SelectCommand = new SqlCommand(SelectSql, Conn);

DataSet ds = new DataSet(); //创建一个空DataSet对象

//将DataAdapter执行SQL语句返回的结果填充到DataSet对象

da.Fill(ds);

Conn.Close();

if (ds.Tables[0].Rows.Count == 0) //未找到符合条件的记录

{

Response.Write("");

return;

}

DataRow MyRow = ds.Tables[0].Rows[0]; //得到用户名为指定值的记录

//将记录的第5个字段(安全问题字段)值显示到标签控件中

LabelQuestion.Text = MyRow[4].ToString().Trim();

}

“确定”链接按钮被单击时执行的事件代码如下:

protected void LinkOK_Click(object sender, EventArgs e)

{

string ConnSql =

System.Configuration.ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;

//声明Conn为一个SQL Server连接对象

SqlConnection Conn = new SqlConnection(ConnSql);

Conn.Open(); //打开连接

string SelectSql = "select * from userinfo where uname='" + LabelName.Text + "'";

SqlDataAdapter da = new SqlDataAdapter(); //创建DataAdapter对象

da.SelectCommand = new SqlCommand(SelectSql, Conn);

DataSet ds = new DataSet(); //创建一个空DataSet对象

//将DataAdapter执行SQL语句返回的结果填充到DataSet对象

da.Fill(ds);

string SecAnswer =

FormsAuthentication.HashPasswordForStoringInConfigFile(TextAnswer.Text, "MD5");

DataRow MyRow = ds.Tables[0].Rows[0];

if (SecAnswer == MyRow[5].ToString().Trim()) //若用户填写的安全问题答案正确

{

SqlCommandBuilder scb = new SqlCommandBuilder(da);

Random r = new Random();

string NewPwd = r.Next(100000, 999999).ToString(); //产生一个6位随机数字密码

Response.Write("");

NewPwd = FormsAuthentication.HashPasswordForStoringInConfigFile(NewPwd, "MD5");

MyRow["upwd"] = NewPwd; //将MD5加密后的新密码写入DataSet

da.Update(ds); //将DataSet中数据变化提交到数据库(更新数据库)

Conn.Close();

}

else

{

Response.Write("");

}

}

4. 修改用户信息

(1) 设计Web页面

通过解决方案资源管理器向网站中添加一个新Web窗体,并将其命名为Repwd.aspx。向页面中添加一个用于布局的HTML表格,向表格中添加2个下拉列表框,3个文本框和3个链接按钮控件。向页面中添加必要的说明文字,适当调整各控件的大小及位置。

(2) 设置对象属性

设置2个下拉列表框的ID属性分别为“DropName”(用户名)和“DropLevel”(用户级别);设置DropName的AutoPostBack属性“true”,为DropLevel添加“管理员”和“普通用户”2个供选项。

设置3个文本框的ID属性分别为“TextName”、“TextPwd”和“TextRePwd”,设置“TextPwd”和“TextRePwd”文本框的TextMode属性为“Password”;

设置3个链接按钮的ID属性分别为“LinkEdit”、“LinkDelete”和“LinkBack”,设置它们的Text属性分别为“修改”、“删除”和“返回”。设置“返回”链接按钮的PostBackUrl属性指向登录页面Default.aspx。

(3) 编写Update.aspx页面的程序代码

添加对如下命名空间的引用:

using System.Web.Security;

using System.Data;

using System.Data.SqlClient;

Update.aspx页面装入时执行的事件代码如下:

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack)

{

if (Session["username"] == null)

{

Response.Redirect("Default.aspx");

}

string ConnSql =

System.Configuration.ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;

//声明Conn为一个SQL Server连接对象

SqlConnection Conn = new SqlConnection(ConnSql);

Conn.Open(); //打开连接

string SelectSql = "";

if (Session["userlevel"].ToString() == "admin")

{

SelectSql = "select * from userinfo";

}

else

{

SelectSql = "select * from userinfo where uname='" +

Session["username"].ToString() + "'";

DropName.Enabled = false;

DropLevel.Enabled = false;

LinkDelete.Enabled = false;

}

SqlDataAdapter da = new SqlDataAdapter(); //创建DataAdapter对象

da.SelectCommand = new SqlCommand(SelectSql, Conn);

DataSet ds = new DataSet(); //创建一个空DataSet对象

//将DataAdapter执行SQL语句返回的结果填充到DataSet对象

da.Fill(ds);

Conn.Close();

DropName.DataSource = ds.Tables[0].DefaultView;

DropName.DataTextField = "uname";

DropName.DataBind();

TextEmail.Text = ds.Tables[0].Rows[0][2].ToString();

if (ds.Tables[0].Rows[0][3].ToString().Trim() == "admin")

{

DropLevel.Text = "管理员";

}

else

{

DropLevel.Text = "普通用户";

}

}

}

“用户名”下拉列表框选项改变时执行的事件代码如下:

protected void DropName_SelectedIndexChanged(object sender, EventArgs e)

{

string ConnSql =

System.Configuration.ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;

//声明Conn为一个SQL Server连接对象

SqlConnection Conn = new SqlConnection(ConnSql);

Conn.Open(); //打开连接

string SelectSql = "select * from userinfo where uname='" + DropName.Text + "'" ;

SqlDataAdapter da = new SqlDataAdapter(); //创建DataAdapter对象

da.SelectCommand = new SqlCommand(SelectSql, Conn);

DataSet ds = new DataSet(); //创建一个空DataSet对象

//将DataAdapter执行SQL语句返回的结果填充到DataSet对象

da.Fill(ds);

Conn.Close();

TextEmail.Text = ds.Tables[0].Rows[0][2].ToString().Trim();

if (ds.Tables[0].Rows[0][3].ToString().Trim() == "admin")

{

torque中文教程--AI巡逻

教程: 为机器人设定路径 作者:吴波 描述:这个教程演示如何生成机器人或者AI控制的玩家,使他们可以在任务编辑器中沿着一定的路线活动。这个功能非常的重要,可以通过这个功能让机器人可以在一定的范围内巡逻或守卫,当发现人类玩家的时候进行攻击。 注意:本教程所用的”bot.cs”文件中的编码是从”starter.fps”示例文件夹”aiPlayer.cs”中节选的,建议你从这个教程开始熟悉机器人(BOT)的一些控制语句。 1.开始之前,还是对"tutorial.base" 目录进行备份, 以防数据出错。 2.从素材路径中复制 "bot.cs" 文件到 "tutorial.base/server" 目录下。 3.打开"tutorial.base/server" 目录下的 "game.cs" 脚本文件并在onServerCreated() function语句下加入: exec("./bot.cs");

你应该看到几句其他的exec()语句存在于此文件中,把上面的这句放到最后一行就可以了。 除了定义我们的机器人如何沿着给定的路径活动外, "bot.cs"脚本还定义了一个特殊的物体叫做AIManager(AI 管理器),它是用来管理所有的机器人的各种活动的,为了实现这个目的,我们需要在执行onMissionLoaded()(任务开始)和onMissionEnded()(任务结束)功能时,通过增加一些代码来开始和停止它的作用。 填加高亮部分语句到onMissionLoaded() function下: function onMissionLoaded() { // Called by loadMission() once the mission is finished loading. new ScriptObject(AIManager) {}; MissionCleanup.add(AIManager); AIManager.think(); } 接下来,我们需要填加以下代码到onMissionEnded()功能下以便在游戏结束时删除AI管理器。 function onMissionEnded() { // Called by endMissio n(), right befo re the missio n is destroyed AIManager.delete(); }

JDT使用说明书

Operating instructions for attachment swivels "THEIPA"- Point (TP), "THEIPA"-Point-S (TP-S), "THEIPA"-Point-F (TP-F), TAWGK, EAWGK, TAWSK General principles regarding the utilisation of lifting accessories and their components: The operating instructions are to be stored together with the certificate and the EC declaration of conformity. The falling of loads, caused by the failure and / or incorrect utilisation and handling of lifting equipment or its individual parts constitutes a direct risk to the life or health of the people who are present in the danger zone of lifting processes. These operating instructions contain information with regard to the safe utilisation and handling of the lifting accessories and their components. Before using the lifting equipment, the assigned persons are to be briefed with regard to handling and utilisation by a qualified person. The following principles apply: - The Working Load Limit (WLL) (see label) of the lifting equipment must correspond to the load. The lifting equipment may not be used if the label is missing or is illegible. - No danger areas (e.g. crushing points, cutting points, trapping or impact points) may occur that may hinder or endanger the person carrying out the slinging process and / or the transport. - The base material and the constructive design of the load must be able to hold the applied forces without deformation. - Stress that leads to a non-uniform load distribution, e.g. which is caused as a result of an off-centre introduction of force must be taken into account when selecting the lifting accessories and their components. - In the event that extreme stress or strong dynamic strain (shock influences) may occur, this must be taken into account when selecting the lifting equipment and the Working Load Limit (WLL). - The lifting equipment may not be used for the transportation of persons. No persons are ever permitted to remain present in the danger area of a suspended load. - The lifting equipment may not come into contact with acids and other aggressive agents. Attention must also be paid to the fact that acid fumes may occur in certain production processes. - Never make unauthorised amendments to the lifting equipment (e.g. grinding, welding, bending, and attachment of parts)! - The lifting equipment may not be exposed to any forbidden manipulation of temperature. - Only original spare parts may be used. - The relevant additional regulations must be observed when transporting hazardous substances. - Lifting accessories and their components must be stored in such a manner that they are protected against being damaged and do not cause any danger. - If damaged, the lifting equipment must be immediately taken out of circulation and has to undergo maintenance work. - When ready to be discarded, lifting equipment is to be correctly disposed of. Attention: Any substances present that are hazardous to the environment (e.g. greases and oils) are to be disposed of separately. Inspection and maintenance: On a regular basis before being used, lifting equipment is to be closely inspected with regard to correct utilisation and faultless condition (e.g. screw fit, absence of strong corrosion and deformation, etc.), for example by the person carrying out the slinging process. Defective lifting equipment may not be used. It has to be tested at least once a year by a qualified person whilst taking the relevant standards and trade association regulations (e.g. BGR 500) into account. Every three years lifting equipment must be tested by a qualified person using a proper testing device in order to check that the product is free of cracks. The user must observe the results of the risk assessment in accordance with the occupational safety directives. The re-testing period is shortened in the event that the products are exposed to critical operating conditions. Inspection records are to be kept. The testing coefficient (EC-Machinery Directive 2006/42/EC point 4.4.1) is defined according to the respective standards and corresponds to 2.5. Wear measurement concerning withdrawal from service: Grade 10 THEIPA Point 20.0 – 30.0 t 4.5 mm A gap becomes visible, max. the thickness of the WLL table Attention: In the event of violation, the operating permission will become void. General assembly instructions The lifting swivels must be easily recognisable on the load (e.g. by means of colour marking). The attachment swivels are to be positioned on the load in such a manner that a flat bearing surface is large enough to carry the applied forces. At the very least, this bearing surface must correspond to the complete diameter (b) of the used attachment swivel body (respectively larger when dealing with the weldable attachment swivels). The thread hole must be perpendicular to the bearing surface. The thread hole must be countersunk. The quantity and arrangement of the attachment points on the load must be selected so that the load can be carried safely and that it cannot unexpectedly change its position during transport. The chain link of the attachment swivel must be correctly adjusted in the direction of force and it must be freely movable. The swing range of the chain link and, as a result, the angle range of the force application is equal to 180°. The following applies in principle for attachment swivels to bolt-on: Inspect visually the screw connection paying particular attention to screw size, thread size and screw-in length. Special threads (not listed in catalog) are additionally labelled with a thread marking on the rear side of the swivel body. When dealing with blind holes, the thread depth on the load must be at least 1.1 times of the screw-in length (e). We recommend the following as the minimum screw-in lengths (e): in steel 1 x d in cast iron 1.25 x d, in cast iron with strengths < 200 MPa min. 1.5 x d in aluminium 2 x d in aluminium-magnesium alloys 2.5 x d (whereby d = thread size, e.g. when M 24 d = 24 mm) For TP-F, crack-tested screws of strength class 10.9 are to be used. In the event that TPs are secured with screw nuts, these nuts must correspond to strength class 10 and be crack-tested. Tighten by hand with a spanner until flush with the bearing surface, e.g. open-ended wrench according to DIN 895 / DIN 894, in the event of a one-off transport procedure. Should the attachment swivel remain in the load on a permanent basis or should it be used to rotate and turn loads, the tightening is to be carried out with a higher tightening torque in accordance with the following Table 1: Using an open-ended wrench, all Theipa Points (TP, TP-F) must at least be hand-tight ! When dealing with weldable sling points (TP-S), the separate welding instructions are to be observed.

PowerBI技巧之Power BI 数据集和数据刷新

PowerBI报表是基于数据分析的引擎,数据真正的来源(Data Source)是数据库,文件等数据存储媒 介,PowerBI支持的数据源类型多种多样。PowerBI Service(云端)有时不直接访问Data Source,而是直接从PowerBI Service创建的数据集(Dataset)中获取数据,数据集中存储的内容主要分为三部分:Data Source的数据(Data)、连接数据源的凭证(Credentials)、以及数据源的架构(Table Schema)等元数据(metadata)。PowerBI Service分析数据时,直接访问Dataset获取数据,执行聚合计算,以响应用户的查询请求。使用Dataset的好处是:PowerBI只需要维护统一的Data Store,不需要从众多不同的DataSource中读取数据,所需要的数据都能从单一的数据结构(Dataset)中读取。 PowerBI Service为每个发布的Report自动创建一个Dataset,每一个Dataset的大小的上限是1GB。在导入(Import)连接模式下,PowerBI把多个Data Source的数据导入到Dataset中,也就是说,Dataset存储的是多个数据源(Data Source)的快照。是否把数据源导入到Dataset,是由数据连接(Data Connection Model)决定的。 我的PowerBI开发系列的文章目录:PowerBI开发 一,数据连接模式 当使用“Get Data”连接到Data Source时,PowerBI 自动创建Dataset,把数据从多个Data Source加载到一个Dataset中,Dataset还包含连接Data Source的凭证(Credentials),以及数据的架构等元数据。PowerBI Service直接从Dataset中引用数据,而不是直接从Data Source中。PowerBI支持的连接模式有两种,分别是:Import,Live/DirectQuery。导入(Import)模式把Data Source的数据导入到PowerBI Service的Dataset中,而直接查询(DirectQuery)模式建立Data Source 和Dataset之间的直接连接。 1,导入(Import)模式 对于导入(Import)模式,云端的Dataset中存储的数据来源于内网(On-Premises)数据的副本,一旦加载数据源,查询定义的所有数据都会被加载到Dataset中。PowerBI从高度优化的Dataset中查询数据,查询性能高,能够快速响应用户的交互式查询。由于导入模式是把数据源快照复制到Dataset中,因此,底层数据源的改动不会实时更新到Dataset,这使得Dataset存储的数据是过时的,用户需要手动刷新或设置调度刷新,否 则,Dataset的数据不会更新。数据的刷新是全量更新,而非增量。 导入模式的限制是:Dataset的最大Size是1GB。 2,直接查询(DirectQuery)模式 对于DirectQuery模式,PowerBI直接访问底层的数据源,因此数据始终是最新的。一旦加载数据,PowerBI Service不会向Dataset中加载任何数据(Data),这意味着,Dataset不存储任何数据(Data),但是,Dataset 仍然会存储连接Data Source的凭证,以及数据源的元数据,用于访问底层数据源。在执行查询请求 时,PowerBI Service直接把查询请求发送到原始的Data Source中去获取所需的数据。直接查询采用主动获取数据的方式,这意味着,底层数据的任何更新,不会立即反应到现有的报表展示中,用户需要刷新(Refresh)数据,但是,新的查询请求,都会使用最新的数据。 直接查询模式需要使用本地数据网管(On-Premises Data Gateway),PowerBI Service能够从云端向本地数据源(on-premises data sources)发送查询请求。当产生数据交互行为时,查询直接发送到数据 库,Excel,Azure SQL DB/DW等,由于PowerBI和Data Source之间是直接连接,因此,不需要调度数据PowerBI Service的数据集(Dataset)。 Live/DirectQuery – This means there is a live connection between Power BI and the data source.

万方数据库的使用感受

读书笔记 ——关于万方数据库的使用感受 一、数据库简介 万方数据库是由万方数据公司开发的,涵盖期刊,会议纪要,论文,学术成果,学术会议论文的大型网络数据库。开发公司——万方数据股份有限公司是国内第一家以信息服务为核心的股份制高新技术企业,是在互联网领域,集信息资源产品、信息增值服务和信息处理方案为一体的综合信息服务商。 万方期刊:集纳了理、工、农、医、人文五大类70多个类目共4529种科技类期刊全文。 万方会议论文:《中国学术会议论文全文数据库》是国内唯一的学术会议文献全文数据库,主要收录1998年以来国家级学会、协会、研究会组织召开的全国性学术会议论文,数据范围覆盖自然科学、工程技术、农林、医学等领域。 万方学位论文库(中国学位论文全文数据库):此数据库是万方数据股份有限公司受中国科技信息研究所(简称中信)委托加工的“中国学位论文文摘数据库”,该数据库收录我国各学科领域的学位论文。 成果专利:内容为国内的科技成果、专利技术以及国家级科技计划项目。 中外标准:内容为国家技术监督局、建设部情报所提供的中国国家标准、建设标准、建材标准、行业标准、国际标准、国际电工标准、欧洲标准以及美、英、德、法国国家标准和日本工业标准等。 二、数据库检索指南 1、登录 登录图书馆主页→信息检索→中文数据库→万方数据库,进入数据库。 或者校外登录 2、选择检索途径 数据库检索方式包括:初级检索、高级检索、全库浏览、分类检索、二次检索。 初级检索: 把检索词输入检索框,点击“检索”按钮即可,在这个检索界面,既可作单一检索,也可作组合检索。不管选择哪个检索字段,在未输入任何检索词的情况下点击“检索”,都可浏览全库论文列表,完全等同于“浏览全库”的检索方式。 高级检索: 点击首页的高级检索按钮,即可进入高级检索界面,即可进行高级检索、经典检索和专业检索。使检索的文献更加精确。 浏览全库: 查看所有论文列表,与在初级检索界面不输入任何检索词的情况下直接点击“检索”所得结果相同。 二次检索: 万方数据库所设置的“二次检索”,不在检索首页出现,而是在检索结果中才出现。 我的感受是:1.其特点在于有一个专家和学者选项,如果对某方面有兴趣的人,可以直接去该版块搜索最新专家的研究成果,这个选项把读者的兴趣和目标最大化。让万方独树一帜。 2.新方志全方位呈现地方的政治、经济、文化等信息 这是其他主流搜索没有的,能让使用者感受到切切实在的历史变化。 3.万方简洁清晰的版块比知网更适合我。知网是一个大图书馆的话,万方就是一个让大部分人满意的小阅览室。

如何处理数据库中海量数据,以及处理数据库海量数据的经验和技巧

如何处理数据库中海量数据,以及处理数据库海量数据的经验和技巧 疯狂代码 https://www.wendangku.net/doc/1713499988.html,/ ?:http:/https://www.wendangku.net/doc/1713499988.html,/DataBase/Article11068.html 海量数据是发展趋势,对数据分析和挖掘也越来越重要,从海量数据中提取有用信息重要而紧迫,这便要求处理要准确,精度要高,而且处理时间要短,得到有价值信息要快,所以,对海量数据的研究很有前途,也很值得进行广泛深入的研究。 基于海量数据的数据挖掘正在逐步兴起,面对着超海量的数据,一般的挖掘软件或算法往往采用数据抽样的方式进行处理,这样的误差不会很高,大大提 高了处理效率和处理的成功率。在实际的工作环境下,许多人会遇到海量数据这个复杂而艰巨的问题,它的主要难点有以下几个方面:一、数据量过大,数据中什么情况都可能存在。 ;如果说有10条数据,那么大不了每条去逐一检查,人为处理,如果有上百条数据,也可以考虑,如果数据上到千万级别,甚至过亿,那不是手解决的了,必须通过工具或者程序进行处理,尤其海量的数据中,什么情况都可能存在,例如,数据中某处格式出了问题,尤其在程序处理时,前面还能正常处理,突然到了某个地方问题出现了,程序终止了。二、软硬件要求高,系统资源占用过高 对海量的数据进行处理,除了好的方法,最重要的就是合理使用工具,合理分配系统资源。一般情况,如果处理的数据过TB级,小型机是要考虑的,普通的机子如果有好的方法可以考虑,不过也必须加大CPU和内存,就象面对着千军万马,光有勇气没有一兵一卒是很难取胜的。三、要求很高的处理方法和技巧。 这也是本文的写作目的所在,好的处理方法是一位工程师长期工作经验的积累,也是个人的经验的总结。没有通用的处理方法,但有通用的原理和规则。下面我们来详细介绍一下处理海量数据的经验和技巧:一、选用优秀的数据库工具 现在的数据库工具厂家比较多,对海量数据的处理对所使用的数据库工具要求比较高,一般使用 Oracle或者DB2,微软公 司最近发布的SQL Server 2005性能也不错。另外在BI领域:数据库,数据仓库,多维数据库,数据挖掘,傲博知识库等相关工具也要进行选择,象好的ETL工具和好的OLAP工具都十分必要, 例如Informatic,Eassbase等。笔者在实际数据分析项目中,对每天6000万条的日志数据进行处理,使用SQL Server 2000需要花费6小时,而使用SQL Server 2005则只需要花费3小时。二、编写优良的程序代码 处理数据离不开优秀的程序代码,尤其在进行复杂数据处理时,必须使用程序。好的程序代码对数据的处理至关重要,这不仅仅是数据处理准确度的问题,更是数据处理效率的问题。良好的程序代码应该包含好的算法,包含好的处理流程,包含好的效率,包含好的异常处理机制等。三、对海量数据进行分区操作 对海量数据进行分区操作十分必要,例如针对按年份存取的数据,我们可以按年进行分区,不同的数据库有不同的分区方式 ,不过处理机制大体相同。例 如SQL Server的数据库分区是将不同的数据存于不同的文件组下,而不同的文件组存于不同的磁盘分区下,这样将数据分散开,减小磁盘I/O,减小了系统负荷, 而且还可以将日志,索引等放于不同的分区下。四、建立广泛的索引 对海量的数据处理,对大表建立索引是必行的,建立索引要考虑到具体情况,例如针对大表的分组、排序等字段,都要建立相应索引,一般还可以建立复 合索引,对经常插入的表则建立索引时要小心,笔者在处理数据时,曾经在一个ETL流程中,当插入表时,首先删除索引,然后插入完毕,建立索引,并实施聚合 操作,聚合完成后,再次插入前还是删除索引,所以索引要用到好的时机,索引的填充因子和聚集、非聚集索引都要考虑。五、建立缓存机制 当数据量增加时,一般的处理工具都要考虑到缓存问题。缓存大小设置的好差也关系到数据处理的成败,例如,笔者在处理2亿条数据聚合操作时,缓存设置为100000条/Buffer,这对于这个级别的数据量是可行的。六、加大虚拟内存 如果系统资源有 限,内存提示不足,则可以靠增加虚拟内存来解决。笔者在实际项目中曾经遇到针对18亿条的数据进行处理,内存为

dephi数据集过滤技巧

原理方法 当我们在操作数据集时,往往需要对数据进行筛选。例如:一个名为Customer的数据表,它具有CustNo、CustName、Country、Address、Phone、State、TaxRate等字段,如果只想查看国别为China或顾客号大于1000的顾客记录,就需要对数据集进行过滤。经总结,有下面这些过滤方法。 一、利用TTable和TQuery的Filter属性; 二、用ApplyRange筛选数据集的记录; 三、用OnFilterRecord事件筛选; 四、用TQuery控件的SQL语句。 实现与应用 一、利用TTable和TQuery的Filter属性 1.在设计时设置Filter属性 例如,设置Filter为:Country='China'然后改变Filtered属性为True(注意,Filtered为True时过滤才有效)。则只能看到对应的Country字段内容为'China'的记录。设置Filter时可以使用的操作符有:<、>、<=、>=、=、<>、AND、OR、NOT。例如,设置Filter为:CustNo>=1000 and CustNo<=5000,则只能看到顾客号在1000与5000之间的顾客记录。 2.在程序运行期间进行动态过滤要在程序运行时改变Filter属性,这包括两种情况: (1)操作符右边为常量,例如: Table1.Filter:='State'+'='+'"HI"'; (2)操作符右边不为常量,可能是通过一个变量指定的值,或由一输入框给出的值。 这时需要用到Format函数。其代码形式为: Table1.Filter:=Format('State'+'='+'"%S"',[StateValue]); 其中StateValue为已经赋值的一个字符串变量,也可以为其他形式,例如:Edit1.Text。 二、用ApplyRange筛选数据集的记录。 执行下面这段代码,将只能看到顾客号在1000至5000之间的顾客记录。组成该例程 的几个过程为: ApplyRange,SetRangeStart,SetRangeEnd。 Table1.SetRangeStart; Table1['CustNo']:=1000; Table1.SetRangeEnd; Table1['CustNo']:=5000; Table1.ApplyRange; 该过程只适用于索引的字段。如果想基于非索引字段筛选,则需要通过IndexFieldNames来建立假索引。实现的方法为: Table1.IndexFieldNames:=字段名; Delphi还提供了简单的调用SetRangeStart、SetRangeEnd和ApplyRange的方法,例 如:Table1.SetRange([Edit1.Text],[Edit2.Text]); 三、用OnFilterRecord事件筛选 OnFilterRecord事件允许按非键控字段建立筛选程序,例如: procedure TForm1.Table1FilterRecord(DataSet:TDataSet;var Accept:Boolean); begin Accept:=DataSet['State']='CA'; end; 四、用TQuery控件的SQL语句

C#常用数据库操作方法整理

C#常用操作数据方法整理 using System.Data.SqlClient; //导入sql数据库命名空间,这样可以用sql数据库操作相关类 String ConnectionStr = "server=.;database=数据库名;uid=sa;pwd=123456;"; //数据库连接字符串,server确定数据库服务器名,database定义数据库名,uid定义数据库使用者用户名,pwd为密码。 SqlConnection conn = new SqlConnection(ConnectionStr); //建立数据库连接,只有建立连接了才能操作数据。 //也可以合在一起:SqlConnection conn = new SqlConnection(“server=.;database=数据库名; uid=sa;pwd=123456;”); String SQLString=“”; //数据操作语句放在双引号中,语句有增,删,改,查操作。 SqlCommand comm = new SqlCommand(SQLString, conn); //建立数据库命令,确定sql数据操作语句,和数据库连接。 //也可以合并,SqlCommand comm = new SqlCommand(“数据库操作语句”, conn); conn.Open(); //打开数据库,只有打开数据库,数据库命令才能被执行。 int rows = comm.ExecuteNonQuery(); SqlDataReader dr = comm.ExecuteReader(); //专门用于读取数据库数据 Object result= comm. ExecuteScalar(); //或string result= Cmd. ExecuteScalar().Tostring(); //执行数据库命令: //ExecuteNonQuery()用于增,删,改操作,返回受影响的行数; //ExecuteReader()用于查操作,返回一个SqlDataReader类的对象; //comm.ExecuteScalar()执行查找,返回从数据表中查询结果的第一行第一个单元格的数据。conn.Close();

Brookfield DV2T 粘度计快速操作指南T

Brookfield DV2T粘度计快速操作指南(此指南仅供参考,不清楚之处请严格以原厂英文手册为准) 1 物品清单 2 仪器参数 3 注意事项 4 安装 5 菜单及屏幕 5.1 菜单及图标 5.2 屏幕介绍 6 测量粘度 6.1 快速开始 6.2 自动调零 6.3 编辑方法 6.3.1 转子,转速设置 6.3.2 数据记录方式 6.3.3 结束条件 6.4 开始测量 7 查看结果 8 仪器设置 8.1 Device Setup 8.2 User Settings 8.3 Global Settings 8.4 Admin Function 9 PG Flash Softwar 11 9.1 软件安装 9.2 软件操作 10 仪器校验 11 常见故障排除 1 物品清单 标准型配置清单: 粘度计主机1 支架1 转子(LV:4 支#61-#64;RV/HA/HB:6 支#2-#7) 电源线(无插头)1 护腿(LV/RV:1 个;HA/HB 无护腿)温度探头1 黑色手提箱1 软件光盘1 U 盘1 触摸笔1 操作手册1 转子保护帽1 2 仪器参数

转速0.5~200rpm 测量精度:最大量程的+-1% 温度精度:+-1%(-100℃~+149℃)其余+-2% 重复性:最大量程的+-0.2% 使用环境:0℃~40℃,20%RH~80%RH 无凝露电压:220V 功率:150W 3 注意事项 在使用仪器前请务必熟悉这些注意事项,仪器会记录由以下错误引起的故障,不正确的操作将导致您的仪器失去 免费保修。 1、插拔仪器后部接线时需要关闭电源(U 盘除外); 2、关闭电源后等待30 秒再开机; 3、开机调0 前检查确保仪器水平,卸下转子; 4、安装转子时需托起转轴并固定,不左右晃动,转子竖直,使螺纹对准,轻轻旋紧,不可强行用力; 4、测量完成后卸下转子再清洁; 5、转子为不锈钢材质,不能被碰撞,强掰,转子和主机,线缆均不能用酸碱清洗; 4 安装 1、安装支架:取出支杆,固定在底座上,将底座下的螺丝用13#扳手拧紧; 2、将粘度计主机固定在支架上,拧紧固定螺丝; 3、电源线连接:使用国标10A 的三角插头与电源线连接,棕色接火线,蓝色接零线,黄绿色接地线(也可以直 接用电脑电源线代替); 4、保持电源开关关闭,将温度探头和电源线接入仪器后部接口; 5、调节支架底脚螺丝,使仪器水平,旋下转轴保护帽并保存;安装完成; 5 菜单及屏幕 5.1 菜单及图标 回主菜单用户登录仪器设置 输入数字按日期排序 按名称排序方向键 5.2 屏幕介绍 图1、开机启动画面: 显示仪器型号,及软件版本信息 图2、自动调零: 检查调整仪器前方的水平泡位于中央,移除转轴上的转子,转子保 护帽或者其它接头。 图3、主菜单: ——ConfigureViscosityTeat:配置年度测量的方法,设置转子,转 速,并进行粘度测量(只能一个转速); ——LoadTest:可在电脑上编辑测量方法后拷贝到U 盘,从U 盘,

了解一下适用于每种学习模式的数据集和问题类型

了解一下适用于每种学习模式的数据集和问题类型 宜家家具有多种不同的组装方法。在理想情况下,每种方法都可以组装出完整的沙发或椅子。但是,根据细节的不同,每种产品的组装都有最适用的方法。如果拿到说明手册和所有正确的零件,就只需按照指示操作即可。如果你已经找到了窍门,不妨把手册扔到一边,试试独自操作。 深度学习也是如此。基于可用数据的类型和正在研究的问题,科学家将选择特定的学习模型来训练算法。 在监督式学习模型中,算法基于有标记的数据集进行学习,同时数据集提供答案,算法可利用该答案来评估其在训练数据方面的准确性。相比之下,无监督式模型使用的是无标记数据,算法需要自行提取特征和规律来理解这些数据。半监督式学习居于二者之间:这种方法使用少量有标记的数据来支持大量无标记数据。 增强学习模型一般用来训练带有奖励系统的算法。在特定情况下,如果AI Agent执行了最佳的操作,增强学习模型会提供一定反馈。 下面我们来了解一下适用于每种学习模式的数据集和问题类型。 什么是监督式学习? 如果您在别人的监督之下学习,有人会当场评判您是否得出了正确答案。同样,在监督式学习中,训练算法时同样需要一整套带有标记的数据。 完全标记意味着训练数据集中的每个示例都标记相对应的答案。因此,一个由花朵图像组成的有标记数据集会告知模型哪些图片是玫瑰、哪些图片是雏菊或者水仙。在“看到”新图像时,模型会将其与训练示例进行比较,以给出正确的标记。 在监督式机器学习中,算法需要通过有标记的数据进行学习。 监督式学习有两个主要的应用领域:分类问题和回归问题。 分类问题要求算法可以预测离散值,将输入数据标识为特定类或组的成员。在由动物图像

Access篇使用技巧(推荐)

Access篇 6.1 基本应用技巧 6.1.1 在表格中自动输入月份和年份 在制作表格过程中,常常需要输入系统当前的日期或时间,如果直接输入的话,特别麻烦。有什么更快更好的方法吗? 答:可以利用快捷键来输入。 输入当前日期:选中需输入当前日期的单元格,直接按下“Ctrl+;”键可输入当前日期。 输入当前时间:选中需输入当前时间的单元格,直接按下“Ctrl+Shift+;”键即可。使用上述方法插入的日期和时间的类型是标准格式的文本类型,所以不能在其他非文本格式的单元格中用这种方法。 6.1.2 执行单一条件筛选 系统的筛选功能还是很不错的。但是它总是自作聪明地自动保存前一次筛选的条件,这给执行独立条件筛选带来很多不便。请问可以更改系统这一默认设置吗?答:其实这主要是因为系统在选择内容上实行的是继承选择机制,所以导致筛选条件的继承。要实现独立条件的筛选,可以执行如下操作:首先在“数据透视表视图”或“数据透视图”操作窗口打开数据表。移动鼠标至“数据透视表”或“数据透视图”工具栏上,单击鼠标右键,在弹出的菜单中单击“属性”命令,再选择“筛选和分组”选项卡。单击取消选择“在筛选区内允许选择多个项目”复选框,如图

6-1所示。 图6-1 设置单一条件筛选 这样就可以根据独立条件来进行筛选了。 6.1.3 打印数据库关系图 数据库之间的关系多而复杂,为了更好分析,希望能将它们的关系图直接打印出来,可是系统好像没有提供这样的操作命令。请问该如何才能打印出关系图呢? 答:在系统中是无法直接打印出关系图的,但只要生成图形化关系报告,然后打印该报告就可以得到关系图了。生成关系报告的操作如下:打开数据库文件,然后执行“工具”菜单中的“关系”命令,调出“关系”窗口。再单击“文件”菜单中的“打印关系”命令,这时系统会自动生成一份显示各种关系的报告。再单击鼠标右键,在弹出的菜单中执行“打印”命令来打印该关系报告。也可以执行“另存为”命令来保存该关系报告。 6.1.4 自定义数据表的背景 创建的数据报表都是一个样式,想改变一下数据表的显示背景,该如何操作?

离心机操作屏使用说明书

FLOTTWEG离心机触摸屏操作说明 操作屏幕介绍: 图一:触摸板 键进入下一个画面,退回上级画面,退回到开机初始画面,有故障报警时,按可以首先关闭蜂鸣器,再按尝试故障复位。此为“启动/停止”画面,表示离心机螺旋,表示离心机转鼓,表示进料泵, 表示固渣出料截门,表示启动按钮,

表示停止按钮; 手动开电机的顺序: 开启离心机螺旋→等待螺旋运行正常→开启转鼓主电机 手动关电机的顺序: 关闭离心机转鼓电机→等待转鼓电机速度为零→关闭离心机螺旋图二:开机默认屏幕 此为开机默认屏幕,用于观察离心机运行的转速、差速、和螺旋扭矩;按可查询报警信息,轮番按可开启/关闭浏览报警历史记录; 按进入“系统设定”画面; 按进入离心机的“启动/停止”画面; 图三:系统设定屏幕

为指示灯测试按钮;按可进入“测量量程设定”画面;按进入下一个画面;按退回到操作系统,非调试人员谨慎使用;按可以进行中文、英语、德语直接切换。 图四:

Bowl Speed:转鼓转速量程 Bowl Speed Max:转鼓速度最大运行值 Differention Speed:螺旋差速量程 Bowl Drive Power:转鼓驱动功率量程 Product Flow:进料流量量程 Speed Indicator:速度显示器 Bowl Impluse:转鼓每转脉冲数 Screw Implulse:螺旋每转脉冲数 SIMP Transission: SIMP 齿轮箱转速比 Back Transission:背压齿轮箱变速比 图五:清洗阀 清洗阀的自动状态;清洗阀的手动状态;阀在手动模式下,可以关闭打开。

相关文档
相关文档 最新文档