扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:冷枫 来源:CSDN 2007年9月24日
关键字:
在本页阅读全文(共2页)
像所有读取器类一样,OdbcDataReader 是密封的,并且是不可继承的。访问列值的类的方法自动强制它们返回的数据的类型采用最初从该列检索到的数据的类型。从某个给定列第一次读取一个单元格时使用的类型将用于同一列的所有其他单元格。也就是说,您不能从同一列中接连将数据作为字符串和长整型读取。
当命令对象的 CommandType 属性设置为 StoredProcedure 时,CommandText 属性必须使用过程的标准 ODBC 转义序列进行设置。与其他提供程序不同的是,对于 ODBC.NET 提供程序,仅仅使用过程的简单名称是不够的。下面的模式说明了通过 ODBC 驱动程序调用存储过程的典型方法。
{ call storedproc_name(?, ..., ?) }
字符串必须用 {...} 括起来,并且将关键字调用放在实际名称和参数列表之前。
成熟的 .NET 数据提供程序提供继承了 IDbDataAdapter 和 DbDataAdapter 的数据适配器类。类 DbDataAdapter 实现了用于关系数据库的数据适配器。不过,在其他情况下,您需要的是实现 IDataAdapter 接口并将某些断开连接的数据复制到内存中的可编程缓冲区(如数据集)的类。实际上,在大多数情况下,实现 IDataAdapter 接口的 Fill 方法对于通过数据集对象返回断开连接的数据已经足够了。
DataAdapter 对象的典型构造函数是:
XxxDataAdapter(SqlCommand selectCommand) XxxDataAdapter(String selectCommandText, String selectConnectionString) XxxDataAdapter(String selectCommandText, SqlConnection selectConnection)
从 DbDataAdapter 继承的类必须实现所有成员,如果使用特定于提供程序的功能,还必须定义额外的成员。最后,必须实现下面的方法:
Fill(DataSet ds)FillSchema(DataSet ds, SchemaType st)Update(DataSet ds)GetFillParameters()
需要的属性包括:
• |
TableMappings(默认为空集合) |
• |
MissingSchemaAction(默认为 Add) |
• |
MissingMappingAction(默认为 Passthrough) |
您可以根据需要提供 “填充” 方法的任意数目的实现。
表映射控制着源表(即数据库表)映射到父数据集中的数据表对象时采用的方式。映射考虑表名及列名和属性。而架构映射则考虑开始将新数据添加到现有数据集时处理列和表的方式。缺少的映射属性的默认值要求适配器创建像源表一样的内存中的表。缺少的架构属性的默认值处理实际填充数据表对象时可能产生的问题。如果目标数据集中缺少任何映射的元素(表和列),则 MissingSchemaAction 的值会建议采取什么措施。在某种意义上,这两个 MissingXXX 属性是一种异常处理程序。值 Add 强制适配器添加经证明缺少的任何表或列。除非为属性分配另一个 (AddWithKey) 值,否则,不添加任何关键信息。
当应用程序调用 “更新” 方法时,该类检查数据集中每一行的 RowState 属性,然后执行所要求的 INSERT、UPDATE 或 DELETE 语句。如果该类不提供 UpdateCommand、InsertCommand 或 DeleteCommand 属性,但实现 IDbDataAdapter,那么您可以尝试即时生成命令或产生一个异常。您还可以提供自定义的命令生成器类来帮助进行命令生成。
ODBC 提供程序提供 OdbcCommandBuilder 类作为自动生成单表命令的方法。OLE DB 提供程序和 SQL Server 提供程序提供了相似的类。如果您需要更新交叉引用的表,那么您可能要使用存储过程或即席 SQL 批处理。在这种情况下,只需覆盖 InsertCommand、UpdateCommand 和 DeleteCommand 属性,使它们运行您指定的命令对象。
.NET 数据提供程序提供的功能可分为两个主要类别:
• |
支持断开连接的数据集对象 |
• |
支持连接的数据访问,包括连接、事务处理、命令和参数 |
.NET 中的数据提供程序通过 IDataAdapter 接口的实现来支持数据集对象。还可以通过实现 IDataParameter 接口支持参数化的查询。如果您无法负担断开连接的数据,可通过 IDataReader 接口使用 .NET 数据读取器。
Visual Studio® .NET 有一个很好的功能,即,您可以为数据适配器即将生成的所有表分配一个一致的名称。在任何 .NET 应用程序中配置了数据适配器对象之后,该对话框显示要创建的表的标准名称:Table、Table1、Table2 等等。对于其中的每个名称,您都可以在后来一次性指定为更形象的名称。我们是否可以通过某种方法以编程方式达到此目的呢?
Visual Studio .NET 是一个出色的产品,但它的使用需要一些技巧。上述问题的回答是 — 我们的确可以通过某种方法用编程方式来实现该目的,顺便提一句,Visual Studio 在后台也使用了同样的代码。
DataAdapter 对象有一个名为 TableMappings 的集合,其元素是 DataTableMapping 类型的对象。概括地说,表映射是什么?表映射是源表和适配器即将创建的相应数据表对象之间设置的动态关联。如果尚未设置任何映射,则适配器使用与源表相同的结构创建数据表对象,名称除外。名称是通过调用 “填充” 方法或字 “表” 指定的字符串。从多个结果集产生的额外的表在第一个表之后命名。因此,默认情况下,它们的名称分别是 Table1、Table2 等等。可是,如果数据适配器的填充如下面的代码所示,则额外的表分别命名为 Employees1、Employees2 等等。
myDataAdapter.Fill(myDataSet, "Employees");
在配置数据适配器时,Visual Studio 所做的是,为您以可视方式创建的每一个关联都创建一个 DataTableMapping 对象。下面的代码行显示了如何以编程方式为如上所述填充的数据集的前两个表分配有意义的具体名称。
myDataAdapter.TableMappings.Add("Employees", "FirstTable");myDataAdapter.TableMappings.Add("Employees1", "SecondTable");
第三个表(如果有)可以通过 Table2 访问。
虽然这是命名从多个结果集产生的数据表对象的最佳方法,但您也可以使用以下同样有效的代码:
myDataAdapter.Fill(myDataSet, "Employees");myDataSet.Tables["Employees1"].TableName = "SecondTable";
您还可以通过索引访问该表:
myDataSet.Tables[1].TableName = "SecondTable";
Dino Esposito 供职于 Wintellect,他承担了 ADO.NET 和 ASP.NET 方面的培训和咨询工作。他是 VB-2-The-Max 的创始人之一,并向 MSDN Magazine 的 Cutting Edge 专栏投稿。如果希望与 Dino 联系,可发送电子邮件至 dinoe@wintellect.com。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=356374
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。