<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title><![CDATA[土拨鼠的移动城堡]]></title>
<link>http://blog.pfan.cn/movecity</link>
<description>编程爱好者博客</description>
<language>zh-cn</language>
			<item>
		<title><![CDATA[怎样让SQL只显示用户表]]></title>
		<link>http://blog.pfan.cn/movecity/12451.html</link>
		<description><![CDATA[在SQL Server中，当建立一个数据库后，就存在一些系统表。如果用户建立的用户表较多时，为了浏览和操作的方便，可以将系统表隐藏起来，只显示用户表。
操作方法为：
打开你的企业管理器--&gt;MICROSOFT&nbsp; SQL&nbsp; SERVER--&gt;SQL&nbsp; SERVER组--&gt;数据库实例（可能会是你的机器名，例如：MYCOMPUTER（WINDOWS&nbsp; NT））--&gt;编辑SQL&nbsp; Server注册属性--&gt;把“显示系统数据库和系统对象”前的勾去掉。这样，打开数据库表，就只显示用户表了！]]></description>
		<author><![CDATA[海上土拨鼠]]></author>
		<pubDate>2006-04-15 08:43:00</pubDate>
		</item>
				<item>
		<title><![CDATA[MySQL&nbsp;5.0&nbsp;新特性教程&nbsp;存储过程:第四讲]]></title>
		<link>http://blog.pfan.cn/movecity/12450.html</link>
		<description><![CDATA[Error Handling 异常处理　　 好了，我们现在要讲的是异常处理
1. Sample Problem: Log Of Failures 问题样例：故障记录　　 当INSERT失败时，我希望能将其记录在日志文件中我们用来展示出错处理的问题样例是很普通的。我希望得到错误的记录。当INSERT失败时，我想在另一个文件中记下这些错误的信息，例如出错时间，出错原因等。我对插入特别感兴趣的原因是它将违反外键关联的约束2. Sample Problem: Log Of Failures (2)mysql&gt; CREATE TABLE t2s1 INT, PRIMARY KEY (s1))engine=innodb;//mysql&gt; CREATE TABLE t3 (s1 INT, KEY (s1),FOREIGN KEY (s1) REFERENCES t2 (s1))engine=innodb;//mysql&gt; INSERT INTO t3 VALUES (5);//...ERROR 1216 (23000): Cannot add or update a child row: a foreign keyconstraint fails（这里显示的是系统的出错信息）　　我开始要创建一个主键表，以及一个外键表。我们使用的是InnoDB，因此外键关联检查是打开的。然后当我向外键表中插入非主键表中的值时，动作将会失败。当然这种条件下可以很快找到错误号1216。3. Sample Problem: Log Of FailuresCREATE TABLE error_log (error_messageCHAR(80))// 
　　下一步就是建立一个在做插入动作出错时存储错误的表。
4. Sample Problem: Log Of ErrorsCREATE PROCEDURE p22 (parameter1 INT)BEGINDECLARE EXIT HANDLER FOR 1216INSERT INTO error_log VALUES(CONCAT('Time: ',current_date,'. Foreign Key Reference Failure ForValue = ',parameter1));INSERT INTO t3 VALUES]]></description>
		<author><![CDATA[海上土拨鼠]]></author>
		<pubDate>2006-04-15 08:40:00</pubDate>
		</item>
				<item>
		<title><![CDATA[MySQL&nbsp;5.0&nbsp;新特性教程&nbsp;存储过程:第三讲]]></title>
		<link>http://blog.pfan.cn/movecity/12449.html</link>
		<description><![CDATA[The New SQL Statements 新SQL语句Variables 变量　　 在复合语句中声明变量的指令是DECLARE。　　 (1) Example with two DECLARE statements　　 两个DECLARE语句的例子 
CREATE PROCEDURE p8 ()BEGINDECLARE a INT;DECLARE b INT;SET a = 5;SET b = 5;INSERT INTO t VALUES (a);SELECT s1 * a FROM t WHERE s1 &gt;= b;END; // /* I won't CALL this */　　在过程中定义的变量并不是真正的定义，你只是在BEGIN/END块内定义了而已（译注：也就是形参）。注意这些变量和会话变量不一样，不能使用修饰符@你必须清楚的在BEGIN/END块中声明变量和它们的类型。　　变量一旦声明，你就能在任何能使用会话变量、文字、列名的地方使用。　　(2) Example with no DEFAULT clause and SET statement　　没有默认子句和设定语句的例子
CREATE PROCEDURE p9 ()BEGINDECLARE a INT /* there is no DEFAULT clause */;DECLARE b INT /* there is no DEFAULT clause */;SET a = 5; /* there is a SET statement */SET b = 5; /* there is a SET statement */INSERT INTO t VALUES (a);SELECT s1 * a FROM t WHERE s1 &gt;= b;END; // /* I won't CALL this */　　有很多初始化变量的方法。如果没有默认的子句，那么变量的初始值为NULL。你可以在任何时候使用SET语句给变量赋值。　　(3) Example with DEFAULT clause　　含有DEFAULT子句的例子
CREATE PROCEDURE p10 ()BEGINDECLARE a, b INT DEFAULT 5;INSERT INTO t VALUES (a);SELECT]]></description>
		<author><![CDATA[海上土拨鼠]]></author>
		<pubDate>2006-04-15 08:37:00</pubDate>
		</item>
				<item>
		<title><![CDATA[MySQL&nbsp;5.0&nbsp;新特性教程&nbsp;存储过程:第二讲]]></title>
		<link>http://blog.pfan.cn/movecity/12448.html</link>
		<description><![CDATA[Why MySQL Statements are Legal in a Procedure Body　　 什么MySQL语句在存储过程体中是合法的？ 
　　什么样的SQL语句在Mysql存储过程中才是合法的呢？你可以创建一个包含INSERT, UPDATE,DELETE, SELECT, DROP, CREATE, REPLACE等的语句。你唯一需要记住的是如果代码中包含MySQL扩充功能，那么代码将不能移植。在标准SQL语句中：任何数据库定义语言都是合法的，如：
CREATE PROCEDURE p () DELETE FROM t; //　　SET、COMMIT以及ROLLBACK也是合法的，如：
CREATE PROCEDURE p () SET @x = 5; //　　MySQL的附加功能：任何数据操作语言的语句都将合法。
CREATE PROCEDURE p () DROP TABLE t; //　　MySQL扩充功能：直接的SELECT也是合法的：
CREATE PROCEDURE p () SELECT 'a'; //　　顺便提一下，我将存储过程中包括DDL语句的功能称为MySQL附加功能的原因是在SQL标准中把这个定义为非核心的，即可选组件。在过程体中有一个约束，就是不能有对例程或表操作的数据库操作语句。例如下面的例子就是非法的：
CREATE PROCEDURE p1 ()CREATE PROCEDURE p2 () DELETE FROM t; //　　下面这些对MySQL 5.0来说全新的语句，过程体中是非法的:
CREATE PROCEDURE, ALTER PROCEDURE, DROP PROCEDURE, CREATE FUNCTION,DROP FUNCTION, CREATE TRIGGER, DROP TRIGGER.　　不过你可以使用
CREATE PROCEDURE db5.p1 () DROP DATABASE db5//　　但是类似
"USE database"　　语句也是非法的，因为MySQL假定默认数据库就是过程的工作场所。　　Call the Procedure 调用存储过程　　1.　　现在我们就可以调用一个存储过程了，你所需要输入的全部就是CALL和你过程名以及一个括号再一次强调，括号是必须的当你]]></description>
		<author><![CDATA[海上土拨鼠]]></author>
		<pubDate>2006-04-15 08:33:00</pubDate>
		</item>
				<item>
		<title><![CDATA[MySQL&nbsp;5.0&nbsp;新特性教程&nbsp;存储过程:第一讲]]></title>
		<link>http://blog.pfan.cn/movecity/12447.html</link>
		<description><![CDATA[Introduction 简介 
MySQL 5.0 新特性教程是为需要了解5.0版本新特性的MySQL老用户而写的。简单的来说是介绍了“存储过程、触发器、视图、信息架构视图”,在此感谢译者陈朋奕的努力.希望这本书能像内行专家那样与您进行对话，用简单的问题、例子让你学到需要的知识。为了达到这样的目的，我会从每一个细节开始慢慢的为大家建立概念，最后会给大家展示较大的实用例，在学习之前也许大家会认为这个用例很难，但是只要跟着课程去学，相信很快就能掌握。 
Conventions and Styles 约定和编程风格 
每次我想要演示实际代码时，我会对mysql客户端的屏幕就出现的代码进行调整，将字体改成Courier，使他们看起来与普通文本不一样。 
在这里举个例子：mysql&gt; DROP FUNCTION f;Query OK, 0 rows affected (0.00 sec) 
如果实例比较大，则需要在某些行和段落间加注释，同时我会用将“ &lt;--”符号放在页面的右边以表示强调。 
例如： 
mysql&gt; CREATE PROCEDURE p ()-&gt; BEGIN/* This procedure does nothing */ &lt;---&gt; END;//Query OK, 0 rows affected (0.00 sec) 
有时候我会将例子中的"mysql&gt; "和"-&gt; "这些系统显示去掉，你可以直接将代码复制到mysql客户端程序中（如果你现在所读的不是电子版的，可以在mysql.com网站下载相关脚本）所以的例子都已经在Suse 9.2 Linux、Mysql 5.0.3公共版上测试通过。 
在您阅读本书的时候，Mysql已经有更高的版本，同时能支持更多OS了，包括Windows，Sparc，HP-UX。因此这里的例子将能正常的运行在您的电脑上。但如果运行仍然出现故障，可以咨询你认识的资深Mysql用户，以得到长久的支持和帮助。 
所以存储过程是可复用的组件！想象一下如果你改变了主机的语言，这对存储过程不会产生影响，因为它是数据库逻辑而不是应用程序。存储过程是可以移植的！当你用SQL编写存储过程时，你就知道它可以运行在Mysql支持的任何平台上，不需要你额外添加运行环境包，也不需要为程序在]]></description>
		<author><![CDATA[海上土拨鼠]]></author>
		<pubDate>2006-04-15 08:31:00</pubDate>
		</item>
				<item>
		<title><![CDATA[存储过程中的循环语句]]></title>
		<link>http://blog.pfan.cn/movecity/12446.html</link>
		<description><![CDATA[存储过程中的循环语句&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

WHILE设置重复执行 SQL 语句或语句块的条件。只要指定的条件为真，就重复执行语句。可以使用 BREAK 和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。
语法WHILE Boolean_expression&nbsp;&nbsp;&nbsp; { sql_statement | statement_block }&nbsp;&nbsp;&nbsp; [ BREAK ]&nbsp;&nbsp;&nbsp; { sql_statement | statement_block }&nbsp;&nbsp;&nbsp; [ CONTINUE ]
参数Boolean_expression
返回 TRUE 或 FALSE 的表达式。如果布尔表达式中含有 SELECT 语句，必须用圆括号将 SELECT 语句括起来。
{sql_statement | statement_block}
Transact-SQL 语句或用语句块定义的语句分组。若要定义语句块，请使用控制流关键字 BEGIN 和 END。
BREAK
导致从最内层的 WHILE 循环中退出。将执行出现在 END 关键字后面的任何语句，END 关键字为循环结束标记。
CONTINUE
使 WHILE 循环重新开始执行，忽略 CONTINUE 关键字后的任何语句。
注释如果嵌套了两个或多个 WHILE 循环，内层的 BREAK 将导致退出到下一个外层循环。首先运行内层循环结束之后的所有语句，然后下一个外层循环重新开始执行。
示例A. 在嵌套的 IF...ELSE 和 WHILE 中使用 BREAK 和 CONTINUE在下例中，如果平均价格少于 $30，WHILE 循环就将价格加倍，然后选择最高]]></description>
		<author><![CDATA[海上土拨鼠]]></author>
		<pubDate>2006-04-15 08:10:00</pubDate>
		</item>
				<item>
		<title><![CDATA[ADO记录集和水晶报表(转)]]></title>
		<link>http://blog.pfan.cn/movecity/12246.html</link>
		<description><![CDATA[在使用水晶报表时，经常会感到数据不是很好控制，最后只好使用这个终极绝招咯。那就是使用数据定义文件（TTX），把得到的ADO记录集传送给水晶报表。通常情况下，水晶报表是从物理的数据库上创建出来的，但是现在有了32位的Active&nbsp;Data&nbsp;Driver--&nbsp;P2smon.dll，水晶就可以不用再事先连接到一个数据库上咯。首先，需要创建一个TTX文件，进入数据源选择窗体后，如下图选中再单击了前面的“+”后弹出数据源窗体此时，我们使用“New”按钮创建一个新的数据定义文件（TTX），格式如下保存后，我们打开这个文本文件，就会发现TTX文件的格式，原来中间是TAB分割符来的。接着，我们就按照水晶报表的老套路画式样，剩下的就是传递记录机集了。下面，我们要声明好传递ADO记录集需要的Api，Public&nbsp;Declare&nbsp;Function&nbsp;PEOpenEngine&nbsp;Lib&nbsp;"crpe32.dll"&nbsp;()&nbsp;As&nbsp;IntegerPublic&nbsp;Declare&nbsp;Function&nbsp;PEGetErrorCode&nbsp;Lib&nbsp;"crpe32.dll"&nbsp;(ByVal&nbsp;printJob&nbsp;As&nbsp;Integer)&nbsp;As&nbsp;IntegerPublic&nbsp;Declare&nbsp;Function&nbsp;PEOpenPrintJob&nbsp;Lib&nbsp;"crpe32.dll"&nbsp;(ByVal&nbsp;RptName&nbsp;As&nbsp;String)&nbsp;As&nbsp;IntegerPublic&nbsp;Declare&nbsp;Function&nbsp;PEOutputToWindow&nbsp;Lib&nbsp;"crpe32.dll"&nbsp;(&nbsp;_ByVal&nbsp;printJob&nbsp;As&nbsp;Integer,&nbsp;_ByVal&nbsp;Title&nbsp;As&nbsp;String,&nbsp;_ByVal&nbsp;Left&nbsp;As&nbsp;Long,&nbsp;_ByVal&nbs]]></description>
		<author><![CDATA[海上土拨鼠]]></author>
		<pubDate>2006-04-11 10:20:00</pubDate>
		</item>
				<item>
		<title><![CDATA[SQLServer的日期处理--(1)]]></title>
		<link>http://blog.pfan.cn/movecity/12245.html</link>
		<description><![CDATA[1.首先获取日期&nbsp;&nbsp;“开始”-〉“所有程序”-〉“MircoSoft&nbsp;SQLServer”-〉“查询分析器”&nbsp;&nbsp;在查询分析器里面输入：Select&nbsp;GetDate()&nbsp;&nbsp;可以获得当前数据库的时间.2.使其格式化输出&nbsp;&nbsp;&nbsp;例如你只想获得年份:可以用函数YEAR()&nbsp;&nbsp;&nbsp;&nbsp;PS&nbsp;--大小写不要紧&nbsp;&nbsp;&nbsp;Select&nbsp;YEAR(GetDate())&nbsp;as&nbsp;year&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PS--跟在as后面是列名&nbsp;&nbsp;&nbsp;例如你只想获得月份:可以用函数month()&nbsp;&nbsp;&nbsp;Select&nbsp;month(GetDate())&nbsp;as&nbsp;month&nbsp;&nbsp;&nbsp;例如你只想获得某日期:可以用函数day()&nbsp;&nbsp;&nbsp;Select&nbsp;day(GetDate())&nbsp;as&nbsp;day如果你使用的是DELPHI&nbsp;则用Adoquery1.FieldByNae("day"&nbsp;.AsString就可以获得今天是什么日子如果你使用的是C#&nbsp;则用.DataRow("day"&nbsp;.ToString()就可以获得今天是什么日子,在程序上面显示出来]]></description>
		<author><![CDATA[海上土拨鼠]]></author>
		<pubDate>2006-04-11 10:19:00</pubDate>
		</item>
				<item>
		<title><![CDATA[.NET开发中的一些小技巧&nbsp;]]></title>
		<link>http://blog.pfan.cn/movecity/12244.html</link>
		<description><![CDATA[这篇文章来自是Mukund&nbsp;Pujari的《Some&nbsp;Cool&nbsp;Tips&nbsp;for&nbsp;.NET》，本人给大家翻译总结一下，我英语水平也就那么回事，不合适的地方还是请大家提出来。1.&nbsp;如何创建一个可改变大小没有标题栏的窗体？（How&nbsp;to&nbsp;create&nbsp;a&nbsp;form&nbsp;with&nbsp;resizing&nbsp;borders&nbsp;and&nbsp;no&nbsp;title&nbsp;bar?）form1.Text&nbsp;=&nbsp;string.&nbsp;Empty;&nbsp;form1.ControlBox&nbsp;=&nbsp;false;2.&nbsp;如何在.NET的Windows窗体上启用XP主题集？（How&nbsp;to&nbsp;use&nbsp;XP&nbsp;Themes&nbsp;with&nbsp;Windows&nbsp;Forms&nbsp;using&nbsp;the&nbsp;.NET?）确认你的控件中FlatStyle属性已经修改为System，再修改Main方法。static&nbsp;void&nbsp;Main()&nbsp;{&nbsp;&nbsp;&nbsp;Application.EnableVisualStyles();&nbsp;&nbsp;Application.DoEvents();&nbsp;&nbsp;&nbsp;Application.&nbsp;Run(new&nbsp;Form1());&nbsp;}&nbsp;3.&nbsp;如何为一个窗体设置一个默认按钮？（How&nbsp;to&nbsp;set&nbsp;the&nbsp;default&nbsp;button&nbsp;for&nbsp;a&nbsp;form?）form1.AcceptButton&nbsp;=&nbsp;button1;4.&nbsp;如何为一个窗体设置一个取消按钮？（How&nbsp;to&nbsp;set&nbsp;the&nbsp;Cancel&nbsp;button&nbsp;for&nbsp;a&nbsp;form?）form1.CancelButton&nbsp;=&nbsp;butto]]></description>
		<author><![CDATA[海上土拨鼠]]></author>
		<pubDate>2006-04-11 10:17:00</pubDate>
		</item>
				<item>
		<title><![CDATA[c#.net常用函数列表]]></title>
		<link>http://blog.pfan.cn/movecity/12243.html</link>
		<description><![CDATA[1、DateTime&nbsp;数字型&nbsp;System.DateTime&nbsp;currentTime=new&nbsp;System.DateTime();&nbsp;1.1&nbsp;取当前年月日时分秒&nbsp;currentTime=System.DateTime.Now;&nbsp;1.2&nbsp;取当前年&nbsp;int&nbsp;年=currentTime.Year;&nbsp;1.3&nbsp;取当前月&nbsp;int&nbsp;月=currentTime.Month;&nbsp;1.4&nbsp;取当前日&nbsp;int&nbsp;日=currentTime.Day;&nbsp;1.5&nbsp;取当前时&nbsp;int&nbsp;时=currentTime.Hour;&nbsp;1.6&nbsp;取当前分&nbsp;int&nbsp;分=currentTime.Minute;&nbsp;1.7&nbsp;取当前秒&nbsp;int&nbsp;秒=currentTime.Second;&nbsp;1.8&nbsp;取当前毫秒&nbsp;int&nbsp;毫秒=currentTime.Millisecond;&nbsp;（变量可用中文）&nbsp;1.9&nbsp;取中文日期显示——年月日时分&nbsp;string&nbsp;strY=currentTime.ToString("f";&nbsp;//不显示秒&nbsp;1.10&nbsp;取中文日期显示_年月&nbsp;string&nbsp;strYM=currentTime.ToString("y";&nbsp;1.11&nbsp;取中文日期显示_月日&nbsp;string&nbsp;strMD=currentTime.ToString("m";&nbsp;1.12&nbsp;取当前年月日，格式为：2003-9-23&nbsp;string&nbsp;strYMD=currentTime.ToString("d";&nbsp;1.13&nbsp;取当前时分，格式为：14：24&nbsp;string&nbsp;strT=currentTime.ToString("t";&nbsp;2、Int32.Parse(变量)&nbsp;Int32.Parse("常量"&nbsp;]]></description>
		<author><![CDATA[海上土拨鼠]]></author>
		<pubDate>2006-04-11 10:15:00</pubDate>
		</item>
				<item>
		<title><![CDATA[自动更新的原理&nbsp;]]></title>
		<link>http://blog.pfan.cn/movecity/12242.html</link>
		<description><![CDATA[需要自动更新的时候，客户端软件提交更新请求给固定的网址，然后网址返回最新版本的版本号。客户端软件和自己的版本号对比，如果发现服务器的版本和自己的版本不一样，那么就请求下载升级补丁。服务器响应请求，提供补丁下载；下载成功后，手动或自动安装一下就可以了。&nbsp;&nbsp;&nbsp;&nbsp;安装补丁的时候，客户端的主程序一般是要关闭的，除非采用动态卸载、调入组件的技术，比如网络游戏，就是尽量让玩家边玩游戏边更新。&nbsp;&nbsp;&nbsp;&nbsp;如果更新的是主程序，那么就必须关闭主程序了。可是主程序关闭了之后，谁来调用安装补丁呢？为了解决这个问题，人们把主程序和自动更新程序分开来做。当需要校验版本的时候，主程序调用自动更新程序。自动更新程序如果发现主程序需要更新，在下载了升级补丁之后，就会要求关闭主程序。主程序关闭之后，自动更新程序调用升级补丁进行安装，安装完成后再重新启动主程序。自动更新程序自动退出，完成更新任务。这和你刚才关闭电脑后再插网卡的原理是一模一样的。其实生活中有很多现象可以借鉴到软件设计中。&nbsp;&nbsp;&nbsp;人们嫌这样的升级仍然太麻烦，后来出现了B/S结构，大家像抓住了救命稻草一样的追捧至今，希望能从这些劳动中解脱出来。B/S结构就是浏览器/服务器结构，它所有的功能，都是在浏览器里完成。程序升级的时候，只需要在服务端升级一下就可以了，浏览器再次访问服务器的时候，得到的就是新版本。你可以把它理解成一个纯粹的网站。是不是站长更新的时候，你打开网站就看到最新的页面？&nbsp;&nbsp;&nbsp;但是B/S结构有天生的弱点，因为它是基于网页浏览的，所以安全性是首要的难题，你能浏览的东西，原则上别人也能浏览。而且出于安全考虑，B/S访问本地资源，比如串口，必须借助于其他技术实现。B/S也不是万能的，必须考虑实际应用。附录:Winform的自动更新winform程序相对web程序而言，功能更强大，编程更方便，但软件更新却相当麻烦，要到客户端一台一台地升级，面对这个实际问题，在最近的一个小项目中，本人设计了一个通过软件实现自动升级技术方案，弥补了这一缺陷，有较好的参考价值。&nbsp;一、升级的好处。&nbsp;长期以来，广大程序员为到底是使用Client/Server，还是使用Browser/Server结构争论不休，在]]></description>
		<author><![CDATA[海上土拨鼠]]></author>
		<pubDate>2006-04-11 10:14:00</pubDate>
		</item>
				<item>
		<title><![CDATA[ADO.NET学习笔记&nbsp;[转]]]></title>
		<link>http://blog.pfan.cn/movecity/12240.html</link>
		<description><![CDATA[操纵dataset在DataSet中DataRow是其所有数据的基本存放位置，它主要是由一个值数组组成，代表DataTable单独一行。DataRow中主要包括一下几种信息：1、行中每一列的当前值，2、行中每一列的原始值，3、行状态，4、父行与子行间的链接初始化一个DataRow：DataTable&nbsp;dataTable＝dataSet.Tables[0];DataRow&nbsp;newRow=dataTable.NewRow();&nbsp;//用dataTable生成DataRow可以利用dataTable里面的模式dataTable.Rows.Add(newRow);删除行：DataTable.Rows.Remove(行实例);DataTable.Rows.RemoveAt(行号);DataRow.Delete();&nbsp;//行自身移除读写DataRow的值：row["列名"]，row[列号]均可引用其中的一个属性DataColumn&nbsp;a=dataTable.Columns("列名";&nbsp;//可以获得一个列对行进行批处理更改：BeginEdit()开始更改，EndEdit()结束更改，同时将更改结果写入DataSet，CancelEdit()，取消更改例如：row.BeginEdit();对row进行更改row.EndEdit();将数据批量加载到DataTabledataTable.BeginLoadData();dataTable.LoadDataRow(row1,false);&nbsp;//第二个参数为true时，调用dataTable.AcceptChanges()时接受更改，为false直接添加……dataTable.EndLoadData();使用这种数据加载方式可以在数据加载期间屏蔽所有的数据约束，索引也不会予以维护，极大的加快了数据加载速度行的版本：current：当前值default：根据操作的不同决定行的default值original：最后一次调用AcceptChanges()之后的值proposed：调用AcceptChanges()之前被更改的值例如要获得行的original值：String&nbsp;oldString=row("FirstName",DataRowVersion.original]]></description>
		<author><![CDATA[海上土拨鼠]]></author>
		<pubDate>2006-04-11 09:56:00</pubDate>
		</item>
		</channel>
</rss>