首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 数据库 第二书店 程序员

如何保存网摘


数据组件和DataSet (3) 分类:默认栏目2006.11.12 14:30 作者:dv35 | 评论:0 | 阅读:545
使用多个表和关系(Working with multiple tables and relationships)下一个示例显示了DataSet的高级应用,它除了提供非连接的数据,还使用表关系。这个示例演示了怎样从Northwind数据库中的Categoies表和Products表中获取一些记录,也演示了它们之间的关系,以便于从分类(category)记录导航到它的所有子产品,并且创建一个简单的报告。

第一步是初始化ADO.NET对象,并且声明两个SQL查询(用于获取分类和产品),如下所示:

string connectionString =

WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;

SqlConnection con = new SqlConnection(connectionString);

string sqlCat = "SELECT CategoryID, CategoryName FROM Categories";

string sqlProd = "SELECT ProductName, CategoryID FROM Products";

SqlDataAdapter da = new SqlDataAdapter(sqlCat, con);

DataSet ds = new DataSet();

下一步,程序执行两个查询,添加两个表到DataSet。注意,连接在开始的时候显性地打开,在两个操作完成之后立即关闭,确保最好的性能。

try

{

con.Open();

// Fill the DataSet with the Categories table.

da.Fill(ds, "Categories");

// Change the command text and retrieve the Products table.

// You could also use another DataAdapter object for this task.

da.SelectCommand.CommandText = sqlProd;

da.Fill(ds, "Products");

}

finally

{

con.Close();

}

在这个示例中,使用了相同的DataAdapter填充两个表。这个技术非常合理,在这种场合也非常有意义,因为你不需要重用DataAdapter来更新数据源。当然,如果你正在使用DataAdapter来同时查询数据和提供改变,你可能不需要使用这个方法。相反,你应当每个表使用单独的DataAdapter,以保证每个DataAdapter为对应的表有正确的插入、更新和删除操作。

现在,你有了带两个表的DataSet。Northwind数据库中的这两个表通过DategoryID字段建立的关系连接在一起。这个字段是Categories表的主键和Product的外键。不幸的是,ADO.NET没有提供任何方法来从数据源中读取关系并自动将关系应用到DataSet中。因此,你需要手工创建DataRelation对象来描述关系。

关系是通过定义DataRelation对象并且添加到DataSet.Relations集中来创建的。创建DataRelation时,指定了3个构造器参数:关系的名字,父表主键的DataColumn和子表外键的DataCloumn。

这个例子的代码如下:

// Define the relationship between Categories and Products.

DataRelation relat = new DataRelation("CatProds",

ds.Tables["Categories"].Columns["CategoryID"],

ds.Tables["Products"].Columns["CategoryID"]);

// Add the relationship to the DataSet.

ds.Relations.Add(relat);

一旦获得了所有的数据,可以循环读取Categories表的记录,并且添加每个分类的名字到HTML串中:

StringBuilder htmlStr = new StringBuilder("");

// Loop through the category records and build the HTML string.

foreach (DataRow row in ds.Tables["Categories"].Rows)

{

htmlStr.Append("");

htmlStr.Append(row["CategoryName"].ToString());

htmlStr.Append("");

...

这一部分相当有趣。在这一块中,你可以通过调用DataRow.GetChildRows()方法来访问当前分类的相关产品记录。一旦你有了产品记录数组,你就可以使用嵌入的foreach循环来读取它。相对于在一个独立的对象中查找信息,或者使用传统的基于连接的访问来执行查询来来说,这个方法要简单得多。

下面一段代码演示了这种方法,获取了子记录,并且完成了外部foreach循环:

...

// Get the children (products) for this parent (category).

DataRow[] childRows = row.GetChildRows(relat);

// Loop through all the products in this category.

foreach (DataRow childRow in childRows)

{

htmlStr.Append("");

htmlStr.Append(childRow["ProductName"].ToString());

htmlStr.Append("");

}

htmlStr.Append("");

}

最后一步是在页面上显示HTML串:

HtmlContent.Text = htmlStr.ToString();

本例的编码完毕,如果你运行网页,将会看到图8-5显示的输出。





图8-5 每个分类的产品列表

提示:ADO.NET程序员新手通常会问到的问题是,什么时候使用JOIN查询和什么时候使用DataRelation对象?考虑的重点是你是否要更新获得的数据。如果是,使用单独的表和DataRelation对象会有最大的灵活性。如果不是,你可以使用任何一种方法。当然,JOIN查询会更高效一些,因为它只包含了一次网络传递,而DataRelation方法一般需要两次来填充独立的表。



参照完整性(Referential Integrity)如果向DataSet添加了关系,就要遵循参照完整性规则。例如,如果还有关联的子记录,就不能删除父记录,也不能创建没有父节点的子记录。如果DataSet只包含部分数据,会出现一些问题。例如,你有客户订单的全部列表,但只有部分客户,问题就出现了。因为订单指向了Dataset中不存在的客户。避免这个问题的方法就是创建一个DataRelation,而不创建相应的约束。为了做到这一点,使用DataRelation构造器接收布尔的createConstraints参数,并且将参数设置为false。如下所示:

DataRelation relat = new DataRelation("CatProds",

ds.Tables["Categories"].Columns["CategoryID"],

ds.Tables["Products"].Columns["CategoryID"], false);

另一个方法是禁用所有约束检查,即在添加关系前设置DataSet.EnbleContraints属性。



搜索特定的行(Searching for Specific Rows)DataTable提供了有用的Select()方法,允许你基于SQL表达式获取DataRow对象数组。和Select()方法一起使用的表达式与SELECT语句中的WHERE子句的功能是一样的。

例如,下面的的代码获取了所有标记为discontinued的产品:

// Get the children (products) for this parent (category).

DataRow[] matchRows = DataSet.Tables["Products"].Select("Discontinued = 0")

// Loop through all the discontinued products and generate a bulleted list.

htmlStr.Append("");

foreach (DataRow row in childRows)

{

htmlStr.Append("");

htmlStr.Append(row["ProductName"].ToString());

htmlStr.Append("");

}

htmlStr.Append("");

在这个例子中,Select()语句使用了相当简单的过滤串。当然,你完全可以使用更复杂的操作符和不同标准的组合。更多信息,参照MSDN类库参考中关于DataColumn.Expression属性的内容,或者参考表8-3和关于过滤字符串的相关节“Filtering with a DataView”。

注意,Select()方法有一个潜在的警告:它不支持参数化的环境。因此,它对于SQL注入攻击是开放的。显然,在这种情形下能够进行的SQL注入攻击是相当有限的,因为没有办法访问真实的数据源或者执行附加的命令。然而,小心地设计的值仍能够欺骗应用,从表中返回额外的信息。如果你创建了带用户提供值的过滤表达式,你可以人工遍历DataTable来找到所需的行,而不是使用Select()方法。



在自定义数据类中使用DataSet(using the dataset in a custom data class)在自定义的数据访问类中,可以使用DataSet或者DataTable作为一个方法的返回值。例如,你可以使用下面的DataSet代码重写前面的GetAllEmployees()方法:

public DataTable GetAllEmployees()

{

SqlConnection con = new SqlConnection(connectionString);

SqlCommand cmd = new SqlCommand("GetEmployee", con);

cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add(new SqlParameter("@EmployeeID", SqlDbType.Int, 4));

cmd.Parameters["@EmployeeID"].Value = employeeID;

SqlDataAdapter da = new SqlDataAdapter(sql, con);

DataSet ds = new DataSet();

// Fill the DataSet.

try

{

da.Fill(ds, "Employees");

return ds.Tables["Employees"];

}

catch

{

throw new ApplicationException("Data error.");

}

}

有趣的是,当你使用这个方法时,唾手可得相同的功能。例如,在下一章中,你会了解使用ObjectDataSource来绑定自定义类。ObjectDataSource理解自定义类和理解DataSet一样好(而且它们的性能基本上也是一样的)。

DataSet方法有几个限制。尽管DataSet提供了非连接数据的理想容器,但你会发现,创建能返回DataTable对象和独特的DataRow对象(例如,作为GetEmployee()方法的返回值)的方法会更简单。然而,这些对象并没有象DataSet那样的数据绑定支持水平,因此,你需要在清晰代码模型(使用不同的非连接数据对象)和高度的灵活性(一般完全使用DataSet,即便只返回一个记录也是)之间进行选择。另一个限制是,DataSet是弱类型的,这意味着没有编译时语法检查或者智能感知来保证使用了正确的字段名(这与自定义数据访问类,如EmployeeDetails不同)。你可以通过构建强类型的DataSet来克服这个限制,但这需要更多的工作要做。有关创建强类型的DataSet的更多信息,请参考Pro ADO.NET 2.0(Apress,2005)。



数据绑定(Data Binding)尽管你循环访问非连接数据并且手工产生HTML并没有什么不妥,但在大多数情形下,ASP.NET数据绑定可以大简化你的工作。第9章详细讨论了数据绑定,但在继续本章的DataView示例之前,你需要了解一些基础知识。

数据绑定的的本质是在数据对象和控件之间建立关联,然后ASP.NET数据绑定基础结构就能正确地创建输出。

其中一个最容易使用的数据绑定控件是GridView。GridView能够精妙地创建HTML表格,表格的每一行代表一条记录,一列代表一个字段。

为了绑定数据到GridView之类的绑定控件,你首先需要正确设置DataSource属性,这个属性指向了包含所要显示信息的对象。在这里,这对象是DataSet:

GridView1.DataSource = ds;

由于数据绑定控件不能绑定到一个单独的表(只能是整个DataSet),使用时需要显性地指定使用哪个表。即需要为DataMember属性设置正确的表名。如下所示:

GrieView1.DataMember = “Employees”;

最后,在你定义了数据的位置之后,你需要调用DataBind()方法来将DataSet中的信息拷贝到控件。如果忘掉了这一步,控件就是空的,信息就不会在页面上显示:

GridView1.DataBind();

作为一种快捷方式,你可以调用当前网页的DataBind()方法,它将遍询支持数据绑定的控件并且调用DataBind()方法。

注意:随后的示例使用数据绑定演示了GridView的过滤和索引功能。第9章和第10章有关于GridView的更多信息。



数据视图类(the DataView Class)
DataView定义了DataTable对象的视图,换句话说,它是DataTable中的数据的一种呈现,只是它包含了自定义的过滤和索引设置。为允许你进行这些设置,DataView有诸如Sort和RowFilter之类的属性。这些属性允许你选择通过视图查看哪些数据。然而,它们并不影响DataTable中的真实数据。例如,如果你通过隐藏一些行来过滤表,那些行仍然保留在DataTable里,只是通过DataView不能访问罢了。

DataView在数据绑定的场合是很有用的。它允许你不需要处理或修改那些数据的同时,显示一个表中的所有数据的子集。因为那些数据可能用于其它任务。

每个DataTable都有一个关联的默认的DataView。你可以创建多个DataView对象来代表同一表的不同视图,默认的DataView是通过DataTable.DefaultView属性来设置的。

在后面的示例中,你可以看到如何根据一个表达式来创建一些grid,以显示按不同字段索引和过滤的记录。



索引和数据视图(Sorting with a DataView)下一个示例使用了有3个GridView控件的页面。页面加载时,为每个grid绑定了相同的DataTable,然而,它使用了3个不同的视图,每个都使用了不同的字段进行了索引。

代码最开始获取了雇员列员并放入DataSet:

// Create the Connection, DataAdapter, and DataSet.

string connectionString =

WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;

SqlConnection con = new SqlConnection(connectionString);

string sql =

"SELECT TOP 5 EmployeeID, TitleOfCourtesy, LastName, FirstName FROM Employees";

SqlDataAdapter da = new SqlDataAdapter(sql, con);

DataSet ds = new DataSet();

// Fill the DataSet.

da.Fill(ds, "Employees");

第二步,通过数据绑定填充GridView控件。为了绑定第一个控件,可以简单直接地使用DataTable,它使用了默认DataView显示所有数据。对另两个控件,应当创建新的DataView对象,然后显性地设置它们的Sort属性。

// Bind the original data to #1.

grid1.DataSource = ds.Tables["Employees"];

// Sort by last name and bind it to #2.

DataView view2 = new DataView(ds.Tables["Employees"]);

view2.Sort = "LastName";

grid2.DataSource = view2;

// Sort by first name and bind it to #3.

DataView view3 = new DataView(ds.Tables["Employees"]);

view3.Sort = "FirstName";

grid3.DataSource = view3;

索引Grid只需要简单地设置DataView.Sort属性为有效的索引表达式。

这个示例每个视图的索引使用了一个字段,但你也可以使用多个字段,多个字段之间用逗号(,)分隔,如下所示:

View2.Sort = “LatstName, FirstName”;

注意:索引是根据列的数据类型进行的。数值和日期列的排序按从小到大。如果DataTable.CaseSensitive属性为false(默认值),字符串列将按字母排序。包含二进制数据的列不会被索引。你也可以使用ASC和DSC属性来指定升序或降序排序。第10章中将再次使用索引和学习DataView过滤。

绑定了grid之后,仍需要触发数据绑定进程来将数据从DataTable拷贝到控件中。可以分别对这些控件进行操作,也可以调用Page.DataBind()来对整个页面进行绑定操作。本例中使用了页面绑定:

Page.DataBind();

图8-6显示了结果页。






过滤和数据视图(Filtering with a DataView)也可以使用DataView来应用自定义过滤,只显示需要的行。为了完成这一设想,需要设置RowFilter属性。RowFilter属性扮演了类似SQL语句中WHERE子句的角色。使用它,你就可以使用逻辑操作符(如<,>,=)和更广的标准来限制输出结果。表8-3显示了大多数过滤操作符。

操作符
描述

<, >, <=, and >=
Performs comparison of more than one value. These comparisons can be numeric (with number data types) or alphabetic dictionary comparisons (with string data types).

<> and =
Performs equality testing.

NOT
Reverses an expression. Can be used in conjunction with any other clause.

BETWEEN
Specifies an inclusive range. For example, “Units BETWEEN 5 AND 15” selects rows that have a value in the Units column from 5 to 15.

IS NULL
Tests the column for a null value.

IN(a,b,c)
A short form for using an OR clause with the same field. Tests for equality between a column and the specified values (a, b, and c).

LIKE
Performs pattern matching with string data types.

+
Adds two numeric values or concatenates a string.

-
Subtracts one numeric value from another.

*
Multiplies two numeric values.

/
Divides one numeric value by another.

%
Finds the modulus (the remainder after one number is divided by another).

AND
Combines more than one clause. Records must match all criteria to be


displayed.

OR
Combines more than one clause. Records must match at least one of the


表8-3 过滤操作符

下面的示例页包含了3个GridView控件,每个都绑定到相同的DataTable,但过滤设置不同。

string connectionString =

WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;

SqlConnection con = new SqlConnection(connectionString);

string sql = "SELECT ProductID, ProductName, UnitsInStock, UnitsOnOrder, " +

Discontinued FROM Products";

SqlDataAdapter da = new SqlDataAdapter(sql, con);

DataSet ds = new DataSet();

da.Fill(ds, "Products");

// Filter for the Chocolade product.

DataView view1 = new DataView(ds.Tables["Products"]);

view1.RowFilter = "ProductName = 'Chocolade'";

GridView1.DataSource = view1;

// Filter for products that aren't on order or in stock.

DataView view2 = new DataView(ds.Tables["Products"]);

view2.RowFilter = "UnitsInStock = 0 AND UnitsOnOrder = 0";

GridView2.DataSource = view2;

// Filter for products starting with the letter P.

DataView view3 = new DataView(ds.Tables[“Products”]);

view3.RowFilter = "ProductName LIKE 'P%'";

GridView3.DataSource = view3;

this.DataBind();

运行网页会对3个grid进行填充,如图8-7所示:





图8-7 不同方法的Grid过滤

提示:DataView也包含了RowStateFilter属性,以便于过滤DataTable,使行显示特定的行状态(inserted, deleted, modified, unchanged)。默认情况下,这个属性也设置来显示没有标记为删除的所有行。



使用关系进行高级过滤(Advanced Filtering with Relationships)DataView也支持非常复杂的过滤表达式。鲜为人知的一个功能是,它具有基于关系来过滤行的能力。例如,你能够显示包含了20种产品的分类,或者你可能显示已经进行了大量购买的客户。在这两种情况下,你需要根据关联表的信息进行过滤。

为了创建这种过滤字符串,需要合并两个要素:

l 连接两个表的关系。

l 一个合计函数,如AVG(),MAX(),MIN()或者COUNT()。这些函数对相关记录的数据起作用。

举个例,假定用Categories和Products表来填充DataSet,并且定义了关系:

// Define the relationship between Categories and Products.

DataRelation relat = new DataRelation("CatProds",

ds.Tables["Categories"].Columns["CategoryID"],

ds.Tables["Products"].Columns["CategoryID"]);

// Add the relationship to the DataSet.

ds.Relations.Add(relat);

你可以使用基于Products表的过滤表达式,过滤Categories表的显示。例如,假定你只想显示那些至少有一件产品价格高于50美元的分类记录。为了实现这个目标,使用COUNT()函数,同时使用表的关系名(CatProds)。过滤字符串应写成这样:

MAX(Child(CatProds).UnitPrice)>50

对DataView应用了这个过滤字符串的代码如下:

DataView view1 = new DataView(ds.Tables["Categories"]);

view1.RowFilter = "MAX(Child(CatProds).UnitPrice) > 50";

GridView1.DataSource = view1;

最终的结果就是GirdView显示了那些至少有一件产品价格高于50美元的分类。



计算列(Calculated Columns)除了从数据源获取的字段外,你还可以添加计算列。计算列描述了既存值的合并计算值。计算列在获取和更新数据时被忽略。要创建计算列,只需要简单地创建一个新的DataColumn对象(指定它的名字和类型),并且设置其Expression属性,然后使用Add()方法,将DataColumn添加到DataTable里的Column集里面。

为了方便演示,下面一列使用了字符串连接将姓(first name)和名(last name)合并到了一个字段:

DataColumn fullName = new DataColumn(

"FullName", typeof(string),

"TitleOfCourtesy + ' ' + LastName + ', ' + FirstName");

ds.Tables["Employees"].Columns.Add(fullName);

提示:当然,你也可以执行一个查询来创建计算列。然而,这种方法会使随后对数据源的更新变得更加复杂,也增加了数据源的工作量。因此,在DataSet中创建计算列是更好的办法。

你也可以创建计算列来合并相关行的信息。例如,你可能向Categories表中添加一列来表明相关的产品数。在这种情况下,你必须首先使用DataRelation对象创建关系,同时还需要使用SQL合并函数,如AVG(), MAX(), MIN(), COUNT()。

下面的例子创建了3个计算列,它们都使用了合并函数和表关系:

string connectionString =

WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;

SqlConnection con = new SqlConnection(connectionString);

string sqlCat = "SELECT CategoryID, CategoryName FROM Categories";

string sqlProd = "SELECT ProductName, CategoryID, UnitPrice FROM Products";

SqlDataAdapter da = new SqlDataAdapter(sqlCat, con);

DataSet ds = new DataSet();

try

{

con.Open();

da.Fill(ds, "Categories");

da.SelectCommand.CommandText = sqlProd;

da.Fill(ds, "Products");

}

finally

{

con.Close();

}

// Define the relationship between Categories and Products.

DataRelation relat = new DataRelation("CatProds",

ds.Tables["Categories"].Columns["CategoryID"],

ds.Tables["Products"].Columns["CategoryID"]);

// Add the relationship to the DataSet.

ds.Relations.Add(relat);

// Create the calculated columns.

DataColumn count = new DataColumn(

"Products (#)", typeof(int), "COUNT(Child(CatProds).CategoryID)");

DataColumn max = new DataColumn(

"Most Expensive Product", typeof(decimal), "MAX(Child(CatProds).UnitPrice)");

DataColumn min = new DataColumn(

"Least Expensive Product", typeof(decimal), "MIN(Child(CatProds).UnitPrice)");

// Add the columns.

ds.Tables["Categories"].Columns.Add(count);

ds.Tables["Categories"].Columns.Add(max);

ds.Tables["Categories"].Columns.Add(min);

// Show the data.

GridView1.DataSource = ds.Tables["Categories"];

GridView1.DataBind();

图8-8显示了输出页面:




图8-8 显示计算列

注意:不要忘记,这些示例仅演示了过滤和合并数据的简便方法。这些操作仅是正确呈现数据的一部分。还有一个同等重要的问题是正确的格式。在第9章和第10章,你会了解到GridView的更多信息,那时你可以以正确的格式来显示货币,并且自定义其它一些细节,如颜色、尺寸、列的顺序和字体。例如,通过设置格式,你可以将4.5000显示为$4.50,使显示含义更明确。



总结
在本章中,你学习了怎样创建基本的数据库组件,并且深入研讨了DataSet和DataView。下一章,你将继续使用相同的数据库组件和DataSet,只是使用了一个新的层。你还会了解到数据源控件怎样通过更高层的抽象来包装ASP.NET的,这将使你使用最少的代码构建丰富的数据绑定页面。

如果想了解DataSet的所有功能,包括那些应用于分布的和丰富的客户端应用的功能,你可以查阅Programming Microsoft ADO.NET 2.0: Core Reference (Microsoft Press,2005)或者 Pro ADO.NET2.0(Apress, 2005)。

你可以通过这个链接引用该篇文章:http://dv35.bokee.com/viewdiary.13536989.html



他们设置了哪些标签:


1 13073077978 2.0中Gridview控件高级技巧 abap ASP C# C++高手BLOG career Code CSDN cxcc DC dfgs Engine中IFeatureClass.Search(filter FAQ for HashMap中的对象根据成员进行自定义排序 hibernate个人看法 http://blog.csdn.net/yeming81/archive/2007/12/18/1946063.aspx http://dl2.csdn.net/down4/20071120/20100703466.doc http://hi.baidu.com/wl20042088/blog/item/a1be9d64cc9ad8f4f6365449.html http://subject.csdn.net/80s.html http://wz.csdn.net/tool in includes. JAVA培训 JFace Linux oracledatareader类 other Recycling)方法中Recycling Redhat Search SEO source strings swftomp3 SWT tag1 test test网摘 to vddv wang6812769 wu 爱情短文 白小姐 办证.刻章.发票.各学历上网文凭 出处:csdn 第一次发网摘 俄罗斯轮盘 房产证13160880698 分三大 福建办证 港澳身份证 港澳身份证13160880698 各种病毒 工具和帮助 广州办证 广州办证13160880698 国际新闻 杭州办证 好网址 黑红轮盘 户口本13160880698 箭头 进制 六合彩 六合彩开奖结果 论文 命令全集 南京办证 南京办证15913164568QQ781783141 你肩膀上有蜻蜓吗? 朋友 全国办证13160880698上海办证13160880698 如何学习java 上海办证 深圳办证 沈阳办证 睡觉的诀窍---睡五分钟等于六个钟头的方法 天津办证 天津办证13160880698 通行证 通行证13160880698 网摘 网摘帮助 下个数字十年 香港六合彩 香港六合彩公司 香港六合彩图库 学习。。。 一个优秀软件开发人员的必修课:高内聚低耦合 一位高手整理的IIS 英语网站 优秀的程序员通常有一下特点: 与领导喝酒的18个诀窍 杂记 曾道人 这是转载的 浙江办证 支持 资格证 资格证13160880698 总结C#中得到程序当前工作目录和执行目录的一些方法 总结而言

谁收藏了这个网址:


zdg收录

使用标签:网摘, CSDN,时间:2006-10-9 14:22:05 | 相关网摘

请下载reg.rar并解压,其中Save-It.reg为右键收藏安装文件,双击运行安装完后,重启浏览器后,到任意网页右键菜单中将出现“收藏到我的技术网摘”菜单,选择网页中一段文字作为摘要,右键点击即可开始提交。安装完后如果希望取消,双击运行压缩包中的UnSave-It.reg即可完成卸载。这种添加方式简单方便,推荐使用

nilxin收录

使用标签:vddv,时间:2006-10-23 12:51:00 | 相关网摘

tlvc收录

时间:2006-10-25 9:46:00 | 相关网摘

管理的目的是什么?

songpingbo收录

使用标签:Career,时间:2006-11-21 11:15:00 | 相关网摘

libby1120收录

时间:2006-11-24 9:01:00 | 相关网摘

lw223收录

使用标签:SWT, JFace,时间:2007-2-27 15:51:13 | 相关网摘

SWT 和 JFace 系列的第 2 部分扩展了我们所学的关于使用 Java? 技术、Eclipse 以及 SWT 和 JFace 库创建简单的 Standard Widget Toolkit (SWT) 应用程序的知识。这一期将向您展示如何使用组合框、列表、表和树控件,以及如何使用表单布局和可重用的 helper 方法。
http://www.ibm.com/developerworks/cn/opensource/os-jface2/

flysky_lfx收录

时间:2007-3-9 21:14:07 | 相关网摘

imu_aniu收录

时间:2007-3-13 20:52:06 | 相关网摘

my first web!

wyx_gritty收录

使用标签:网摘帮助,时间:2007-4-23 10:19:49 | 相关网摘

这个是网摘使用帮助(测试)

wanglidhx收录

使用标签:英语网站,时间:2007-4-27 13:52:44 | 相关网摘

starxw收录

时间:2007-7-15 9:10:11 | 相关网摘

(P)(弹出窗口方式)

rongyvfeng收录

时间:2007-7-16 12:23:50 | 相关网摘

twqltwql收录

时间:2007-7-18 14:39:23 | 相关网摘

chenhuashan111收录

使用标签:与领导喝酒的18个诀窍,时间:2007-7-26 17:38:24 | 相关网摘

诀窍1 酒桌上虽然"感情深,一口闷;感情浅,舔一舔"但喝酒的时候决不能把这句话挂在嘴上。

  诀窍2 韬光养晦,厚积薄发,切不可一上酒桌就充大。

  诀窍3 领导相互喝完才轮到自己敬。

  诀窍4 可以多人敬一人,决不可一人敬多人,除非你是领导。

  诀窍5 自己敬别人,如果不碰杯,自己喝多少可视乎情况而定,比如对方酒量,对方喝酒态度,切不可比对方喝得少,要知道是自己敬人。

  诀窍6 自己敬别人,如果碰杯,一句,我喝完,你随意,方显大度。

  诀窍7 自己职位卑微,记得多给领导添酒,不要瞎给领导代酒,就是要代,也要在领导确实想找人代,还要装作自己是因为想喝酒而不是为了给领导代酒而喝酒。比如领导甲不胜酒力,可以通过旁敲侧击把准备敬领导甲的人拦下。

  诀窍8 端起酒杯(啤酒杯),右手扼杯,左手垫杯底,记着自己的杯子永远低于别人。自己如果是领导,知趣点,不要放太低,不然怎么叫下面的做人?

  诀窍9 如果没有特殊人物在场,碰酒最好按时针顺序,不要厚此薄彼。

  诀窍10 碰杯,敬酒,要有说词。转自转自诀窍11 桌面上不谈生意,喝好了,生意也就差不多了,大家心里面了然,不然人家也不会敞开了跟你喝酒。转自

  诀窍12 不要装歪,说错话,办错事,不要申辩,自觉罚酒才是硬道理。

  诀窍13 假如,纯粹是假如,遇到酒不够的情况,酒瓶放在桌子中间,让人自己添,不要傻不啦叽地去一个一个倒酒,不然后面的人没酒怎么办?

  诀窍14 最后一定还有一个闷杯酒,所以,不要让自己的酒杯空着。跑不了的~

  诀窍15 注意酒后不要失言,不要说大话,不要失态,不要唾沫横飞,筷子乱甩,不要手指乱指,喝汤噗噗响,不要放屁打嗝,憋不住上厕所去,没人拦你。

  诀窍16 不要把"我不会喝酒"挂在嘴上(如果你喝的话),免得别人骂你虚伪,不管你信不信,人能不能喝酒还真能看出来。

  诀窍17 领导跟你喝酒,是给你脸,不管领导要你喝多少,自己先干为敬,记着啊,双手,杯子要低。

  诀窍18 花生米对喝酒人来说,是个好东西。保持清醒的头脑,酒后嘘寒问暖是少不了的,一杯酸奶,一杯热水,一条热毛巾都显得你关怀备至。

  酒量不行的9个技巧

  1、不要主动出击,实行以守为攻战略;

  2、桌前放两个大杯,一杯放白酒,一杯放矿泉水,拿小酒盅干杯,勤喝水,到酒桌上主客基本都喝8分醉时,可以以水代酒,主动出击;(这条不建议用)

  3、干杯后,不要马上咽下去,找机会用餐巾抹嘴,把酒吐餐巾里;(适用女性)

  4、上座后先吃一些肥肉类、淀粉类食品垫底,喝酒不容易醉;

  5、掌握节奏,不要一下子喝得太猛;

  6、不要几种酒混着喝,特别容易醉;

  7、领导夹菜时,千万不要转酒桌中间的圆盘,领导夹菜你转盘是酒桌上的大忌;

  8、喝到六分醉时,把你面前的醋碟中的醋喝下,再让服务员添上……

  9、每次干杯时,倒满,然后在喝前假装没有拿稳酒盅,尽量洒出去一些,这样每次可以少喝进去不少。

ego收录

使用标签:asp,时间:2007-8-26 12:10:36 | 相关网摘

ICANN收录

使用标签:工具和帮助,时间:2007-9-7 22:48:36 | 相关网摘

1) 右键添加方式
2) 链接栏或收藏夹添加方式
3) 直接填写添加方式

ychuang_cn收录

时间:2007-11-28 19:32:19 | 相关网摘

sabrile收录

使用标签:wu,时间:2007-11-28 23:37:50 | 相关网摘

最近遇到一个问题,做作业的时候不小心在桌面上建了不需要的文件,可是删的时候却有提示说:文件正在被另一个人或程序使用,不能删除。而实际上并没有。于是就到网上去找解决办法。搜到了蛮多的方法,现在贴出来,希望能对遇到这种问题的同学有所帮助:

1、注销或重启后,再删;

2、进入安全模式(开机时按住F8后选择安全模式)或用启动软盘(光盘)启动进入纯DOS,删除;

3、如果是删除文件夹,从里往外删,即先进入该文件夹,删除里面所有内容,然后再返回上一层目录,删除该文件夹;

4、用Windows优化大师等的文件粉碎机删除;

5、Win2000/XP系统以管理员身份登录,再执行删除操作;

6、如果系统是WinXP,关闭系统还原,再删;

7、对于大文件,特别是压缩包文件,关闭杀毒软件的实时监控后,再删;

8、注销掉预读功能再删,方法:开始→运行,输入regsvr32 /u shmedia.dll,确定。重启后再删。完了再运行一下regsvr32 shmedia.dll,恢复注册;

9、用WinRAR删除,打开WinRAR,点"添加",选中要删除的文件,在"设置"下点选"压缩后删除源文件",压缩完成后把压缩文件也删除。

10、先对该文件所在分区进行磁盘扫描,扫描前选中"自动修复文件和扇区",完成后再删;

11、打开命令提示符窗口,然后再打开任务管理器,结束"Explorer.exe"进程,在命令提示符窗口进入该文件所在目录,用Del命令删除,完了在任务管理器中点"文件"→新建任务→浏览→找着C:\WINDOWS\Explorer.exe,点"确定"即可;

12、Win2000/XP系统,清除页面文件再删除。方法:系统属性→高级→性能设置→高级→虚拟内存更改→把页面文件大小设为"无分页文件",重启后进行删除。然后恢复原来的页面文件




almondboy收录

使用标签:分三大,时间:2007-11-29 16:48:28 | 相关网摘

发达

liuyi1985收录

使用标签:test,时间:2007-12-2 14:24:07 | 相关网摘

test

yongbuyanqi_zy收录

时间:2007-12-5 15:07:05 | 相关网摘

 2007-11-28 11:57:00
我经常强调,我们的成长过程,就说在学习如何说话,如何沟通.学会与老板沟通更是重要,以下是职场和上司沟通必备8个黄金句型,值得我们好好领会和应用.

  1、句型:我们似乎碰到一些状况
  妙处:以最婉约的方式传递坏消息。
  如果立刻冲到上司的办公室里报告这个坏消息,就算不干你的事,也只会让上司质疑你处理危机的能力。此时,你应该不带情绪起伏的声调,从容不迫地说出本句型,要让上司觉得事情并非无法解决,面我们听起来像是你将与上司站在同一阵线,并肩作战。

  2、句型:我马上处理。
  妙处:上司传唤时责无旁贷
  冷静,迅速地做出这样的回答,会令上司直觉地认为你是名有效率的好部属;相反,犹豫不决的态度只会惹得责任本就繁重的上司不快。

  3、句型:安琪的主意真不错。
  妙处:表现出团队精神
  安琪想出了一条边上司都赞赏的绝妙好计,你恨不得你的脑筋动得比人家快;与其拉长脸孔,暗自不爽,不如偷沾他的光,会让上司觉得你富有团队精神,因而另眼看待。

  4、句型:这个报告没有你不行啦!
  妙处:说服同事帮忙
  有件棘手的工作,你无法独立完成,怎么开口才能让那个以这方面工作最拿手的同事心甘情愿地助你一臂之力呢?送高帽,灌迷汤,而那们好心人为了不负自己在这方面的名声,通常会答应你的请求。

  5、句型:让我再认真地想一想,3点以前给你答复好吗?
  妙处:巧妙闪避你不知道的事
  上司问了你某个与业务有关的问题,而你不知该如何作答,千万不可以说不知道。本句型不仅暂时为你解危,也让上司认为在这件事情上头很用心。不过,事后可得做足功课,按时交出你的答复。

  6、句型:我很想知道你对某件事情的看法
  妙外:恰如其分的讨好
  你与高层要人共处一室,这是一个让你能够赢得青睐的绝佳时机。但说些什么好呢?此时,最恰当的莫过一个跟公司前景有关,而又发人深省的话题。在他滔滔不绝地诉说心得的时候,你不仅获益良多,也会让他对你的求知上进之心刮目相看。

  7、句型:是我一时失察,不过幸好……
  妙处:承认疏失但不引起上司不满
  犯错在所难免,勇于承认自己的过失非常重要,不过这不表示你就得因此对每个人道歉,诀窍在于别让所有的矛头都指到自己身上,坦诚却谈化你的过失,转移众人的焦点。

  8、句型:谢谢你告诉我,我会仔细考虑你的建议
  妙处:面对批评表现冷静
  自己的工作成果遭人修正或批评,的确是一件令人苦恼的事。不需要将不满的情绪写出在脸上,不卑不亢的表现令你年起来更有自信,更值得人敬重。

DJBOY850317收录

时间:2007-12-9 16:46:53 | 相关网摘

wuwzh收录

使用标签:HashMap中的对象根据成员进行自定义排序,时间:2007-12-12 23:00:30 | 相关网摘

Map是Java中最常用的存储对象的集合类之一,存储在HashMap中的对象在取出时是无序的,下文以示例介绍了如果对HashMap中存储的对象根据成员进行自定义排序。

应用说明:计算缓存对象的点击次数按次数排序输出。

1. 定义CacheObj类

定义了一个简单的对象,这个对象将存储在一个HashMap中,希望根据CacheObj中的整型成员变量cachedCounter进行排序输出。




/*
* Created on 2003-3-5
*/
package com.cache;
/**
* @author Weidong
*
*/
public class CacheObj {
int cachedCounter;
Object cacheObj = null;
/**
* @return Returns the cacheObj.
*/
public Object getCacheObj() {
return cacheObj;
}
/**
* @param cacheObj
* The cacheObj to set.
*/
public void setCacheObj(Object cacheObj) {
this.cacheObj = cacheObj;
}
/**
* @return Returns the cachedCounter.
*/
public int getCachedCounter() {
return cachedCounter;
}
/**
* @param cachedCounter
* The cachedCounter to set.
*/
public void setCachedCounter(int cachedCounter) {
this.cachedCounter = cachedCounter;
}
}


2. 自定义HotItemComparator

HotItemComparator实现了Comparator 接口, 实现的方法非常简单就是根据cachedCounter进行比较返回比较结果

正序:return obj1.getCachedCounter() - obj2.getCachedCounter();

倒序:return obj2.getCachedCounter() - obj1.getCachedCounter();




package com.cache;
import java.util.Comparator;
/**
* @author Weidong
*/
public final class HotItemComparator implements Comparator {
/*
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
public int compare(Object arg0, Object arg1) {
CacheObj obj1 = (CacheObj) arg0;
CacheObj obj2 = (CacheObj) arg1;
return obj1.getCachedCounter() - obj2.getCachedCounter();
}
}
3. 测试用例

定义变量:public static final Comparator HOT_ITEM = new HotItemComparator();
将HashMap追加到List对象sortList中:sortList.addAll(caches.values());
对sorList应用HOT_ITEM排序:Collections.sort(sortList, HOT_ITEM);


package com.cache;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* @author Weidong
*/
public class TestBean {
public static final Comparator HOT_ITEM = new HotItemComparator();

public static void sortMap() {
Map caches = new HashMap();
CacheObj s1 = new CacheObj();
s1.setCachedCounter(2);
CacheObj s2 = new CacheObj();
s2.setCachedCounter(3);
CacheObj s3 = new CacheObj();
s3.setCachedCounter(1);
caches.put("1", s1);
caches.put("2", s2);
caches.put("3", s3);

List sortList = new ArrayList();
sortList.addAll(caches.values());
Collections.sort(sortList, HOT_ITEM);
Iterator iter = sortList.iterator();
while (iter.hasNext()) {
CacheObj s = (CacheObj) iter.next();
System.out.println("counter is "+s.getCachedCounter());
}
}
public static void main(String[] args) {
sortMap();
}
}
输出:文中用正序

counter is 1
counter is 2
counter is 3

lml8971收录

时间:2007-12-15 3:13:00 | 相关网摘

qyq198205收录

时间:2007-12-19 15:11:25 | 相关网摘

fanshenglove收录

时间:2007-12-19 15:18:08 | 相关网摘

如何判断RTF域是空的(有没有附件),知道LOTUSSCRIP里可以实现,但在提交检查时需要用到的是公式,有何好办法,请教高手

确保在编辑状态下执行下面代码:
@Command([EditGotoField];"RTF域Name");
@Command([EditSelectAll]);
@If(@IsError(@Command([EditDeselectAll]));@Return(@Prompt([OK];"提示";"BODY域不能为空!"));"");


gogogo9795收录

使用标签:这是转载的,时间:2007-12-23 23:14:27 | 相关网摘

打开Firefox火狐狸浏览器,首先,在URL栏输入“about:config”, 将打开一个参数的命令行清单,这就是我们以下进行编辑的第一步。
第二步,在下面的清单中找到“network.http.pipelining” 然后双击“network.http.pipelining”将其值改成“true”
下面我们要做的就是找到“network.http.pipelining.maxrequests”并把它的值改的高一些,如果你改成30,意思就是要求它每次发送30个请求。
最后一步就是在Firefox任何一个地方点右键,选择“新建”—“整数”在弹出的对话框中输入“nglayout.initialpaint.delay”并将其值改为“0”,表示当浏览器收到网站回复的信息后能够快速的反应。
完全关闭FireFox后退出,再重新打开FireFox,你将会有不一样的速度体验,会有2—3倍的速度提升,有兴趣的朋友可以实验一下。


这个有一点小用,o(∩_∩)o...

download841219收录

使用标签:cxcc,时间:2007-12-24 17:17:25 | 相关网摘

zcczc

aiai1101收录

时间:2007-12-27 10:10:56 | 相关网摘

设为首页

yzhuang收录

时间:2007-12-28 15:06:59 | 相关网摘

%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 562 810
<> setpagedevice
%%HiResBoundingBox: 0.000000 0.000000 562.000000 810.000000

%%Title: (TMP20071225102237_198ffd0_424.EPS)

%%CreationDate: (2007/12/25 10:22:37)

%%LanguageLevel: 2

%%EndComments
%========== PS/EPS STATIC DEFINITIONS - FROM HERE ==========

% CHECK IF LEVEL2 OR LATER
% - @CSD01 --> boolean
%
% returns:
% true ... LEVEL2 or later
% false ... LEVEL1
/@CSD01 where { pop } {
/@CSD01
systemdict /languagelevel known { languagelevel 2 ge } { false } ifelse
def
} ifelse


% DEFAULT MATRIX
% - @CSD02 --> -
/@CSD02 where { pop } {
/@CSD02
matrix currentmatrix
def
} ifelse


% BEGIN EPSF INCLUSION
% - @CSD03 --> -
/@CSD03 where { pop } {
/@CSD03
{
/@CSD04 save def
/@CSD05 countdictstack def
/@CSD06 count 1 sub def
userdict begin
/showpage {} def
0 setgray
0 setlinecap
1 setlinewidth
0 setlinejoin
10 setmiterlimit
[] 0 setdash
newpath
/languagelevel where {
pop languagelevel
1 ne {
false setstrokeadjust
false setoverprint
} if
} if
} bind def
} ifelse


% END EPSF INCLUSION
% - @CSD07 --> -
/@CSD07 where { pop } {
/@CSD07
{
count @CSD06 sub { pop } repeat
countdictstack
@CSD05 sub { end } repeat
@CSD04 restore
} bind def
} ifelse


% SET SPACE SLANTED Horizon
% center_x center_y slant @CSD08 --> -
%
% parameters:
% center_x ... the x position of the slant center point
% center_y ... the y position of the slant center point
% slant ... slant ratio

/@CSD08 where { pop } {
/@CSD08
{
dup
[1 0 0 1 0 0]
dup 2 4 -1 roll put
dup 4 4 -1 roll 5 -1 roll mul -1 mul put
concat
pop
} bind def
} ifelse


/str 20 string def


% SET SPACE SCALED
% center_x center_y scale_x scale_y @CSD10 --> -
%
% parameters:
% center_x ... the x position of the slant center point
% center_y ... the y position of the slant center point
% scale_x ... the x ratio of the scaler vector
% scale_y ... the y ratio of the scaler vector

/@CSD10 where { pop } {
/@CSD10
{
exch dup 3 -1 roll dup
[0 0 0 0 0 0]
dup 3 4 -1 roll put
dup 5 4 -1 roll 1 exch sub 7 -1 roll mul put
dup 0 4 -1 roll put
dup 4 4 -1 roll 1 exch sub 5 -1 roll mul put

dup 0 get str cvs print ( ) print
dup 1 get str cvs print ( ) print
dup 2 get str cvs print ( ) print
dup 3 get str cvs print ( ) print
dup 4 get str cvs print ( ) print
dup 5 get str cvs print ( concat\n) print

concat
} bind def
} ifelse








%========== PS/EPS STATIC DEFINITIONS - TO HERE ==========
/Times-Roman findfont setfont
%(S1) 1.000000 0.000000 0.000000 0.000000 (S2) 1.000000 1.000000 1.000000 1.000000 @CSD36

gsave

239.236000 500.416000 translate

-214.236000 -199.584000 translate

/Count 1 def

% TILING PATH
/FormDict
<< /FormType 1
/BBox [-0.500000 -0.500000 0.500000 0.500000]
/Matrix [1 0 0 1.3 0 0]
/PaintProc
{


0.000000 setlinewidth
0 setlinecap
0 setlinejoin
[] 0 setdash
0.000000 1.000000 0.000000 0.000000 setcmykcolor
%newpath
%0.500000 0.000000 moveto 0.500000 0.276142 0.276142 0.500000 0.000000 0.500000 curveto -0.276142 0.500000 -0.500000 0.276142 -0.500000 0.000000 curveto -0.500000 -0.276142 -0.276142 -0.500000 -0.000000 -0.500000 curveto closepath %0.276142 -0.500000 0.500000 -0.276142 0.500000 0.000000 curveto
%fill
%-0.5 -0.5 moveto (AB) show
-0.5 -0.5 0.5 0 360 arc
fill
%(***************************\n) print
%stroke
}
>>
def

/FormDict1
<< /FormType 1
/BBox [-0.500000 -0.500000 0.500000 0.500000]
/Matrix [1 0 0 1 0 0]
/PaintProc
{
%(@@@@@@@@@@@@@@@@@@@@\n) print

0.000000 setlinewidth
0 setlinecap
0 setlinejoin
[] 0 setdash
1.000000 0.000000 0.000000 0.000000 setcmykcolor
newpath
0.500000 0.000000 moveto 0.500000 0.276142 0.276142 0.500000 0.000000 0.500000 curveto -0.276142 0.500000 -0.500000 0.276142 -0.500000 0.000000 curveto -0.500000 -0.276142 -0.276142 -0.500000 -0.000000 -0.500000 curveto closepath %0.276142 -0.500000 0.500000 -0.276142 0.500000 0.000000 curveto
fill
}
>>
def

% Length XStart YStart XCenter YCenter @CSD42 --> Position
/@CSD42 {
/YCenter exch def
/XCenter exch def
/YStart exch def
/XStart exch def
/Length exch def


/S_Len {XCenter XStart sub abs} def
S_Len Length div
} bind def

% XPosition @CSD43 --> XScale
/@CSD43 {
-1.350000 mul 1.800000 add
} bind def

% YPosition @CSD44 --> YScale
/@CSD44 {
-1.350000 mul 1.800000 add
} bind def

/@CSD45 203.199999 def
/@CSD46 279.943997 def
/@CSD47 202.899996 def
/@CSD48 279.003993 def
/@CSD49 472.799990 def
/@CSD50 422.183990 def
/@CSD51 1.000000 def
/@CSD52 1.000000 def

/XMax 135.000000 def /YMax 72.000000 def

/@CSD53 {@CSD49 @CSD47 sub} bind def
/@CSD54 {@CSD50 @CSD48 sub} bind def

gsave
%newpath
%162.360000 111.744000 moveto 194.039997 111.744000 lineto 194.039997 270.143994 lineto 162.360000 270.143994 lineto closepath
%clip newpath
3 setlinewidth
162.360000 111.744000 moveto 194.039997 111.744000 lineto 194.039997 270.143994 lineto 162.360000 270.143994 lineto closepath
0.000000 0.000000 0.000000 1.000000 setcmykcolor
stroke

gsave
-159.399994 -159.399994 translate 337.599993 350.343991 translate -90.000000 rotate -337.599993 -350.343991 translate

% TILING EXEC
1 1 XMax { /x exch def
1 1 YMax { /y exch def

/Y_IsEven {y 2 mod 0 eq } bind def
/X_IsEven {x 2 mod 0 eq } bind def
/x_point {@CSD45 @CSD51 x cvr 1.0 sub mul add} bind def
/y_point {@CSD46 @CSD52 y cvr 1.0 sub mul add} bind def
Y_IsEven
{
X_IsEven
{


/xp { x_point } bind def
/yp { y_point } bind def
gsave
/GradientPosition {158.399994 258.399996 0.000000 xp yp @CSD42} def
/x_scale {GradientPosition @CSD43} bind def
/y_scale {GradientPosition @CSD44} bind def

x_scale str cvs print ( ) print
y_scale str cvs print (Scale\n) print

x_scale 0.0 gt y_scale 0.0 gt and
{

xp yp x_scale y_scale @CSD10
gsave
xp yp translate

xp str cvs print ( ) print
yp str cvs print (translate\n) print
(1.000000, 0, 0, 1.000000, 0, 0 concat\n\n) print

[1.000000 0 0 1.000000 0 0 ] concat
@CSD03
%(Make Even Form\n)print
FormDict execform
@CSD07
grestore

} if
grestore

} if
}
{
X_IsEven
{ }
{


/xp { x_point } bind def
/yp { y_point } bind def
gsave
/GradientPosition {158.399994 258.399996 0.000000 xp yp @CSD42} def
/x_scale {GradientPosition @CSD43} bind def
/y_scale {GradientPosition @CSD44} bind def

x_scale str cvs print ( ) print
y_scale str cvs print (Scale\n) print

x_scale 0.0 gt y_scale 0.0 gt and
{

xp yp x_scale y_scale @CSD10
gsave
xp yp translate

xp str cvs print ( ) print
yp str cvs print (translate\n) print
(1.000000, 0, 0, 1.000000, 0, 0 concat\n\n) print

[1.000000 0 0 1.000000 0 0 ] concat
@CSD03
%(Make Odd Form\n)print
FormDict1 execform
@CSD07
grestore

} if
grestore

} ifelse
}ifelse
} for
} for 159.399994 159.399994 translate


grestore
grestore
grestore

lijingchen82收录

时间:2007-12-28 17:15:25 | 相关网摘

winfor收录

使用标签:redhat, linux, 命令全集,时间:2007-12-28 18:39:02 | 相关网摘

一. 启动,关机,登入,登出相关命令
登录
登出
登出
停止系统
停止系统
重启动
切断电源
把内存里的内容写入磁盘
安装lilo启动管理程序
安装lilo启动管理程序

二. Shell相关命令
切换Shell
显示命令履历
设置命令别名
取消命令别名
显示命令所在位置
查询命令种类
显示字符串或者变量内容
设置/显示Shell变量
显示环境变量
设置环境变量
设置临时环境变量
释放环境变量
设置环境变量
释放环境变量
执行文件当中的命令
查询命令手册
查询超文本命令手册
显示命令简介
通过关键字查询手册

三. 用户管理相关命令
切换到其他用户
追加用户
追加用户
删除用户
修改用户设置
修改用户私人信息
追加组
删除组
修改组设置
更改密码
显示用户名
显示登录用户帐号
显示所有登录用户信息
查询登录用户信息
查询登录用户信息
显示指定用户的ID信息
显示指定用户的所属组
显示指定用户的个人信息
开关与他人收发消息
给其他用户发消息
给所有用户发消息
和其他用户聊天

四. 系统消息相关命令
显示/设置当前时间
显示系统运行时间
显示机器的核心构架(如i386)
显示操作系统信息
显示终端名
显示登录/登出在履历
显示非法登录信息
显示当前键盘配置
变更键盘配置
查询磁盘使用信息
查询磁盘使用信息
显示系统启动消息
保存输入输出到文件

五. 文件操作相关命令
显示文件列表
显示目录树
显示当前路径
更改当前路径
追加路径到目录堆栈
从目录堆栈删除路径
显示目录堆栈的内容
创建路径
删除路径
复制文件/目录
删除文件/目录
移动文件/目录,修改文件名
更改文件/目录的所有者
修改文件/目录的所有组
修改文件/目录的权限
更改文件时间
建立文件/目录链接
查找文件
显示文件存在的路径名
查询文件种类
查询文件大小

六. 文件编辑相关命令
显示文件内容
输出到文件和屏幕
分屏显示文件内容
分屏显示文件内容
显示文件头部内容
显示文件尾部内容
折叠显示长行
排列文件的行
比较文件内容
显示文件差异
更改日语文件编码
变更文件之后复制
统计文本单词数,文件大小等
分割文件
以行连接文件
以字段连接文件
查询文字
过滤重复部分显示文件内容
替换文字
替换文字

七. 压缩/解压缩相关命令
压缩/解压缩文件
压缩/解压缩文件
压缩/解压缩文件
解压缩
压缩/解压缩文件
解压缩
显示压缩文件的内容
压缩/解压缩文件
把二进制文件编码为文本文件
把经过编码的文本文件还原为二进制文件

八. MS-DOS工具集[mtools]命令
显示文件列表
改变当前目录
新建目录
删除目录
删除目录树
复制文件
删除文件
移动文件
更改文件或目录名
修改文件属性
显示文件内容
查询文件或目录大小
显示磁盘信息
以MS-DOS方式格式化磁盘
设置磁盘标签

九. 控制外部设备相关命令
mount上设备
解除已经mount上的设备
弹出(CD/DVD等)
格式化软盘
配置/显示硬盘分区
格式化磁盘分区
检查/修复磁盘错误
打印到打印机
中断打印任务
显示打印任务的状态
管理/控制打印任务
显示/设定NIC配置

十. 进程及任务管理相关命令
显示正在运行的进程
显示后台运行任务
把任务切换到前台
把任务切换到后台
中止进程或任务
中止进程或任务
等待进程或任务的结束
设置定时执行任务
显示尚未执行的任务
删除定时执行任务
在系统负荷减轻的时候执行任务
改变优先度并执行任务
在后台执行任务,Logout之后也不退出
休眠一定的时间

十一. 网络管理相关命令
显示当前网络连接状况
显示/设置路由
显示网络主机情况
显示/设置当前主机的名字
确认和远程机器的连接情况
显示路由信息
查询网上机器的登陆用户
查询网上机器的系统运行时间
登陆到远程机器
用telnet登陆到远程机器
给远程机器发送命令
在远程机器之间复制文件
收取邮件
发送邮件
确认邮件队列
用ftp传输文件

十二. 其他命令
显示日历
清屏
编译C语言代码
汇编
计算
Redhat的包管理
Debian的包管理
Slackware的包安装(删除命令则是removepkg)
配置 X 服务器
启动 X-Window 系统
附:组合命令
重定向,如
$ ls -l /bin > ls-output
$ more ls-output
管道命令,如
$ cat file1 file2 | sort | uniq
经常被用于管道的命令
awk, fold, grep, head, nnkf, pr, sed, sort, tail, tee, tr, uniq, wc


Redhat中通过命令工具和配置文件设置TCP/IP参数的方法
①ifconfig命令
用ifconfig命令修改后重起服务配置不保存
给Eth0接口设置IP地址和子网掩码广播地址并激活:ifconfig eth0 192.168.1.155 netmask 255.255.255.0 broadcast 192.168.1.255 UP
更改Eth0口的MAC地址:ifconfig eth0 hw ehter 00:40:64:c8:03:04
一个网卡添加多个IP:ifoconfig eht0:1 192.168.1.156 ifconfig eth1:192.168.157
添加网关:route add default gw 192.168.1.1
动态获取IP:ifconfig eth0 -dynamic
②netconfig工具
netconfig命令后 可以选择静态还是动态获取IP,选择静态后
IP address:IP地址
netmask:子网掩码
default gateway (IP):网关
Primary nameserver: DNS地址
如果只想配置某一项
修改IP是动态还是动态获取netconfig --bootproto=dhcp|bootp
设置子网掩码netconfig --netmask=255.255.255.0
设置IP地址netconfig --ip=192.168.1.124
设置DNS地址netconfig --nameserver=218.30.19.40
netconfig默认是设置Eth0网卡的如果想设置其他网卡在device=这打网卡名称
netconfig -d --device=eht1
修改完毕后需要重起服务.不重其服务不生效
③/etc/sysconfig/network-scripts/ifcfg-eth0
dev=eth0 网卡的物理名称
ONBOOT=yes 启动系统时是否启动
BOOTPROTO=static|dynamic 静态还是动态获取IP
ipadd=192.168.1.123 IP地址
netmask=255.255.255.0 子网掩码
network=192.168.1.0 网络地址
boradcast=192.168.1.255 广播地址
gateway=192.168.1.1 网关
#GATEWAYDEV=eth0 与次网关通讯所使用的网卡物理名称
修改完毕后需要重起服务.不重其服务不生效

xmq_197612收录

时间:2007-12-29 13:04:37 | 相关网摘

http://www.cnblogs.com/wayfarer/default.html?page=4

xuxiaohuahhh收录

使用标签:睡觉的诀窍---睡五分钟等于六个钟头的方法,时间:2008-1-3 8:26:12 | 相关网摘

根据医学和我的体验、观察,一个人真正睡着觉最多只有两个钟头,其余都是浪费时间,躺在枕头上做梦,没有哪个人不做梦。至于醒来觉得自己没有做梦,那是因为他忘记了。

  通常一个人睡两个钟头就够了,为什么有人要睡七、八个钟头?那是你赖床躺在枕头上休息的习惯养成的,并非我们需要那么久的睡眠时间,尤其打坐做功夫的人晓得,正午只要闭眼真正睡着三分钟,等于睡两个钟头,不过要对好正午的时间。夜晚则要在正子时睡着,五分钟等于六个钟头。

  就这个时间的学问又大了,同宇宙法则、地球法则、易经阴阳的道理有关系,而且你会感觉到,心脏下面硬是有一股力量降下来,与丹田(肾上)的力量融合,所谓“水火既济”,豁然一下,那你睡眠够了,精神百倍。

  所以失眠或真要夜里熬夜的人,正子时的时刻,哪怕二十分钟也一定要睡,睡不着也要训练自己睡着。

  过了正子时大约十二点半以后,你不会想睡了,这很糟糕。更严重的,到了天快亮,四、五点钟,五、六点卯时的时候,你又困得想睡,这时如果一睡,一天都会昏头。

  所以想从事熬夜工作的人,正子时,即使有天大的事也要摆下来,睡它半小时,到了卯时想睡觉千万不要睡,那一天精神就够了。

  不过失眠的人都挨过十二点,在床上翻来覆去睡不着,结果快天亮睡着了,到第二天下午都昏头昏脑,因此你会感觉失眠、睡眠不足,实际上是你没有经验。

  (没想到睡眠也有这么高深的学问,我试了一下,果真如此。只在子时小睡了半小时,就起来一直到四点钟才睡,居然,六点钟就自己醒了!要是在平时,我一般是要睡到九、十点钟以后才能起来的。大家也可试试,觉得有效果就顶一下吧。)

  睡眠与养生[转载]

  一、睡眠的规则

  战国时名医文挚对齐威王说:“我的养生之道把睡眠放在头等位置,人和动物只有睡眠才生长,睡眠帮助脾胃消化食物,所以,所以睡眠是养生的第一大补,人一个晚上不睡觉,其损失一百天也难以恢复。”

  晚21点到凌晨5点为有效睡眠时间。人是动物,和植物同属于生物,白天(凌晨5点到晚上21点)活动产生能量,晚上(21点到凌晨5点)开始进行细胞分裂,把能量转化为新生的细胞,是人体细胞休养生息、推陈出新的时间,也是人随着地球旋转到背向太阳的一面。阴主静,是人睡眠的良辰,此时休息,才会有良好的身体和精神状态。这和睡觉多的婴儿长得胖、长得快,而爱闹觉的孩子发育不良是一样的道理。

  睡觉是养生的一大功能,养就是用大量的健康细胞去取代腐败的细胞,如一夜睡不着就换不了新细胞。如果说白天消亡一百万个细胞,一晚上只补回来五十万个细胞,这时你的身体就会出现亏空,时间长了,人就糠了,像糠萝卜似的。为什么世上有百岁老人呢?因为他们每晚都在21点钟准时睡觉。

  植物吸收阳光的能量,夜里生长,所以夜晚在农村的庄稼地里可听到拔节的声音。人类和植物同属于生物,细胞分裂的时间段大致相同,错过夜里睡觉的良辰,细胞的新生远赶不上消亡,人就会过早的衰老或患病,人要顺其自然,就应跟着太阳走,即天醒我醒,天睡我睡。人在太阳面前小如微尘,“与太阳对着干”是愚蠢的选择,迟早会被太阳巨大的引力催垮。这是客观真理。

  现实生活中,不少人有入睡难,睡眠质量不高的毛病。睡眠不好是一个综合性的问题,如肝火过盛,睡觉警觉;胃火过剩,睡觉不安;肝阴不足,睡觉劳累。

  二、睡眠与疾病

  现代的生活习惯和生活方式给人们的身体带来了很多负面影响形成“四大病”:水果病、冰箱病、电视电脑病、熬夜病。肝脏有一特点:卧则回血,坐立向外供血。

  子时(23:00—1:00),其实23点就是新的一天的开始,并不是0点开始的,这是我们犯的误识。肝胆相表里,互为一家,23点胆经开了,如若不睡,大伤胆气,由于十一脏腑皆取决于胆也,胆气一虚,全身脏腑功能下降,代谢力、免疫力纷纷下降,人体机能大大降低,胆气支持中枢神经,胆气受伤易患各种精神疾病,比如抑郁症、精神分裂症、强迫症、躁动症等。子时胆要更换胆汁,胆经渐旺人如不卧,胆汁更替不利,过浓而结晶成石,久之即得胆结石,如果把胆给摘了,一摘就胆怯了,全身的免疫力下降了50%以上,所以不能摘,要用它本系统的巨大潜能把它化掉。

  丑时肝经最旺,丑时(1:00—3:00)不眠,肝无法解除掉有毒之物,产生新鲜血液,因藏血不利,面呈青色,久之易患各类肝病,现在有些人肝不太好,特别在欧洲平均4个人就有一个大三阳或是小三阳,大都是因为违反自然规律过了子时不睡觉造成的。甲肝比较好治,乙肝就很难治。乙肝病毒携带者,是由于晚上经常不睡觉,人太虚弱了,也就是说秩序太乱了,病毒已经到了细胞里了。也就是说乙肝的病毒已经到了细胞里面,但是现在它还没有能力造成肝炎,当人身体处于最薄弱的时候就形成成肝炎,乙型肝炎就意味着将来40%——60%的肝硬化。聪明的人是应该了解天、地、人之间的关系,不聪明的人就是应该被淘汰的人。

  肝主疏泄,过子时不睡,可引起肝疏泄不利,肝气郁结,可见易怒,头痛头晕,眼红,眼痛,耳鸣,耳聋,胸肋胀痛,女性月经不调,便秘,也可引起肝气升发不足,人会目倦神疲,腰膝酸软,晕眩,失眠,惊悸,精神恍惚,重则会晕倒在大街上,不省人事。

  肝有藏血、调节血液的功能,过子时不睡,会造成肝血不足,还会引起吐血、流鼻血、皮下出血、牙龈出血、眼底出血、耳出血等出血证状。

  肝开窍于目,过子时不睡,易引起肝虚,则出现视力模糊、老花、夜盲、畏光、迎风流泪,等症状,还会形成青光眼、白内障、眼底动脉硬化、视网膜病变等眼疾。

  肝主筋,其华在爪,过子时不睡觉,会引起肝血不足,就出现筋痛,麻木,屈伸困难,痉挛抽搐,易造成灰指甲,缺钙,髌骨软化,癫痫病,骨质疏松等症。

  肝与心,过子时不睡觉,可引起肝血不足,由于心主一身之血脉,肝有储藏和调节血液的功能,会造成心脏供血不足,引起心慌、心颤等症状,严重的形成心脏病、高血压等心脑血管疾病。

  肝与脾,过子时不睡觉,会引起肝胃不和,由于肝助脾胃消化,由于肝气太虚不能助脾胃消化,使人脾胃消化功能不好,表现为舌苔厚,长期以来会造成中气塌陷。

  肝与肺,过子时不睡觉,无法滋阴潜阳,肝阴亏损,引起肝火过盛灼肺,出现干咳、或咳嗽、咳痰血等木火刑金的证状,易导致牛皮癣等各种皮肤病。

  肝与肾,过子时不睡觉,肝虚导致肾亏,由于肝肾同源,容易造成生殖系统疾病、不育、骨病、牙病、脱发、糖尿病、肾衰竭等疾病。

  三、睡眠的方法

  交通规则——你不懂就容易出事故。比如说,23点至凌晨3点为子丑时,胆肝经最活跃的时候,肝胆要回血,“躺下去回血,站起来供血”。如果你每晚22点钟左右躺下,静静得不要说话,到23点的时候,也就睡着了。肝胆开始回血,把有毒的血过滤掉,产生新鲜的血液,到一百岁也没有胆结石,也没有肝炎、囊肿一类的病。如果你天天熬夜到1点多,肝回不了血,有毒的血排不掉,新鲜的血生不成,胆又无法换胆汁,所以这些人容易得胆结石、囊肿、大三阳、小三阳各种病症。

  在欧洲地区,平均四个人就有一个肝炎病毒携带者,这就叫不懂规则。睡前半小时最好不要讲话,睡觉的时候更不要说话,如一说话,肺经动,然后心经又动,(因为心肺共为上焦)人就容易进入兴奋状态,所以就很难入睡。

  21:00—23:00为亥时。亥时三焦经旺,三焦通百脉。亥时入眠,百脉皆得濡养,故百岁老人得共同特点即21:00(亥时)之前入睡。女性若想长久的保持容颜娇好,应做到早睡早期。

  睡觉要关窗,不能开风扇、不能开空调,人生病很多都与此有关,因为人在睡眠之中,气血流通缓慢,体温下降,人体会在表面形成一种阳气层,这种阳气层它使人叫“鬼魅不侵”,什么意思呢,阳气足的人,不做恶梦,就是这种阳气,占了上风。开空调,开风扇,情况就不一样了,开窗户,窗户走的是风,风入的是筋,如果开空调,也有风,风入筋,寒入骨,早上起来,身上发黄,脸发黄,脖子后面那条筋发硬,骨节酸痛,甚至有人就开始发烧,这就是风和寒侵入到了筋和骨头里的缘故,这也就是气受伤了。如果说晚上睡觉不开窗,不开空调,不开风扇,连房门也关上,效果最好,如果热,把房门打开,把窗户关上,效果就差了一点,但是他不至于第二天早上起来浑身乏力,后背僵硬.

  有人把客厅的空调开开了,把卧室的门打开,和直接开空调睡觉是差不多的,开了空调以后,空调那个寒进了骨了,所以心里发冷,心在哪,心在脑髓,脑为髓之海,骨髓里有寒,那肯定心里就寒了,怎么办,补肾阳、补中气,什么时候补到心里不冷,烧就退了,寒走出去了。

  睡觉要尽量早睡,睡得晚,伤了少阳之气,必然第二天是疲倦无力,要关上窗户,不开空调、电扇,保护阳气。

  肝胆在下焦,如果胃出现问题的时候,他就会出现寝睡不安,一个是胃寒,如果这个人胃阳本来就不足,过多的喝绿茶,就会出现胃寒,胃寒的时候人是睡不好觉的,或者吃带泥沙之物过多,胃隐隐作寒,肯定是睡不好;

  再一个是胃热,就是热气往上走,嘴里喘的都是热气,像这种情况也睡不好觉;再一个是胃燥,口干舌燥,胃里感觉到燥;

  还有一个就是胃厚,气味的味,胃厚,这种情况就是吃了这种厚腻的味道,有人吃海鲜、吃鱼、吃炖鸡,味道好鲜美,吃多了,美味不可多用,这些东西在里面要稀释它,不稀释它,它在里面味太厚了,所以这个也睡不好觉;

  再一个腹涨,腹是涨鼓鼓的,也睡不着,翻来覆去也睡不着;再一个是胃气太虚,冒冷汗,这也睡不好觉,这些原因都可能形成胃不宁,胃不宁就睡不好。

  睡觉时要肢暖,四肢要暖,因为四肢是阳之本,这个大家都知道了,四肢不暖,肯定是肾阳不足,应该在睡觉之前把手脚捂暖,手脚和肚脐、背后的命门都要盖好。

  睡眠法因人而异,下面介绍3种做法:

  1、睡觉前简单的压腿,然后在床上自然盘坐,两手重叠放于腿上,自然呼吸,感觉全身毛孔随呼吸一张一合,若能流泪打哈欠效果最佳,到了想睡觉时倒下便睡。

  2、仰卧,自然呼吸,感觉呼吸像春风,先融化大脚趾,然后是其他脚趾,接着脚、小腿、大腿逐渐融化。如还未醒着,再从头做。

  3、入睡快的人可右侧卧,右手掌托右耳。右掌心为火,耳为水,二者形成水火即济,在人体中形成心肾相交。久之,养心滋肾。

  睡眠一定要早起,即使在冬天,也不可超过6点起床,春夏秋季尽量在5点之前起床,因为人在寅时(3点—5点)肺经旺的时候起床,能够使肺气得以舒展,以顺应阳气的舒长,来完成新陈代谢,肃降浊气,使肺气清,这样有助于养肺和顺应太阳的天势升起人体阳气,使人一天阳气充足,否则,就好像发动机,过了这段好时机就很难发动人体阳气,人体阳气淤积在人体下部不能由命门向上发动升起,会形成淫气,严重损害人的身心健康。

  早晨5点至7点是人体大肠经最旺的时候,人体需要把代谢的浊物排出体外,此时如果不起床,大肠得不到充分活动,无法很好的完成排浊功能,使浊物停留而形成毒素,危害人体血液和脏腑百骸。早晨7点到9点人体胃经最旺,9点到11点人体脾经最旺,这时人的消化吸收运化的能力最好,如果这时还不起床,人体胃酸会严重腐蚀胃粘膜,人体在最佳吸收营养时间得不到营养,长期以来会患脾胃疾病,造成营养不良、中气塌陷。所以千万不要赖床,赖床会造成头昏、疲惫不堪、睡眠不足的感觉,而应按时起床,历史上许多伟人都是有三四点钟起床的习惯,比如华盛顿、拿破仑、康熙皇帝、曾国藩等。另外早起能增加工作效益,俗话说:“三天早起,一天工”。

  现代医学证明,早睡早起的人精神压力较小,不易患精神类疾病。早晨不要太早出去锻炼,因为早晨在太阳没有出来之前,地下道的漳气、浊气正往上走(尤其是城市),这些气对人体损伤是很严重的。

  养身三大事,一睡眠,二便利,三饮食,其余起居、服装等皆是辅助。

  三事中睡眠第一。然胃纳不和者,夜眠不安,故以通便利为第二。而饮食无节,饥饱过度者,肠胃必受伤,而营养日减。睡以安神为主,神以心安为主,应配合年龄,壮年至多七小时至八小时,多睡则智昏头晕眼红胀,四肢疲软,童年必睡足八小时,或过九小时勿碍,老或病人至多六小时已足。

  应注意:

  (一)睡眠宜早,勿过十时,老年人以八点为正,勿过九点。凡交十一时,为阳生时,属肾,此时失眠,肾水必亏,心肾相连,水亏则火旺,最易伤神。千万勿以安眠药片助睡。

  (二)枕上切忌思索计算未来事,睡时宜一切不思,鼻息调匀,自己静听其气,由粗而细,由细而微细而息。视此身如无物,或如糖入于水,化为乌有,自然睡着。

  (三)如有思想,不能安着,切勿在枕上转侧思虑,此最耗神,可坐起一时再睡。

  (四)如在午时,即上午十一点至一点,为阴生之时,属心,此时如不能睡,可静坐一刻钟,闭目养神,则心气强。凡有心脏病者切宜注意,每日于此二时注意,则元气日强,无心跳腹泄或小便频速之病。

  (五)夏日起宜早,冬日起宜迟。居北方宜防寒气,如在粤桂等省,早起防山岚瘴气中病。食后勿仰天睡,早起如在寅时三点至五点,此时切忌郁怒,必损肺伤肝,万望注意。

hkliuhecaigongsi收录

使用标签:香港六合彩公司,时间:2008-1-3 12:52:15 | 相关网摘

香港六合彩公司简称六合彩公司,香港六合彩公司内部资金雄厚.

sitemap收录

使用标签:国际新闻,时间:2008-1-3 18:41:31 | 相关网摘

中共广东省委日前发出《关于开展“继续解放思想,坚持改革开放,争当实践科学发展观的排头兵”学习讨论活动的通知》,要求全省各级党组织和广大干部群众,从贯彻落实党的十七大和省委十届二次全会精神的高度,立足当前,着眼长远,继续解放思想,推动改革创新,为我省深入贯彻落实科学发展观营造积极向上的精神状态和社会氛围,以新一轮思想大解放推动新一轮大发展。

dg3693850c收录

使用标签:俄罗斯轮盘, 黑红轮盘, 黑红轮盘,时间:2008-1-4 10:05:05 | 相关网摘

台湾轮盘游戏软件总部
网址: http://www.lunpan.com
联系:黄生
电话:0769-84688888
QQ:773472 759326


台湾轮盘游戏软件总部业务
出售:一代,二代,三代轮盘,3D轮盘,皇家轮盘,台湾轮盘,黑红轮盘,俄罗斯轮盘,新豪华轮盘,真人轮盘,皇家赛马,啤酒乐园,现场啤酒乐园,单机版轮盘,二八杠,金三色,乐透码等游戏软件


皇家轮盘游戏说明:
皇家轮盘是由1-36以及0,共计37个号码所组成,当玩家下好注后将会有一颗球在轮盘的旁边,随后即会掉入轮盘中直到停止。轮盘号码的位置是由奇数码数交叉排列,颜色则是一黑一红交替着,至於0则为绿色,此游戏是以这颗球最后停滞时落在那一种颜色或号码来作投注游戏方法:
1.2D视觉多种角度可供玩家选择,调整最适合的下注角度。
2.首先点选筹码种类,并在选定的地方下注(左键加注、右键取消押注)。
3.押注时间色条由黄色转为红色,即停止押注,轮盘开始转动,并报号。
4.如果开出的数字为你押注的数字或其中一个,你将获得该押注格赔率的钱。按键盘上的 + 键可以切换轮盘的视野及角度。 
1、桌面上点选轮盘游戏(滑鼠左键点选) 
2、按连接可直接--> 进入试玩模式(有5000个试玩筹码) 
3、输入卡码--> 进入正常模式

欢迎联系购买,同时诚征各地区商,利润丰厚!也可合作经营!
全新加盟方式,投资小见效快,一次加盟终身有效!具体电话详谈

★售后服务
我们提供全程服务,不管你是否懂得计算机最终我们都能做到让你掌握正确运行,欢迎联系咨询。把握机会,先拥有,先淘金。24小时线上服务,技术上的支持,保证您无后顾之优!

sir0721收录

使用标签:c#, oracledatareader类,时间:2008-1-6 16:06:52 | 相关网摘

OracleDataReader 类
提供从数据源读取数据行的只进流的方法。无法继承此类。

命名空间:System.Data.OracleClient
程序集:System.Data.OracleClient(在 system.data.oracleclient.dll 中)

语法
Visual Basic(声明)
Public NotInheritable Class OracleDataReader
Inherits DbDataReader

Visual Basic(用法)
Dim instance As OracleDataReader

C#
public sealed class OracleDataReader : DbDataReader

C++
public ref class OracleDataReader sealed : public DbDataReader

J#
public final class OracleDataReader extends DbDataReader

JScript
public final class OracleDataReader extends DbDataReader


备注
若要创建 OracleDataReader,必须调用 OracleCommand 对象的 ExecuteReader 方法,而不能直接使用构造函数。

OracleDataReader 的用户可能会看到在读取数据时另一进程或线程对结果集所做的更改。

当 OracleDataReader 关闭后,只能调用 IsClosed 和 RecordsAffected 属性。有些情况下,必须先调用 Close,然后才能调用 RecordsAffected。

在任何给定的时间,可以打开多个 OracleDataReader。

下面的两个 Visual Basic 示例阐释如何使用 OracleDataReader 检索 Oracle REF CURSOR。这些示例使用 Oracle Scott/Tiger 架构中定义的表,并且需要下面的 PL/SQL 包和包正文。必须在您的服务器上创建这些包和包正文才能使用这些示例。

在 Oracle 服务器上创建下面的 Oracle 包。

复制代码
CREATE OR REPLACE PACKAGE CURSPKG AS
TYPE T_CURSOR IS REF CURSOR;
PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER,
IO_CURSOR IN OUT T_CURSOR);
PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR,
DEPTCURSOR OUT T_CURSOR);
END CURSPKG;
/

在 Oracle 服务器上创建下面的 Oracle 包正文。

复制代码
CREATE OR REPLACE PACKAGE BODY CURSPKG AS
PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER,
IO_CURSOR OUT T_CURSOR)
IS
V_CURSOR T_CURSOR;
BEGIN
IF N_EMPNO <> 0 THEN
OPEN V_CURSOR FOR
SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND EMP.EMPNO = N_EMPNO;
ELSE
OPEN V_CURSOR FOR
SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;
END IF;
IO_CURSOR := V_CURSOR;
END OPEN_ONE_CURSOR;
PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR,
DEPTCURSOR OUT T_CURSOR)
IS
V_CURSOR1 T_CURSOR;
V_CURSOR2 T_CURSOR;
BEGIN
OPEN V_CURSOR1 FOR SELECT * FROM EMP;
OPEN V_CURSOR2 FOR SELECT * FROM DEPT;
EMPCURSOR := V_CURSOR1;
DEPTCURSOR := V_CURSOR2;
END OPEN_TWO_CURSORS;
END CURSPKG;
/

此 Visual Basic 示例执行返回 REF CURSOR 参数的 PL/SQL 存储过程,并将值作为 OracleDataReader 读取。

Visual Basic 复制代码
Private Sub ReadOracleData(ByVal connectionString As String)
Dim connection As New OracleConnection(connectionString)
Dim command As New OracleCommand()
Dim reader As OracleDataReader

connection.Open()
command.Connection = connection
command.CommandText = "CURSPKG.OPEN_ONE_CURSOR"
command.CommandType = CommandType.StoredProcedure
command.Parameters.Add(New OracleParameter("N_EMPNO", OracleType.Number)).Value = 7369
command.Parameters.Add(New OracleParameter("IO_CURSOR", OracleType.Cursor)).Direction = ParameterDirection.Output

reader = command.ExecuteReader()
While (reader.Read())
' Do something with the values.
End While
reader.Close()
connection.Close()
End Sub


此 Visual Basic 示例执行返回两个 REF CURSOR 参数的 PL/SQL 存储过程,并使用 OracleDataReader 读取值。

Visual Basic 复制代码
Private Sub ReadOracleData(ByVal connectionString As String)
Dim dataSet As New DataSet()
Dim connection As New OracleConnection(connectionString)
Dim command As New OracleCommand()
Dim reader As OracleDataReader

connection.Open()
command.Connection = connection
command.CommandText = "CURSPKG.OPEN_TWO_CURSORS"
command.CommandType = CommandType.StoredProcedure
command.Parameters.Add(New OracleParameter("EMPCURSOR", OracleType.Cursor)).Direction = ParameterDirection.Output
command.Parameters.Add(New OracleParameter("DEPTCURSOR", OracleType.Cursor)).Direction = ParameterDirection.Output

reader = command.ExecuteReader(CommandBehavior.CloseConnection)
While (reader.Read())
' Do something with the values.
End While
reader.NextResult()
While (reader.Read())
' Do something with the values.
End While
reader.Close()
connection.Close()
End Sub


此 C# 示例创建一个 Oracle 表并在其中加载数据。运行后面的示例之前必须先运行此示例,后面的示例会阐释如何使用 OracleDataReader 访问使用 OracleType 结构的数据。

C# 复制代码
public void Setup(string connectionString)
{
OracleConnection connection = new OracleConnection(connectionString);
try
{
connection.Open();
OracleCommand command = connection.CreateCommand();
command.CommandText ="CREATE TABLE OracleTypesTable (MyVarchar2 varchar2(3000),MyNumber number(28,4) PRIMARY KEY,MyDate date, MyRaw raw(255))";
command.ExecuteNonQuery();
command.CommandText ="INSERT INTO OracleTypesTable VALUES ('test', 2, to_date('2000-01-11 12:54:01','yyyy-mm-dd hh24:mi:ss'), '0001020304')";
command.ExecuteNonQuery();
command.CommandText="SELECT * FROM OracleTypesTable";
}
catch(Exception)
{
}
finally
{
connection.Close();
}
}


此 C# 示例使用 OracleDataReader 访问数据,并使用几个 OracleType 结构显示数据。

C# 复制代码
public void ReadOracleTypesExample(string connectionString)
{
OracleConnection connection = new OracleConnection(connectionString);
connection.Open();
OracleCommand command = connection.CreateCommand();
try
{
command.CommandText = "SELECT * FROM OracleTypesTable";
OracleDataReader reader = command.ExecuteReader();
reader.Read();
//Using the Oracle specific getters for each type is faster than
//using GetOracleValue.
//First column, MyVarchar2, is a VARCHAR2 data type in Oracle Server
//and maps to OracleString.
OracleString oraclestring1 = reader.GetOracleString(0);
Console.WriteLine("OracleString " + oraclestring1.ToString());

//Second column, MyNumber, is a NUMBER data type in Oracle Server
//and maps to OracleNumber.
OracleNumber oraclenumber1 = reader.GetOracleNumber(1);
Console.WriteLine("OracleNumber " + oraclenumber1.ToString());

//Third column, MyDate, is a DATA data type in Oracle Server
//and maps to OracleDateTime.
OracleDateTime oracledatetime1 = reader.GetOracleDateTime(2);
Console.WriteLine("OracleDateTime " + oracledatetime1.ToString());

//Fourth column, MyRaw, is a RAW data type in Oracle Server and
//maps to OracleBinary.
OracleBinary oraclebinary1 = reader.GetOracleBinary(3);

//Calling value on a null OracleBinary throws
//OracleNullValueException; therefore, check for a null value.
if (oraclebinary1.IsNull==false)
{
foreach(byte b in oraclebinary1.Value)
{
Console.WriteLine("byte " + b.ToString());
}
}
reader.Close();
}
catch(Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
connection.Close();
}
}


示例
下面的示例创建一个 OracleConnection、一个 OracleCommand 和一个 OracleDataReader。该示例读取全部数据,并将这些数据写到控制台。最后,该示例先关闭 OracleDataReader,然后关闭 OracleConnection。

Visual Basic 复制代码
Public Sub ReadData(ByVal connectionString As String)
Dim queryString As String = "SELECT EmpNo, EName FROM Emp"
Using connection As New OracleConnection(connectionString)
Dim command As New OracleCommand(queryString, connection)
connection.Open()
Dim reader As OracleDataReader
reader = command.ExecuteReader()
' Always call Read before accessing data.
While reader.Read()
Console.WriteLine(reader.GetInt32(0).ToString() + ", " _
+ reader.GetString(1))
End While
' always call Close when done reading.
reader.Close()
End Using
End Sub

C# 复制代码
public void ReadData(string connectionString)
{
string queryString = "SELECT EmpNo, EName FROM Emp";
using (OracleConnection connection = new OracleConnection(connectionString))
{
OracleCommand command = new OracleCommand(queryString, connection);
connection.Open();
OracleDataReader reader;
reader = command.ExecuteReader();
// Always call Read before accessing data.
while (reader.Read())
{
Console.WriteLine(reader.GetInt32(0) + ", " + reader.GetString(1));
}
// always call Close when done reading.
reader.Close();
}
}


继承层次结构
System.Object
System.MarshalByRefObject
System.Data.Common.DbDataReader
System.Data.OracleClient.OracleDataReader

线程安全
此类型的任何公共静态(Visual Basic 中的 Shared)成员都是线程安全的,但不保证所有实例成员都是线程安全的。
平台
Windows 98、Windows 2000 SP4、Windows Millennium Edition、Windows Server 2003、Windows XP Media Center Edition、Windows XP Professional x64 Edition、Windows XP SP2、Windows XP Starter Edition

.NET Framework 并不是对每个平台的所有版本都提供支持。有关受支持版本的列表,请参见系统要求。

版本信息
.NET Framework
受以下版本支持:2.0、1.1

请参见
参考
OracleDataReader 成员
System.Data.OracleClient 命名空间

ljunf888收录

时间:2008-1-12 22:49:36 | 相关网摘

fffffffffff

ban827925收录

使用标签:广州办证, 深圳办证, 福建办证, 杭州办证, 上海办证, 浙江办证, 天津办证, 沈阳办证, 南京办证,时间:2008-1-18 12:44:46 | 相关网摘

广州办证13073077978。QQ:260768226 全国办证13073077978。QQ:260768226
沈阳办证13073077978。QQ:260768226 珠海办证13073077978。QQ:260768226
太原办证13073077978。QQ:260768226 长沙办证13073077978。QQ:260768226
南京办证13073077978。QQ:260768226 青岛办证13073077978。QQ:260768226
深圳办证13073077978。QQ:260768226 重庆办证13073077978。QQ:260768226
广州办证13073077978。QQ:260768226 济南办证13073077978。QQ:260768226
广西办证13073077978。QQ:260768226 大庆办证13073077978。QQ:260768226
北京办证13073077978。QQ:260768226 上海办证13073077978。QQ:260768226
天津办证13073077978。QQ:260768226 武汉办证13073077978。QQ:260768226
吉林办证13073077978。QQ:260768226 长春办证13073077978。QQ:260768226
大连办证13073077978。QQ:260768226 哈尔滨办证13073077978。QQ:260768226

cpkjjxc收录

使用标签:六合彩开奖结果,时间:2008-1-23 9:25:37 | 相关网摘

香港六合彩开奖结果发展趋势:香港六合彩开奖结果简称六合彩开奖结果,(六合彩搅珠结果) 据说内部六合彩奖券是香港奖券管理局开始委托香港赛马会经办娱乐奖券游戏。六合彩开奖结果播映权由亚洲电视本港台获得为期九年六合彩开奖时间,由二○○六年七月一日开始,六合彩开奖结果整个搅珠过程由一位非官守太平绅士和一位奖券基金受惠机构代表在场监察,香港六合彩搅珠结果(六合彩开奖结果)及香港六合彩历史开奖记录(六合彩开奖记录)热线(00852)1888。关于“六合彩开奖结果”可以看到文字版本的开奖现场直播。

fl2006收录

使用标签:一个优秀软件开发人员的必修课:高内聚低耦合,时间:2008-1-23 22:22:40 | 相关网摘

一个优秀软件开发人员的必修课:高内聚

高内聚 Java 软件工程 软件模式

一个重要的模式:高内聚。

2. 高内聚(High Cohesion)

高内聚是另一个普遍用来评判软件设计质量的标准。内聚,更为专业的说法叫功能内聚,是对软件系统中元素职责相关性和集中度的度量。如果元素具有高度相关的职责,除了这些职责内的任务,没有其它过多的工作,那么该元素就具有高内聚性,反之则为低内聚性。高内聚要求软件系统中的各个元素具有较高的协作性,因为在我们在完成软件需求中的一个功能,可能需要做各种事情,但是具有高内聚性的一个元素,只完成它职责内的事情,而把那些不在它职责内的事情拿去请求别人来完成。这就好像,如果我是一个项目经理,我的职责是监控和协调我的项目各个阶段的工作。当我的项目进入需求分析阶段,我会请求需求分析员来完成;当我的项目进入开发阶段,我会请求软件开发人员来完成;当我的项目需要测试的时候,我会请求测试人员。。。。。。如果我参与了开发,我就不是一个高内聚的元素,因为开发不是我的职责。我们的项目为什么要高内聚呢?我觉得可以从可读性、复用性、可维护性和易变更性四个方面来理解。

1.可读性

一个人写文章、讲事情,条理清晰才能易于理解,这同样发生在读写软件代码上。如果一堆代码写得一团乱麻,东一个跳转西一个调用,读它的人会感觉非常头疼。这种事情也许一直在写程序的你我都曾经有过经历。如果一段程序条理非常清晰,每个类通过名称或说明都能清楚明白它的意义,类的每个属性、函数也都是易于理解的它所应当完成的任务和行为,这段程序的可读性必然提高。在软件产业越来越密集,软件产业中开发人员协作越来越紧密、分工越来越细的今天,软件可读性的要求相信也越来越为人们所重视。

2.复用性

在软件开发中,最低等级的复用是代码拷贝,然后是函数的复用、对象的复用、组件的复用。软件开发中最懒的人是最聪明的人,他们总是想到复用。在代码编写的时候突然发现某个功能是曾经实现过的功能,直接把它拷贝过来就ok了。如果这段代码在同一个对象中,那么就提出来写一个函数到处调用就行了。如果不是在同一个对象中呢,就将其抽象成一个对象到处调用吧。如果不在一个项目中呢,那就做成组件给各个项目引用吧。代码复用也使我们的代码在复用的过程中不断精化、不断健壮、提高代码质量。代码的复用的确给我们的开发带来了不少便利,但是一段代码能否在各个需要的地方都能复用呢?这给我们的软件开发质量提出了新的要求:好的代码可以复用,不好的则不行。软件中的一个对象如果能保证能完成自己职能范围内的各项任务,同时又不去理会与自己职能无关的其它任务,那么它就能够保证功能的相对独立性,也就可以脱离自己所处的环境而复用到其它环境中,这是一个具有内聚性的对象。

3.可维护性和易变更性

在前面《如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件》中我提到,我们现在的软件是在不断变更的,这种变更不仅来自于我们的客户,更来自于我们的市场。如果我们的软件通过变更能及时适应我们的市场需求,我们就可以在市场竞争中获胜。如何能及时变更以适应我们的市场呢,就是通过调整软件的结构,使我们每次的变更付出的代价最小,耗费的人力最小,这种变更才最快最经济。高内聚的软件,每个系统、模块、类的任务都高度相关,就使每一次的变更涉及的范围缩小到最小。比如评审表发生了变更,只会与评审表对象有关,我们不会去更改其它的对象。如果我们能做到这一点,我们的系统当然是可维护性好、易变更性好的系统。

那么,我们如何做到高内聚呢?就拿前面我提到的评审项目举例。我现在要为“评审表”对象编写一段填写并保存评审表的代码。评审表对象的职责是更新和查询评审表的数据,但是在显示一个要填写的评审表的时候,我需要显示该评审计划的名称、该评审计划有哪些评审对象需要评审。现在我如何编写显示一个要填写的评审表的代码?我在评审表对象的这个相应的函数中编写一段查询评审计划和评审对象的代码吗?假如你这样做了,你的代码就不是高内聚的,因为查询评审计划和评审对象的数据不是它的职责。正确的方法应当去请求“评审计划”对象和“评审对象”对象来完成这些工作,而“评审表”对象只是获取其结果。

另外,如果一个对象要完成一个虽然在自己职责范围内,但过程非常复杂的任务时,也应当将该任务分解成数个功能相对独立的子函数来完成。我曾经看见一个朋友写的数百行的一个函数,让人读起来非常费劲。同时这样的函数中一些相对独立的代码,本可以复用到其它代码中,也变成了不可能。所以我给大家的建议是,不要写太长的函数,超过一百行就可以考虑将一些功能分解出去。

与 “低耦合”一样,高内聚也不是一个绝对,而是一个相对的指标,应当适当而不能过度。正如我们在现实生活中,如果在一个十来人的小公司,每个人的分工可能会粗一些,所分配的职责会广一些杂一些,因为其总体的任务少;而如果在一个一两百人的大公司,每个人的分工会细一些,所分配的任务会更加专一些,因为总体任务多,更需要专业化的分工来提高效率。软件开发也是一样,如果“评审计划”对象完成的业务功能少,并且不复杂,它完全可以代理它的子表“评审对象”和“评审者”的管理。但是“评审计划”对象需要完成的“对评审计划表的管理”这个基本职责包含的业务功能繁多或者复杂,它就应当将“对评审对象表的管理”交给“ 评审对象”对象,将“对评审者表的管理”交给“评审者”对象。同样,高内聚的可维护性好、易变更性好只能是一个相对的指标。如果一个变更的确是大范围的变更,你永远不可能通过内聚就不进行大范围的变更了。同时内聚也是要付出代价的,所以你也不必要去为了一个不太可能的变更去进行过度设计,应当掌握一个度。过度的内聚必将增加系统中元素之间的依赖,提高耦合度。所以“高内聚”与“低耦合”是矛盾的,必须权衡利弊,综合地去处理。在李洋等人翻译的《UML和模式应用》中,将内聚和耦合翻译为软件工程中的阴与阳,是中国人对内聚和耦合的最佳解释。

综上所述,“高内聚”给软件项目带来的优点是:可读性强、易维护和变更、支持低耦合、移植和重用性强。



一个优秀软件开发人员的必修课:GRASP(2)低耦合

关键字: 设计模式

我偶然在google或yahoo这样的搜索引擎搜索GRASP发现,除了国外的网站,国内网站多介绍和讨论GoF而很少介绍GRASP,即使这少量的文章也讲解非常粗略。个人认为作为优秀的开发人员,理解GRASP比GoF更重要,故写此文章。前面我在《 (原创)一个优秀软件开发人员的必修课:GRASP软件开发模式浅析》中介绍了使用GRASP的目的,今天允许我调换一下顺序,先从低耦合讲起,因为诸如创建者模式、信息专家模式的根本目的就是降低耦合。

1. 低耦合(Low Coupling)

“低耦合”这个词相信大家已经耳熟能详,我们在看spring的书籍、MVC的数据、设计模式的书籍,无处不提到“低耦合、高内聚”,它已经成为软件设计质量的标准之一。那么什么是低耦合?耦合就是对某元素与其它元素之间的连接、感知和依赖的量度。这里所说的元素,即可以是功能、对象(类),也可以指系统、子系统、模块。假如一个元素A去连接元素B,或者通过自己的方法可以感知B,或者当B不存在的时候就不能正常工作,那么就说元素A与元素B耦合。耦合带来的问题是,当元素B发生变更或不存在时,都将影响元素A的正常工作,影响系统的可维护性和易变更性。同时元素A只能工作于元素B存在的环境中,这也降低了元素A的可复用性。正因为耦合的种种弊端,我们在软件设计的时候努力追求“低耦合”。低耦合就是要求在我们的软件系统中,某元素不要过度依赖于其它元素。请注意这里的“过度”二字。系统中低耦合不能过度,比如说我们设计一个类可以不与JDK耦合,这可能吗?除非你不是设计的Java程序。再比如我设计了一个类,它不与我的系统中的任何类发生耦合。如果有这样一个类,那么它必然是低内聚(关于内聚的问题我随后讨论)。耦合与内聚常常是一个矛盾的两个方面。最佳的方案就是寻找一个合适的中间点。

哪些是耦合呢?

1.元素B是元素A的属性,或者元素A引用了元素B的实例(这包括元素A调用的某个方法,其参数中包含元素B)。

2.元素A调用了元素B的方法。

3.元素A直接或间接成为元素B的子类。

4.元素A是接口B的实现。

幸运的是,目前已经有大量的框架帮助我们降低我们系统的耦合度。比如,使用struts我们可以应用MVC模型,使页面展现与业务逻辑分离,做到了页面展现与业务逻辑的低耦合。当我们的页面展现需要变更时,我们只需要修改我们的页面,而不影响我们的业务逻辑;同样,我们的业务逻辑需要变更的时候,我们只需要修改我们的java程序,与我们的页面无关。使用spring我们运用IoC(反向控制),降低了业务逻辑中各个类的相互依赖。假如类A因为需要功能F而调用类B,在通常的情况下类A需要引用类B,因而类A就依赖于类B了,也就是说当类B不存在的时候类A就无法使用了。使用了IoC,类A调用的仅仅是实现了功能F的接口的某个类,这个类可能是类B,也可能是另一个类C,由spring的配置文件来决定。这样,类A就不再依赖于类B了,耦合度降低,重用性提高了。使用hibernate则是使我们的业务逻辑与数据持久化分离,也就是与将数据存储到数据库的操作分离。我们在业务逻辑中只需要将数据放到值对象中,然后交给hibernate,或者从hibernate那里得到值对象。至于用Oracle、MySQL还是SQL Server,如何执行的操作,与我无关。

但是,作为优秀的开发人员,仅仅依靠框架提供的降低软件耦合的方法是远远不够的。根据我的经验,以下一些问题我们应当引起注意:

1) 根据可能的变化设计软件

我们采用职责驱动设计,设计中尽力做到“低耦合、高内聚”的一个非常重要的前提是,我们的软件是在不断变化的。如果没有变化我们当然就不用这么费劲了;但是如果有变化,我们希望通过以上的设计,使我们在适应或者更改这样的变化的时候,付出更小的代价。这里提供了一个非常重要的信息是,我们努力降低耦合的是那些可能发生变更的地方,因为降低耦合是有代价的,是以增加资源耗费和代码复杂度为代价的。如果系统中某些元素不太可能变更,或者降低耦合所付出的代价太大,我们当然就应当选择耦合。有一次我试图将我的表现层不依赖于struts,但发现这样的尝试代价太大而失去意义了。对于软件可能变更的部分,我们应当努力去降低耦合,这就给我们提出一个要求是,在软件设计的时候可以预判日后的变化。根据以往的经验我认为,一个软件的业务逻辑和采用的技术框架往往是容易变化的2个方面。客户需求变更是我们软件设计必须考虑的问题。在RUP的开发过程中,为什么需要将分析设计的过程分为分析模型和设计模型,愚以为,从分析模型到设计模型的过程实际上是系统从满足直接的客户需求到优化系统结构、适应可预见的客户需求变更的一个过程。这种客户需求的变更不仅仅指对一个客户需求的变更,更是指我们的软件从适应一个客户需求到适应更多客户需求的过程。另一个方面,现在技术变更之快,EJB、hibernate、spring、ajax,一个一个的技术像走马灯一样从我们脑海中滑过,我们真不知道明天我在用什么。在这样的情况下,适应变化就是我们最佳的选择。

2) 合理的职责划分

合理的职责划分,让系统中的对象各司其职,不仅是提高内聚的要求,同时也可以有效地降低耦合。比如评审计划BUS、评审表BUS、评审报告BUS都需要通过评审计划DAO去查询一些评审计划的数据,如果它们都去直接调用评审计划DAO(如图A),则评审计划BUS、评审表BUS、评审报告BUS三个对象都与评审计划DAO耦合,评审计划DAO一旦变更将与这三个对象都有关。在这个实例中,实际上评审计划BUS是信息专