目录
当前位置: 首页 > 文档资料 > MySQL 中文手册 >

26.2. MySQL Connector/NET

优质
小牛编辑
133浏览
2023-12-01
26.2.1. 前言
26.2.2. 下载并安装MySQL Connector/NET
26.2.3. Connector/NET体系结构
26.2.4. 使用MySQL Connector/NET
26.2.5. MySQL Connector/NET变更史

26.2.1. 前言

使用MySQL Connector/NET,开发人员能够方便地创建需要安全和高性能数据连接(与MySQL)的.NET应用程序。它实施了所需的ADO.NET接口,并将其集成到了ADO.NET aware工具中。开发人员能够使用他们选择的.NET语言创建应用程序。MySQL Connector/NET是用100%纯C#语言编写的可完全管理的ADO.NET驱动程序。

MySQL Connector/NET包括对下述事宜的完整支持:

·MySQL 5.0特性(存储程序等)。

·MySQL 4.1特性(服务器端的精制语句、Unicode、以及共享内存访问等)。

·大信息包支持,可发送和接收高达2GB的行和BLOB。

·协议压缩,允许压缩客户端和服务器之间的数据流。

·支持使用CP/IP套接字、命名管道、以及Windows共享内存的连接。

·支持使用CP/IP套接字、或Unix套接字的连接。

·支持由Novell开发的开放源码Mono框架。

·可完全管理,不利用MySQL客户端库。

MySQL Connector/NET的开发人员高度尊重用户在软件开发过程中提供的帮助。如果你发现MySQL Connector/NET缺少对你来说很重要的某些特性,或者如果你发现了缺陷,请使用我们的MySQL缺陷系统请求该特性或通报问题。

通过http://forums.mysql.com上的论坛以及http://lists.mysql.com上的邮件列表,可找到针对MySQL Connector/NET的社区支持信息。MySQL AB公司提供付费支持,更多信息请参见http://www.mysql.com/support/。

本文档的目的是作为MySQL Connector/NET的用户指南,而不是语法参考。如果你打算了解详细的语法信息,请阅读MySQL Connector/NET分发版中提供的Documentation.chm文件。

26.2.2. 下载并安装MySQL Connector/NET

MySQL Connector/NET能够运行在任何支持.NET框架的平台上。.NET框架主要被最近的Microsoft Windows版本支持,通过由Novell开发的Mono框架,在Linux上也支持它(请参见http://www.mono-project.com)。

MySQL Connector/NET可通过使用Windows Installer (.msi)安装软件包进行安装,使用该软件包,可在任何Windows操作系统上安装MySQL Connector/NET。MSI软件包包含在名为mysql-connector-net-version.zip的压缩文件中,其中,“version”(版本)指明了MySQL Connector/NET的版本。

可从下述网站下载MySQL Connector/NET:http://dev.mysql.com/downloads/connector/net/1.0.html。

随着Windows XP的发布,Windows Installer(安装器)引擎也予以了更新,对于使用旧版本的用户,可参阅该Microsoft知识库文章以了解升级至最新版本的更多信息。

要想安装MySQL Connector/NET,请右击MSI文件并选择“安装”。在安装器提示你完成安装参数选择后,安装将自动开始。对于大多数用户,建议采用典型安装。

如果在运行安装器时遇到问题,可下载不带安装器的ZIP文件。该文件名为mysql-connector-net-version-noinstall.zip。使用ZIP程序,将其解压至你所选择的目录。

除非作了其他选择,否则MySQL Connector/NET将被安装到“C:\Program Files\MySQL\MySQL Connector Net X.X.X”,其中,“X.X.X”是你所安装的MySQL Connector/NET的版本号。新安装不会覆盖已有的MySQL Connector/NET版本。

26.2.3. Connector/NET体系结构

26.2.3.1. MySqlCommand类
26.2.3.2. MySqlCommandBuilder类
26.2.3.3. MySqlConnection类
26.2.3.4. MySqlDataAdapter类
26.2.3.5. MySqlDataReader类
26.2.3.6. MySqlException类
26.2.3.7. MySqlHelper类
26.2.3.8. MySqlTransaction类
MySQL Connector/NET包含数个类,这些类可用于连接到数据库,执行查询和语句,并管理查询结果。

下面介绍了MySQL Connector/NET的主要类:

·MySqlCommand:代表对MySQL数据库进行执行操作的SQL语句。

·MySqlCommandBuilder:自动生成单个表的命令,用于协调对DataSet所作的更改和相关的MySQL数据库。

·MySqlConnection:代表与MySQL服务器数据库的开放式连接。

·MySqlDataAdapter:代表一组数据命令和数据库连接,用于填充数据库和更新MySQL数据库。

·MySqlDataReader:提供了从MySQL数据库读取行的“仅正向”流的一种方式。

·MySqlException:当MySQL返回错误时抛出的异常。

·MySqlHelper:助手类,能使工作变的更简单。

·MySqlTransaction:代表将在MySQL数据库中进行的SQL事务。

在后续段落中,将分别介绍这些对象。这些章节的目的是概要介绍MySQL Connector/NET的主要类,而不是语法参考。如果你打算了解详细的语法信息,请阅读MySQL Connector/NET分发版中提供的Documentation.chm文件。

26.2.3.1. MySqlCommand类

26.2.3.1.1. 属性
26.2.3.1.2. 方法
26.2.3.1.3. 用法

MySqlCommand类代表对MySQL数据库进行执行操作的SQL语句。

注释:在以前的版本中,采用符号“@”来标识SQL中的参数。它与MySQL用户变量不兼容,因此,现采用符号“?”来定位SQL中的参数。为了支持早期代码,也可以在连接字符串中设置“old syntax=yes”。如果进行了这类设置,请注意,如果无法定义希望在SQL中使用的参数(定义失败),不会给出异常提示。

26.2.3.1.1. 属性
可用属性如下:

·CommandText:获取或设置将在数据源上执行的SQL语句。

·CommandTimeout:获取或设置中止执行命令并生成错误之前应等待的时间。

·CommandType:获取或设置值,该值指明了解释CommandText的方式。可能的值包括StoredProcedure、TableDirect和Text。

·Connection:获取或设置该MySqlCommand实例使用的MySqlConnection。

·IsPrepared:如果该命令已准备好,为“真”,否则为“假”。

·Parameters:获取MySqlParameterCollection。

·Transaction:获取或设置MySqlTransaction,MySqlCommand将在其中执行。

·UpdatedRowSource:当DbDataAdapter的Update方法使用它时,用于获取或设置命令结果作用在DataRow上的方式。

26.2.3.1.2. 方法
可用方法如下:

·Cancel:尝试取消MySqlCommand的执行。不支持该操作。

·Clone:创建该MySqlCommand对象的克隆对象。包括CommandText、Connection和Transaction属性,以及整个参数列表。

·CreateParameter:创建MySqlParameter对象的新实例。

·Dispose:处理该MySqlCommand实例。

·ExecuteNonQuery:根据连接情况执行SQL语句,并返回受影响的行数。

·ExecuteReader:将CommandText发送给Connection,并创建MySqlDataReader。

·ExecuteScalar:执行查询,并返回查询操作所返回的结果集中第1行的第1列。多余的列或行将被忽略。

·Prepare:在MySQL服务器的1个实例上创建命令的预制版本。

26.2.3.1.3. 用法
26.2.3.1.3.1. VB.NET
26.2.3.1.3.2. C#
在下面的示例中,创建了1个MySqlCommand和1个MySqlConnection。打开了MySqlConnection,并将其设置为用于MySqlCommand的连接。随后,调用ExecuteNonQuery,并关闭连接。为了完成该任务,为ExecuteNonQuery传递了1个连接字符串和1个查询字符串(查询字符串是1条SQL INSERT语句)。
26.2.3.1.3.1. VB.NET

在下例中,介绍了在VB.NET中使用MySqlCommand类的方法:

Public Sub InsertRow(myConnectionString As String)    ' If the connection string is null, use a default.    If myConnectionString = "" ThenmyConnectionString = "Database=Test;Data Source=localhost;User Id=username;Password=pass"    End If    Dim myConnection As New MySqlConnection(myConnectionString)    Dim myInsertQuery As String = "INSERT INTO Orders (id, customerId, amount) Values(1001, 23, 30.66)"    Dim myCommand As New MySqlCommand(myInsertQuery)    myCommand.Connection = myConnection    myConnection.Open()    myCommand.ExecuteNonQuery()    myCommand.Connection.Close()End Sub
26.2.3.1.3.2. C#

在下例中,介绍了在C#中使用MySqlCommand类的方法:

public void InsertRow(string myConnectionString) {    // If the connection string is null, use a default.    if(myConnectionString == "")     {myConnectionString = "Database=Test;Data Source=localhost;User Id=username;Password=pass";    }    MySqlConnection myConnection = new MySqlConnection(myConnectionString);    string myInsertQuery = "INSERT INTO Orders (id, customerId, amount) Values(1001, 23, 30.66)";    MySqlCommand myCommand = new MySqlCommand(myInsertQuery);    myCommand.Connection = myConnection;    myConnection.Open();    myCommand.ExecuteNonQuery();    myCommand.Connection.Close();}

26.2.3.2. MySqlCommandBuilder类

26.2.3.2.1. 属性
26.2.3.2.2. 方法
26.2.3.2.3. 用法

MySqlDataAdapter不会自动生成所需的SQL语句(用于协调对DataSet所作的更改和相关的MySQL实例)。但是,如果设置了MySqlDataAdapter的SelectCommand属性,可以创建MySqlCommandBuilder对象来自动生成针对单个表更新的SQL语句。随后,MySqlCommandBuilder将生成你未设置的任何附加的SQL语句。

一旦你设置了DataAdapter属性,MySqlCommandBuilder会将自己注册为针对OnRowUpdating事件的监听程序。一次只能将1个MySqlDataAdapter或MySqlCommandBuilder对象关联起来。

为了生成INSERT、UPDATE或DELETE语句,MySqlCommandBuilder使用了SelectCommand属性来自动检索所需的元数据集合。如果在检索完元数据后更改了SelectCommand(例如首次更新后),应调用RefreshSchema方法来更新元数据。

SelectCommand也必须返回至少1个主键或唯一列。如果未显示任何返回信息,将生成InvalidOperation异常,而且不会生成命令。

MySqlCommandBuilder还会使用SelectCommand引用的Connection、CommandTimeout和Transaction属性。如果更改了这些属性中的任何1个,或者,如果替换了SelectCommand本身,用户应调用RefreshSchema。如不然,InsertCommand、UpdateCommand和DeleteCommand属性将保持它们以前的值。

如果调用了Dispose,MySqlCommandBuilder将解除与MySqlDataAdapter的关联,已生成的命令将不再使用。

26.2.3.2.1. 属性

可用属性如下:

·DataAdapter:MySqlCommandBuilder将自己注册为针对RowUpdating事件的监听程序,RowUpdating事件是由在该属性中指定的MySqlDataAdapter生成的。创建了新的MySqlCommandBuilder实例时,将释放任何已有的与MySqlDataAdapter关联的MySqlCommandBuilder。

·QuotePrefix,QuoteSuffix:MySQL中的数据库对象能够包含特殊字符,如空格等,这会使得正常的SQL字符串无法解析。使用QuotePrefix和QuoteSuffix属性,MySqlCommandBuilder能够创建处理该问题的SQL命令。

26.2.3.2.2. 方法

可用方法如下:

·DeriveParameters:从MySqlCommand指定的存储程序中检索参数信息,并填充所指定MySqlCommand对象的参数集。目前不支持该方法,这是因为MySQL中未提供存储程序。

·GetDeleteCommand:获取用于在数据库上执行删除操作所需的、自动生成的MySqlCommand对象。

·GetInsertCommand:获取用于在数据库上执行插入操作所需的、自动生成的MySqlCommand对象。

·GetUpdateCommand:获取用于在数据库上执行更新操作所需的、自动生成的MySqlCommand对象。

·RefreshSchema:刷新用于生成INSERT、UPDATE或DELETE语句的数据库方案信息。

26.2.3.2.3. 用法
26.2.3.2.3.1. VB.NET
26.2.3.2.3.2. C#
在下面给出的示例中,使用了MySqlCommand、MySqlDataAdapter和MySqlConnection,用于从数据源选择行。为该示例传递了1个初始化的DataSet、1个连接字符串、1个查询字符串(是SQL SELECT语句)、以及1个作为数据库表名称的字符串。随后,该示例创建了1个MySqlCommandBuilder。
26.2.3.2.3.1. VB.NET

在下例中,介绍了在VB.NET中使用MySqlCommandBuilder类的方法:

  Public Shared Function SelectRows(myConnection As String, mySelectQuery As String, myTableName As String) As DataSetDim myConn As New MySqlConnection(myConnection)Dim myDataAdapter As New MySqlDataAdapter()myDataAdapter.SelectCommand = New MySqlCommand(mySelectQuery, myConn)Dim cb As SqlCommandBuilder = New MySqlCommandBuilder(myDataAdapter)myConn.Open()Dim ds As DataSet = New DataSetmyDataAdapter.Fill(ds, myTableName)' Code to modify data in DataSet here ' Without the MySqlCommandBuilder this line would fail.myDataAdapter.Update(ds, myTableName)myConn.Close()    End Function 'SelectRows    
26.2.3.2.3.2. C#

在下例中,介绍了在C#中使用MySqlCommandBuilder类的方法:

    public static DataSet SelectRows(string myConnection, string mySelectQuery, string myTableName)    {      MySqlConnection myConn = new MySqlConnection(myConnection);      MySqlDataAdapter myDataAdapter = new MySqlDataAdapter();      myDataAdapter.SelectCommand = new MySqlCommand(mySelectQuery, myConn);      MySqlCommandBuilder cb = new MySqlCommandBuilder(myDataAdapter);      myConn.Open();      DataSet ds = new DataSet();      myDataAdapter.Fill(ds, myTableName);      //code to modify data in DataSet here      //Without the MySqlCommandBuilder this line would fail      myDataAdapter.Update(ds, myTableName);      myConn.Close();      return ds;    }      

26.2.3.3. MySqlConnection类

26.2.3.3.1. 属性
26.2.3.3.2. 方法
26.2.3.3.3. 用法

MySqlConnection对象代表与MySQL服务器数据源的会话。创建MySqlConnection实例时,所有属性均将被设置为它们的初始值。关于这些值的列表,请参见MySqlConnection构造函数。

如果MySqlConnection超出范围,不会被关闭。因此,必须通过调用Close或Dispose明确地关闭连接。

26.2.3.3.1. 属性
可用属性如下:

·ConnectionString:设置或获取用于连接至MySQL服务器数据库的字符串。

·ConnectionTimeout:获取在中止尝试并生成错误之前为建立连接所需的等待时间。

·Database:获取当前数据库的名称或打开连接后将使用的数据库的名称。

·DataSource:获取将要连接的MySQL服务器的名称。

·ServerThread:返回该连接所使用的服务器线程的ID。

·ServerVersion:获取包含客户端与之相连的MySQL服务器版本的字符串。

·State:获取连接的当前连接的状态。

·UseConnection:与服务器进行通信时,指明该连接是否将使用压缩特性。

26.2.3.3.2. 方法
可用方法如下:

·BeginTransaction:开始数据库事务。

·ChangeDatabase:针对打开的MySqlConnection,更改当前数据库。

·Close:关闭与数据库的连接。这是关闭任何打开连接的首选方法。

·CreateCommand:创建并返回与MySqlConnection相关的MySqlCommand对象。

·Dispose:释放MySqlConnection使用的资源。

·Open:用ConnectionString指定的属性设置打开数据库连接。

·Ping:对MySQL服务器执行Ping操作。

26.2.3.3.3. 用法
26.2.3.3.3.1. VB.NET
26.2.3.3.3.2. C#
在下面的示例中,创建了1个MySqlCommand和1个MySqlConnection。打开了MySqlConnection,并将其设置为用于MySqlCommand的连接。随后,调用ExecuteNonQuery,并关闭连接。为了完成该任务,为ExecuteNonQuery传递了1个连接字符串和1个查询字符串(查询字符串是1条SQL INSERT语句)。
26.2.3.3.3.1. VB.NET

在下例中,介绍了在VB.NET中使用MySqlConnection类的方法:

Public Sub InsertRow(myConnectionString As String)    ' If the connection string is null, use a default.    If myConnectionString = "" ThenmyConnectionString = "Database=Test;Data Source=localhost;User Id=username;Password=pass"    End If    Dim myConnection As New MySqlConnection(myConnectionString)    Dim myInsertQuery As String = "INSERT INTO Orders (id, customerId, amount) Values(1001, 23, 30.66)"    Dim myCommand As New MySqlCommand(myInsertQuery)    myCommand.Connection = myConnection    myConnection.Open()    myCommand.ExecuteNonQuery()    myCommand.Connection.Close()End Sub      
26.2.3.3.3.2. C#

在下例中,介绍了在C#中使用MySqlConnection类的方法:

public void InsertRow(string myConnectionString) {    // If the connection string is null, use a default.    if(myConnectionString == "")     {myConnectionString = "Database=Test;Data Source=localhost;User Id=username;Password=pass";    }    MySqlConnection myConnection = new MySqlConnection(myConnectionString);    string myInsertQuery = "INSERT INTO Orders (id, customerId, amount) Values(1001, 23, 30.66)";    MySqlCommand myCommand = new MySqlCommand(myInsertQuery);    myCommand.Connection = myConnection;    myConnection.Open();    myCommand.ExecuteNonQuery();    myCommand.Connection.Close();}      

26.2.3.4. MySqlDataAdapter类

26.2.3.4.1. 属性
26.2.3.4.2. 方法
26.2.3.4.3. 用法
MySQLDataAdapter起着DataSet和MySQL之间桥梁的作用,用于检索和保存数据。MySQLDataAdapter通过映射Fill(填充)和Update(更新)提供了该桥,Fill能改变DataSet中的数据以便与数据源中的数据匹配,Update能改变数据源中的数据以便与DataSet中的数据匹配(通过对数据源使用恰当的SQL语句)。

当MySQLDataAdapter填充DataSet时,如果表或列不存在,它将为返回的数据创建必要的表和列。但是,在隐式创建的方案中不包括主键信息,除非将MissingSchemaAction属性设为AddWithKey。在使用FillSchema用数据填充它之前,也能让MySQLDataAdapter创建DataSet方案,包含主键信息。

MySQLDataAdapter用于MySqlConnection和MySqlCommand的连接,用以提升连接至MySQL数据库时的性能。

MySQLDataAdapter还包括SelectCommand、InsertCommand、DeleteCommand、UpdateCommand和TableMappings属性,用于简化数据的加载和更新操作。

26.2.3.4.1. 属性

可用属性如下:

·AcceptChangesDuringFill:获取或设置值,该值指明了在任何填充操作过程中,在将DataRow添加到DataTable后,是否要在DataRow上调用AcceptChanges。

·ContinueUpdateOnError:获取或设置值,该值指定了在行更新过程中出现错误时是否要生成异常项。

·DeleteCommand:获取或设置用于将记录从数据集中删除的SQL语句或存储程序。

·InsertCommand:获取或设置用于在数据集中插入记录的SQL语句或存储程序。

·MissingMappingAction:确定当进入的数据不含匹配表或列时需要采取的动作。

·MissingSchemaAction:确定当已有的DataSet方案与进入数据不匹配时需要采取的动作。

·SelectCommand:获取或设置用于在数据源中选择记录的SQL语句或存储程序。

·TableMappings:获取提供了源表和DataTable之间主映射的集合。

·UpdateCommand:获取或设置用于在数据源中更新记录的SQL语句或存储程序。

26.2.3.4.2. 方法
可用方法如下:

·Fill:使用DataSet名称添加或刷新DataSet中的行,以便与数据源中的行匹配,并创建名为“Table”的DataTable。

·FillSchema:将名为“Table”的DataTable添加到指定的DataSet,并配置方案,以便与基于指定SchemaType的数据源中的表匹配。

·GetFillParameters:执行SQL SELECT语句时,按用户获取参数集。

·Update:为指定DataSet中的各插入行、更新行或删除行分别调用INSERT、UPDATE或DELETE语句。

26.2.3.4.3. 用法
26.2.3.4.3.1. VB.NET
26.2.3.4.3.2. C#
在下面的示例中,创建了1个MySqlCommand和1个MySqlConnection。打开MySqlConnection,并将其设置为用于MySqlCommand的连接。随后,调用ExecuteNonQuery,并关闭连接。为了完成该任务,为ExecuteNonQuery传递了1个连接字符串和1个查询字符串(查询字符串是1条SQL INSERT语句)。
26.2.3.4.3.1. VB.NET

在下例中,介绍了在VB.NET中使用MySqlDataAdapter类的方法:

Public Function SelectRows(dataSet As DataSet, connection As String, query As String) As DataSet    Dim conn As New MySqlConnection(connection)    Dim adapter As New MySqlDataAdapter()    adapter.SelectCommand = new MySqlCommand(query, conn)    adapter.Fill(dataset)    Return datasetEnd Function 
26.2.3.4.3.2. C#

在下例中,介绍了在C#中使用MySqlDataAdapter类的方法:

public DataSet SelectRows(DataSet dataset,string connection,string query) {    MySqlConnection conn = new MySqlConnection(connection);    MySqlDataAdapter adapter = new MySqlDataAdapter();    adapter.SelectCommand = new MySqlCommand(query, conn);    adapter.Fill(dataset);    return dataset;}     

26.2.3.5. MySqlDataReader类

26.2.3.5.1. 属性
26.2.3.5.2. 方法
26.2.3.5.3. 用法
MySqlDataReader类提供了从MySQL数据库读取行的“仅正向”流的一种方式。

要想创建MySQLDataReader,必须调用MySqlCommand对象的ExecuteReader方法,而不是直接使用构造函数。

使用MySqlDataReader的同时,相关的MySqlConnection将忙于MySqlDataReader。除了关闭它之外,不能在MySqlConnection上执行任何操作。该情况将一直持续到调用了MySqlDataReader的“Close”方法为止。

关闭了MySqlDataReader后,你只能调用IsClosed和RecordsAffected属性。尽管在MySqlDataReader存在同时能够访问RecordsAffected属性,但在返回RecordsAffected的值之前总应调用“Close”,以确保准确的返回值。

为了获得最佳性能,MySqlDataReader将避免创建不必要的对象或执行不必要的数据拷贝。其结果是,对诸如GetValue等方法的多个调用会返回对相同对象的引用。如果你准备更改由诸如GetValue等方法返回的对象的基本值,请仔细小心。

26.2.3.5.1. 属性
可用属性如下:

·Depth:获取指明当前行嵌套深度的值。目前并不支持方法,总会返回0。

·FieldCount:获取当前行中的列数。

·HasRows:获取值,该值指明了MySqlDataReader是否包含1行或多行。

·IsClosed:获取值,该值指明了和苏剧阅读器是否已关闭。

·Item:以固有格式获取列的值。在C#,该属性是MySqlDataReader类的索引属性。

·RecordsAffected:获取隐执行SQL语句而更改、插入、或删除的行数。

26.2.3.5.2. 方法
可用方法如下:

·Close:关闭MySqlDataReader对象。

·GetBoolean:获取指定列的布尔值。

·GetByte:以字节形式获取指定列的值。

·GetBytes:读取从指定列偏移至缓冲的字节流,数组从给定的缓冲偏移位置开始。

·GetChar:以单字符形式获取指定列的值。

·GetChars:读取从指定列偏移至缓冲的字符流,数组从给定的缓冲偏移位置开始。

·GetDataTypeName:获取源数据类型的名称。

·GetDateTime:以DateTime对象形式获取指定列的值。

·GetDecimal:以DateTime对象形式获取指定列的值。

·GetDouble:以双精度浮点数的形式获取指定列的值。

·GetFieldType:获取作为对象数据类型的类型。

·GetFloat:以单精度浮点数的形式获取指定列的值。

·GetGuid:以GUID的形式获取指定列的值。

·GetInt16:以16位带符号整数的形式获取指定列的值。

·GetInt32:以32位带符号整数的形式获取指定列的值。

·GetInt64:以64位带符号整数的形式获取指定列的值。

·GetMySqlDateTime:以MySqlDateTime对象的形式获取指定列的值。

·GetName:获取指定列的名称。

·GetOrdinal:给定列名,获取列的顺序。

·GetSchemaTable:返回描述了MySqlDataReader的列元数据的DataTable。

·GetString:以String对象的形式获取指定列的值。

·GetTimeSpan:以TimeSpan对象的形式获取指定列的值。

·GetUInt16:以16位无符号整数的形式获取指定列的值。

·GetUInt32:以32位无符号整数的形式获取指定列的值。

·GetUInt64:以64位无符号整数的形式获取指定列的值。

·GetValue:以固有格式获取指定列的值。

·GetValues:获取当前行集合中的所有属性列。

·IsDBNull:获取值,该值指明了列中是否包含不存在或丢失的值。

·NextResult:读取批SQL语句的结果时,使数据阅读器跳到下一个结果。

·Read:使MySqlDataReader跳到下一条记录。

26.2.3.5.3. 用法
26.2.3.5.3.1. VB.NET
26.2.3.5.3.2. C#
在下面的示例中,创建了1个MySqlConnection,1个MySqlCommand和1个MySqlDataReader。该示例读取数据,并将数据输出到控制台。最后,本例关闭了MySqlDataReader,然后关闭了MySqlConnection。
26.2.3.5.3.1. VB.NET

在下例中,介绍了在VB.NET中使用MySqlDataReader类的方法:

Public Sub ReadMyData(myConnString As String)    Dim mySelectQuery As String = "SELECT OrderID, CustomerID FROM Orders"    Dim myConnection As New MySqlConnection(myConnString)    Dim myCommand As New MySqlCommand(mySelectQuery, myConnection)    myConnection.Open()    Dim myReader As MySqlDataReader    myReader = myCommand.ExecuteReader()    ' Always call Read before accessing data.    While myReader.Read()Console.WriteLine((myReader.GetInt32(0) & ", " & myReader.GetString(1)))    End While    ' always call Close when done reading.    myReader.Close()    ' Close the connection when done with it.    myConnection.Close()End Sub 'ReadMyData     
26.2.3.5.3.2. C#

在下例中,介绍了在C#中使用MySqlDataReader类的方法:

public void ReadMyData(string myConnString) {    string mySelectQuery = "SELECT OrderID, CustomerID FROM Orders";    MySqlConnection myConnection = new MySqlConnection(myConnString);    MySqlCommand myCommand = new MySqlCommand(mySelectQuery,myConnection);    myConnection.Open();    MySqlDataReader myReader;    myReader = myCommand.ExecuteReader();    // Always call Read before accessing data.    while (myReader.Read()) {       Console.WriteLine(myReader.GetInt32(0) + ", " + myReader.GetString(1));    }    // always call Close when done reading.    myReader.Close();    // Close the connection when done with it.    myConnection.Close(); }   

26.2.3.6. MySqlException类

26.2.3.6.1. 属性
26.2.3.6.2. 方法
26.2.3.6.3. 用法
当MySql数据提供方遇到服务器生成的错误时将创建该类。

抛出异常时,打开的连接不会自动关闭。如果客户端应用程序判定该异常是致命的,应关闭任何打开的MySqlDataReader对象或MySqlConnection对象。

26.2.3.6.1. 属性
可用属性如下:

·HelpLink:获取或设置指向与该异常相关的帮助文件的链接。

·InnerException:获取导致当前异常的异常实例。

·IsFatal:如果该异常是致命的,为“真”,并关闭连接,如果不是致命的,为“假”。

·Message:获取描述当前异常的消息。

·Number:获取指明错误类型的编号。

·Source:获取或设置导致错误的应用程序或对象的名称。

·StackTrace:获取抛出当前异常时在调用堆栈上帧的字符串表征。

·TargetSite:获取抛出当前异常的方法。

26.2.3.6.2. 方法
MySqlException类没有相应的方法。
26.2.3.6.3. 用法
26.2.3.6.3.1. VB.NET
26.2.3.6.3.2. C#
在下述示例中,因丢失了服务器而生成了MySqlException,然后显示异常。
26.2.3.6.3.1. VB.NET

该示例介绍在VB.NET下使用MySqlException类的方法。

Public Sub ShowException()     Dim mySelectQuery As String = "SELECT column1 FROM table1"     Dim myConnection As New MySqlConnection ("Data Source=localhost;Database=Sample;")     Dim myCommand As New MySqlCommand(mySelectQuery, myConnection)     Try myCommand.Connection.Open()     Catch e As MySqlExceptionMessageBox.Show( e.Message )     End Try End Sub     
26.2.3.6.3.2. C#

该示例介绍在C#下使用MySqlException类的方法。

public void ShowException() {   string mySelectQuery = "SELECT column1 FROM table1";   MySqlConnection myConnection =      new MySqlConnection("Data Source=localhost;Database=Sample;");   MySqlCommand myCommand = new MySqlCommand(mySelectQuery,myConnection);   try    {      myCommand.Connection.Open();   }   catch (MySqlException e)    {MessageBox.Show( e.Message );   }}    

26.2.3.7. MySqlHelper类

26.2.3.7.1. 属性
26.2.3.7.2. 方法
助手类,能使与提供方(Provider)一起进行的工作变的更简单。开发人员可以使用该类提供的方法自动执行共同任务。
26.2.3.7.1. 属性
MySqlHelper类没有相应的属性。
26.2.3.7.2. 方法
可用方法如下:

·ExecuteDataRow:执行单个SQL语句并返回结果集的第1行。在该方法的执行过程中,将创建、打开并关闭1个新的MySqlConnection对象。

·ExecuteDataset:执行单个SQL命令并返回DataSet中的结果集。在该方法的执行过程中,将创建、打开并关闭1个新的MySqlConnection对象。

·ExecuteNonQuery:在MySQL数据库上执行单个命令。调用该方法时,将认为MySqlConnection已打开,方法执行完后,MySqlConnection仍保持打开状态。

·ExecuteReader:Overloaded:在MySQL数据库上执行单个命令。

·ExecuteScalar:在MySQL数据库上执行单个命令。

·UpdateDataSet:用来自给定DataSet的数据更新给定表。

26.2.3.8. MySqlTransaction类

26.2.3.8.1. 属性
26.2.3.8.2. 方法
26.2.3.8.3. 用法
代表将在MySQL数据库中进行的SQL事务。
26.2.3.8.1. 属性
可用属性如下:

·Connection:获取与事务相关的MySqlConnection对象,如果事务不再有效,获取空引用(在Visual Basic中为Nothing)。

·IsolationLevel:为该事务指定IsolationLevel。

26.2.3.8.2. 方法
可用方法如下:

·Commit:提交数据库事务。

·Rollback:从挂起状态回滚事务。

26.2.3.8.3. 用法
26.2.3.8.3.1. VB.NET
26.2.3.8.3.2. C#
在下面的示例中,创建了1个MySqlConnection和1个MySqlTransaction。此外,在示例中还介绍了如何使用BeginTransaction、Commit和Rollback方法。
26.2.3.8.3.1. VB.NET

在下例中,介绍了在VB.NET中使用MySqlTransaction类的方法:

Public Sub RunTransaction(myConnString As String)    Dim myConnection As New MySqlConnection(myConnString)    myConnection.Open()Dim myCommand As MySqlCommand = myConnection.CreateCommand()    Dim myTrans As MySqlTransaction' Start a local transaction    myTrans = myConnection.BeginTransaction()    ' Must assign both transaction object and connection    ' to Command object for a pending local transaction    myCommand.Connection = myConnection    myCommand.Transaction = myTransTry      myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (NULL, 'Description')"      myCommand.ExecuteNonQuery()      myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (NULL, 'Description')"      myCommand.ExecuteNonQuery()      myTrans.Commit()      Console.WriteLine("Both records are written to database.")    Catch e As Exception      TrymyTrans.Rollback()      Catch ex As MySqlExceptionIf Not myTrans.Connection Is Nothing Then  Console.WriteLine("An exception of type " & ex.GetType().ToString() & _    " was encountered while attempting to roll back the transaction.")End If      End Try  Console.WriteLine("An exception of type " & e.GetType().ToString() & _      "was encountered while inserting the data.")      Console.WriteLine("Neither record was written to database.")    Finally      myConnection.Close()    End TryEnd Sub 'RunTransaction     
26.2.3.8.3.2. C#

在下例中,介绍了在C#中使用MySqlTransaction类的方法:

public void RunTransaction(string myConnString)  {    MySqlConnection myConnection = new MySqlConnection(myConnString);    myConnection.Open();    MySqlCommand myCommand = myConnection.CreateCommand();    MySqlTransaction myTrans;    // Start a local transaction    myTrans = myConnection.BeginTransaction();    // Must assign both transaction object and connection    // to Command object for a pending local transaction    myCommand.Connection = myConnection;    myCommand.Transaction = myTrans;    try    {      myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (NULL, 'Description')";      myCommand.ExecuteNonQuery();      myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (NULL, 'Description')";      myCommand.ExecuteNonQuery();      myTrans.Commit();      Console.WriteLine("Both records are written to database.");    }    catch(Exception e)    {      try      {myTrans.Rollback();      }      catch (MySqlException ex)      {if (myTrans.Connection != null){  Console.WriteLine("An exception of type " + ex.GetType() +    " was encountered while attempting to roll back the transaction.");}      }  Console.WriteLine("An exception of type " + e.GetType() +" was encountered while inserting the data.");      Console.WriteLine("Neither record was written to database.");    }    finally     {      myConnection.Close();    }}     

26.2.4. 使用MySQL Connector/NET

26.2.4.1. 前言
26.2.4.2. 使用MySQL Connector/NET连接到MySQL
26.2.4.3. 与预处理语句一起使用MySQL Connector/NET
26.2.4.4. 用MySQL Connector/NET访问存储程序
26.2.4.5. 用Connector/NET处理BLOB数据
26.2.4.6. 与Crystal Reports一起使用MySQL Connector/NET
26.2.4.7. 在MySQL Connector/NET中处理日期和时间信息

26.2.4.1. 前言

在本节中,介绍的Connector/NET的一些常用方式,包括BLOB处理,日期处理,以及与诸如Crystal Reports等常见工具一起使用Connector/NET的方法。

26.2.4.2. 使用MySQL Connector/NET连接到MySQL

26.2.4.2.1. 前言
26.2.4.2.2. 创建连接字符串
26.2.4.2.3. 打开连接
26.2.4.2.4. 处理连接错误
26.2.4.2.1. 前言
.NET应用程序和MySQL服务器之间的所有交互均是通过MySqlConnection对象传送的。在应用程序能够与服务器进行交互之前,必须获取、配置、并打开MySqlConnection对象。

即使在使用MySqlHelper类时,MySqlConnection对象也会被Helper类创建。

在本节中,介绍了使用MySqlConnection对象连接到MySQL的方法。

26.2.4.2.2. 创建连接字符串

MySqlConnection对象是使用连接字符串配置的。1个连接字符串包含服务器键/值对,由分号隔开。每个键/值对由等号连接。

下面给出了1个简单的连接字符串示例:

    Server=127.0.0.1;Uid=root;Pwd=12345;Database=test;
    

在本例中,对MySqlConnection对象进行了配置,使用用户名“root”和密码“12345”与位于127.0.0.1的MySQL服务器相连。所有语句的默认数据库为测试数据库。

典型的选项如下(关于选项的完整清单,请参见API文档):

·Server:将要连接的MySQL实例的名称或网络地址。默认为本地主机。别名包括Host,Data Source,DataSource,Address,Addr和Network Address。

·Uid:连接时使用的MySQL用户账户。别名包括User Id, Username和User name。

·Pwd:MySQL账户的密码。也可以使用别名密码。

·Database:所有语句作用于的默认数据库。默认为mysql。也可以使用别名Initial Catalog。

·Port:MySQL用于监听连接的端口。默认为3306。将该值指定为“-1”将使用命名管道连接。

26.2.4.2.3. 打开连接

一旦创建了连接字符串,可使用它打开与MySQL服务器的连接。

下述代码用于创建MySqlConnection对象,指定连接字符串,并打开连接。

[VB]

Dim conn As New MySql.Data.MySqlClient.MySqlConnectionDim myConnectionString as StringmyConnectionString = "server=127.0.0.1;" _    & "uid=root;" _    & "pwd=12345;" _    & "database=test;"Try  conn.ConnectionString = myConnectionString  conn.Open()Catch ex As MySql.Data.MySqlClient.MySqlException  MessageBox.Show(ex.Message)End Try  

[C#]

MySql.Data.MySqlClient.MySqlConnection conn;string myConnectionString;    myConnectionString = "server=127.0.0.1;uid=root;" +    "pwd=12345;database=test;";  try{    conn = new MySql.Data.MySqlClient.MySqlConnection();    conn.ConnectionString = myConnectionString;    conn.Open();}catch (MySql.Data.MySqlClient.MySqlException ex){    MessageBox.Show(ex.Message);}

你也可以将连接字符串传递给MySqlConnection类的构造函数:

[VB]

Dim myConnectionString as StringmyConnectionString = "server=127.0.0.1;" _      & "uid=root;" _      & "pwd=12345;" _      & "database=test;" Try    Dim conn As New MySql.Data.MySqlClient.MySqlConnection(myConnectionString)    conn.Open()Catch ex As MySql.Data.MySqlClient.MySqlException   MessageBox.Show(ex.Message)End Try  

[C#]

MySql.Data.MySqlClient.MySqlConnection conn;string myConnectionString;myConnectionString = "server=127.0.0.1;uid=root;" +    "pwd=12345;database=test;";try{    conn = new MySql.Data.MySqlClient.MySqlConnection(myConnectionString);    conn.Open();}catch (MySql.Data.MySqlClient.MySqlException ex){    MessageBox.Show(ex.Message);}
一旦打开了连接,其他MySQL Connector/NET类也能使用该连接与MySQL服务器进行通信。
26.2.4.2.4. 处理连接错误

由于与外部服务器的连接不可预测,应为你的.NET应用程序添加错误处理功能,这点很重要。出现连接错误时,MySqlConnection类将返回1个MySqlException对象。该对象有两个在处理错误时十分有用的属性:

·Message:描述当前异常的消息。

·Number:MySQL错误编号。

处理错误时,可根据错误编号了解应用程序的响应。进行连接时最常见的两个错误编号如下:

·0: 无法连接到服务器。

·1045: 无效的用户名和/或密码。

在下面的代码中,介绍了根据实际错误改编应用程序的方法:

[VB]

Dim myConnectionString as StringmyConnectionString = "server=127.0.0.1;" _  & "uid=root;" _  & "pwd=12345;" _  & "database=test;" Try    Dim conn As New MySql.Data.MySqlClient.MySqlConnection(myConnectionString)    conn.Open()Catch ex As MySql.Data.MySqlClient.MySqlException    Select Case ex.NumberCase 0    MessageBox.Show("Cannot connect to server. Contact administrator")Case 1045    MessageBox.Show("Invalid username/password, please try again")    End SelectEnd Try  

[C#]

MySql.Data.MySqlClient.MySqlConnection conn;string myConnectionString;myConnectionString = "server=127.0.0.1;uid=root;" +      "pwd=12345;database=test;";try{    conn = new MySql.Data.MySqlClient.MySqlConnection(myConnectionString);    conn.Open();}    catch (MySql.Data.MySqlClient.MySqlException ex){    switch (ex.Number)    {case 0:    MessageBox.Show("Cannot connect to server.  Contact administrator");case 1045:    MessageBox.Show("Invalid username/password, please try again");    }}  

26.2.4.3. 与预处理语句一起使用MySQL Connector/NET

26.2.4.3.1. 前言
26.2.4.3.2. 在MySQL Connector/NET中准备语句
26.2.4.3.1. 前言
从MySQL 4.1开始,能够与MySQL Connector/NET一起使用预处理语句。使用预处理语句能够现住改善多次执行的查询的性能。

对于多次执行的语句,预处理执行的速度快于直接执行,这是因为只需进行1次解析操作。在直接执行的情况下,每次执行时均将进行解析操作。预处理执行还能降低网络通信量,这是因为对于预处理语句的每次执行,仅需发送用于参数的数据。

预处理语句的另一优点是,它能使用二进制协议,这使得客户端和服务器间的数据传输更有效率。

26.2.4.3.2. 在MySQL Connector/NET中准备语句
为了准备好语句,需创建1个命令对象,并为查询设置.CommandText属性。

输入语句后,调用MySqlCommand对象的.Prepare方法。完成语句的准备后,为查询中的每个元素添加参数。

输入查询并输入参数后,使用.ExecuteNonQuery()、.ExecuteScalar()、或.ExecuteReader方法执行语句。

对于后续的执行操作,仅需更改参数值并再次调用执行方法,无需设置.CommandText属性或重新定义参数。

[VB]

Dim conn As New MySqlConnection
Dim cmd As New MySqlCommand
  
conn.ConnectionString = strConnection
 
Try
   conn.Open()
   cmd.Connection = conn
 
   cmd.CommandText = "INSERT INTO myTable VALUES(NULL, ?number, ?text)"
   cmd.Prepare()
 
   cmd.Parameters.Add("?number", 1)
   cmd.Parameters.Add("?text", "One")
 
   For i = 1 To 1000
       cmd.Parameters("?number").Value = i
       cmd.Parameters("?text").Value = "A string value"
 
       cmd.ExecuteNonQuery()
     Next 
Catch ex As MySqlException
    MessageBox.Show("Error " & ex.Number & " has occurred: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
  

[C#]

MySql.Data.MySqlClient.MySqlConnection conn;
MySql.Data.MySqlClient.MySqlCommand cmd;
  
conn = new MySql.Data.MySqlClient.MySqlConnection();
cmd = new MySql.Data.MySqlClient.MySqlCommand();
 
conn.ConnectionString = strConnection;
 
try
{
    conn.Open();
    cmd.Connection = conn;
 
    cmd.CommandText = "INSERT INTO myTable VALUES(NULL, ?number, ?text)";
    cmd.Prepare();
 
    cmd.Parameters.Add("?number", 1);
    cmd.Parameters.Add("?text", "One");
 
    for (int i=1; i <= 1000; i++)
    {
cmd.Parameters["?number"].Value = i;
cmd.Parameters["?text"].Value = "A string value";
 
cmd.ExecuteNonQuery();
    }
}
catch (MySql.Data.MySqlClient.MySqlException ex)
{
    MessageBox.Show("Error " + ex.Number + " has occurred: " + ex.Message,
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

26.2.4.4. 用MySQL Connector/NET访问存储程序

26.2.4.4.1. 前言
26.2.4.4.2. 从MySQL Connector/NET创建存储程序
26.2.4.4.3. 从MySQL Connector/NET调用存储程序
26.2.4.4.1. 前言

随着MySQL版本5的发布,MySQL服务器目前支持存储程序,它采用了SQL 2003存储程序的语法。

存储程序指的是能够保存在服务器上的一组SQL语句。 一旦完成了该操作,客户端无需再次发出单独语句,而仅需引用存储程序取而代之。

在下述情况下,存储程序尤其有用:

·多个客户端应用程序是采用不同语言编写的或工作在不同平台上,但需执行相同的数据库操作。

·安全性极其重要时。例如,对于所有共同操作,银行采用了存储程序。这样,就能提供一致且安全的环境,而且这类存储程序能够保证每次操作均具有恰当登录。在这类设置下,应用程序和用户无法直接访问数据库表,但能执行特定的存储程序。

MySQL Connector/NET支持通过MySqlCommand对象的存储程序调用。使用MySqlCommand.Parameters集,能够将数据传入和传出MySQL存储程序。

在本节中,未深度介绍创建存储程序方面的信息,要想了解这类信息,请参见MySQL参考手册的存储程序。

在MySQL Connector/NET安装的Samples目录下,可找到1个相应的示例,该示例演示了与MySQL Connector/NET一起使用存储程序的方法。

26.2.4.4.2. 从MySQL Connector/NET创建存储程序

可使用多种工具创建MySQL中的存储程序。首先,可使用mysql命令行客户端创建存储程序。其次,可使用MySQL Query Browser GUI客户端创建存储程序。最后,可使用MySqlCommand对象的.ExecuteNonQuery方法创建存储程序。

[VB]

Dim conn As New MySqlConnectionDim cmd As New MySqlCommandconn.ConnectionString = "server=127.0.0.1;" _    & "uid=root;" _    & "pwd=12345;" _    & "database=test"Try    conn.Open()    cmd.Connection = conn    cmd.CommandText = "CREATE PROCEDURE add_emp(" _& "IN fname VARCHAR(20), IN lname VARCHAR(20), IN bday DATETIME, OUT empno INT) " _& "BEGIN INSERT INTO emp(first_name, last_name, birthdate) " _& "VALUES(fname, lname, DATE(bday)); SET empno = LAST_INSERT_ID(); END"     cmd.ExecuteNonQuery()Catch ex As MySqlException    MessageBox.Show("Error " & ex.Number & " has occurred: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)End Try

[C#]

MySql.Data.MySqlClient.MySqlConnection conn;MySql.Data.MySqlClient.MySqlCommand cmd;conn = new MySql.Data.MySqlClient.MySqlConnection();cmd = new MySql.Data.MySqlClient.MySqlCommand();conn.ConnectionString = "server=127.0.0.1;uid=root;" +    "pwd=12345;database=test;";try{    conn.Open();    cmd.Connection = conn;    cmd.CommandText = "CREATE PROCEDURE add_emp(" +"IN fname VARCHAR(20), IN lname VARCHAR(20), IN bday DATETIME, OUT empno INT) " +"BEGIN INSERT INTO emp(first_name, last_name, birthdate) " +"VALUES(fname, lname, DATE(bday)); SET empno = LAST_INSERT_ID(); END";    cmd.ExecuteNonQuery();}catch (MySql.Data.MySqlClient.MySqlException ex){MessageBox.Show("Error " + ex.Number + " has occurred: " + ex.Message,    "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);}
请注意,不同于命令行和GUI客户端,在MySQL Connector/NET中创建存储程序时不需要指定特殊的定界符。
26.2.4.4.3. 从MySQL Connector/NET调用存储程序

要想使用MySQL Connector/NET来调用存储程序,应创建1个MySqlCommand对象,并将存储程序名作为.CommandText属性传递。将.CommandType属性设置为CommandType.StoredProcedure。

命名了存储程序后,为存储程序中的每个参数创建1个MySqlCommand参数。用参数名和包含值的对象定义IN参数,用参数名和预计将返回的数据类型定义OUT参数。对于所有参数,均需定义参数方向。

定义完参数后,使用MySqlCommand.ExecuteNonQuery()方法调用存储程序。

[VB]

Dim conn As New MySqlConnectionDim cmd As New MySqlCommandconn.ConnectionString = "server=127.0.0.1;" _    & "uid=root;" _    & "pwd=12345;" _    & "database=test"Try    conn.Open()    cmd.Connection = conn    cmd.CommandText = "add_emp"    cmd.CommandType = CommandType.StoredProcedure    cmd.Parameters.Add("?lname", 'Jones')    cmd.Parameters("?lname").Direction = ParameterDirection.Input    cmd.Parameters.Add("?fname", 'Tom')    cmd.Parameters("?fname").Direction = ParameterDirection.Input    cmd.Parameters.Add("?bday", #12/13/1977 2:17:36 PM#)    cmd.Parameters("?bday").Direction = ParameterDirection.Input    cmd.Parameters.Add("?empno", MySqlDbType.Int32)    cmd.Parameters("?empno").Direction = ParameterDirection.Output    cmd.ExecuteNonQuery()    MessageBox.Show(cmd.Parameters("?empno").Value)Catch ex As MySqlException    MessageBox.Show("Error " & ex.Number & " has occurred: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)End Try

[C#]

MySql.Data.MySqlClient.MySqlConnection conn;MySql.Data.MySqlClient.MySqlCommand cmd;conn = new MySql.Data.MySqlClient.MySqlConnection();cmd = new MySql.Data.MySqlClient.MySqlCommand();conn.ConnectionString = "server=127.0.0.1;uid=root;" +    "pwd=12345;database=test;";try{    conn.Open();    cmd.Connection = conn;    cmd.CommandText = "add_emp";    cmd.CommandType = CommandType.StoredProcedure;    cmd.Parameters.Add("?lname", "Jones");    cmd.Parameters("?lname").Direction = ParameterDirection.Input;    cmd.Parameters.Add("?fname", "Tom");    cmd.Parameters("?fname").Direction = ParameterDirection.Input;    cmd.Parameters.Add("?bday", DateTime.Parse("12/13/1977 2:17:36 PM"));    cmd.Parameters("?bday").Direction = ParameterDirection.Input;    cmd.Parameters.Add("?empno", MySqlDbType.Int32);    cmd.Parameters("?empno").Direction = ParameterDirection.Output;    cmd.ExecuteNonQuery();    MessageBox.Show(cmd.Parameters("?empno").Value);}catch (MySql.Data.MySqlClient.MySqlException ex){    MessageBox.Show("Error " + ex.Number + " has occurred: " + ex.Message,      "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);}
一旦调用了存储程序,可使用MySqlConnector.Parameters集的.Value属性检索输出参数的值。

26.2.4.5. 用Connector/NET处理BLOB数据

26.2.4.5.1. 前言
26.2.4.5.2. 准备MySQL服务器
26.2.4.5.3. 将文件写入数据库
26.2.4.5.4. 将BLOB从数据库读取到磁盘上的文件
26.2.4.5.1. 前言
MySQL的1种用途是在BLOB列中保存二进制数据。MySQL支持4种不同的BLOB数据类型:TINYBLOB,BLOB,MEDIUMBLOB和LONGBLOB。

可使用Connector/NET访问保存在BLOB列中的数据,并能使用客户端代码对这类数据进行操作。使用Connector/NET和BLOB数据时,无特殊要求。

在本节中,给出了数个简单的代码示例,在MySQL Connector/NET安装的Samples目录下,可找到1个完整的示例应用程序。

26.2.4.5.2. 准备MySQL服务器
与BLOB数据一起使用MySQL的第1步是配置服务器。首先,让我们从创建要访问的表开始。在我的文件表中,通常有4列:1个具有恰当大小的AUTO_INCREMENT列(UNSIGNED SMALLINT),用于保存识别文件的主键;1个VARCHAR列,用于保存文件名;1个UNSIGNED MEDIUMINT列,用于保存文件的大小;以及1个用于保存文件本身的MEDIUMBLOB列。对于本例,我将使用下述表定义:
CREATE TABLE file(
file_id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
file_name VARCHAR(64) NOT NULL,
file_size MEDIUMINT UNSIGNED NOT NULL,
file MEDIUMBLOB NOT NULL);

完成表的创建后,或许需要更改max_allowed_packet系统变量。该变量决定了能够发送给MySQL服务器的信息包(即单个行)大小。默认情况下,服务器能够接受来自客户端应用程序的信息包最大为1MB。如果不打算超过1MB,情况良好。如果打算在文件传输中超出1MB,必须增加该数值。

可以使用“MySQL系统管理员的启动变量”屏幕更改max_allowed_packet选项。在“联网”选项卡的“内存”部分,恰当调整“允许的最大值”选项。完成值的调整后,点击“应用更改”按钮,并使用“MySQL管理员”的“服务控制”屏幕重新启动服务器。也可以在my.cnf文件中直接调整该值(添加1行,max_allowed_packet=xxM),或在MySQL中使用SET max_allowed_packet=xxM。

设置max_allowed_packet时应保守些,这是因为传输BLOB数据需要一段时间。恰当地设置该值,使之与预期使用相符,并在必要时增大该值。

26.2.4.5.3. 将文件写入数据库

要想将文件写入数据库,需要将文件转换为字节数组,然后将字节数组用作INSERT查询的参数。

在下述代码中,使用FileStream对象打开了1个文件,将其读入至字节数组,然后将其插入到文件表中:

[VB]

Dim conn As New MySqlConnectionDim cmd As New MySqlCommandDim SQL As StringDim FileSize As UInt32Dim rawData() As ByteDim fs As FileStreamconn.ConnectionString = "server=127.0.0.1;" _    & "uid=root;" _    & "pwd=12345;" _    & "database=test"Try    fs = New FileStream("c:\image.png", FileMode.Open, FileAccess.Read)    FileSize = fs.LengthrawData = New Byte(FileSize) {}    fs.Read(rawData, 0, FileSize)    fs.Close()conn.Open()SQL = "INSERT INTO file VALUES(NULL, ?FileName, ?FileSize, ?File)"cmd.Connection = conn    cmd.CommandText = SQL    cmd.Parameters.Add("?FileName", strFileName)    cmd.Parameters.Add("?FileSize", FileSize)    cmd.Parameters.Add("?File", rawData)cmd.ExecuteNonQuery()MessageBox.Show("File Inserted into database successfully!", _    "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)conn.Close()Catch ex As Exception    MessageBox.Show("There was an error: " & ex.Message, "Error", _MessageBoxButtons.OK, MessageBoxIcon.Error)End Try  

[C#]

MySql.Data.MySqlClient.MySqlConnection conn;MySql.Data.MySqlClient.MySqlCommand cmd;conn = new MySql.Data.MySqlClient.MySqlConnection();cmd = new MySql.Data.MySqlClient.MySqlCommand();string SQL;UInt32 FileSize;byte[] rawData;FileStream fs;conn.ConnectionString = "server=127.0.0.1;uid=root;" +    "pwd=12345;database=test;";try{    fs = new FileStream(@"c:\image.png", FileMode.Open, FileAccess.Read);    FileSize = fs.Length;    rawData = new byte[FileSize];    fs.Read(rawData, 0, FileSize);    fs.Close();    conn.Open();    SQL = "INSERT INTO file VALUES(NULL, ?FileName, ?FileSize, ?File)";    cmd.Connection = conn;    cmd.CommandText = SQL;    cmd.Parameters.Add("?FileName", strFileName);    cmd.Parameters.Add("?FileSize", FileSize);    cmd.Parameters.Add("?File", rawData);    cmd.ExecuteNonQuery();    MessageBox.Show("File Inserted into database successfully!","Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);    conn.Close();}catch (MySql.Data.MySqlClient.MySqlException ex){    MessageBox.Show("Error " + ex.Number + " has occurred: " + ex.Message,"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);} 
FileStream对象的“Read”方法可用于将文件加载到字节数组中,该字节数组的大小是根据FileStream对象的“Length”属性确定的。

将字节数组指定为MySqlCommand对象的参数后,调用ExecuteNonQuery方法,并将BLOB插入到文件表中。

26.2.4.5.4. 将BLOB从数据库读取到磁盘上的文件

一旦将文件加载到了文件表中,就能使用MySqlDataReader类来检索它。

在下述代码中,从文件表提取了1行,然后将数据装载到要写入至磁盘的FileStream对象。

[VB]

Dim conn As New MySqlConnectionDim cmd As New MySqlCommandDim myData As MySqlDataReaderDim SQL As StringDim rawData() As ByteDim FileSize As UInt32Dim fs As FileStreamconn.ConnectionString = "server=127.0.0.1;" _    & "uid=root;" _    & "pwd=12345;" _    & "database=test"SQL = "SELECT file_name, file_size, file FROM file"Try    conn.Open()cmd.Connection = conn    cmd.CommandText = SQLmyData = cmd.ExecuteReaderIf Not myData.HasRows Then Throw New Exception("There are no BLOBs to save")myData.Read()FileSize = myData.GetUInt32(myData.GetOrdinal("file_size"))    rawData = New Byte(FileSize) {}myData.GetBytes(myData.GetOrdinal("file"), 0, rawData, 0, FileSize)fs = New FileStream("C:\newfile.png", FileMode.OpenOrCreate, FileAccess.Write)    fs.Write(rawData, 0, FileSize)    fs.Close()MessageBox.Show("File successfully written to disk!", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)myData.Close()    conn.Close()Catch ex As Exception    MessageBox.Show("There was an error: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)End Try  

[C#]

MySql.Data.MySqlClient.MySqlConnection conn;MySql.Data.MySqlClient.MySqlCommand cmd;MySql.Data.MySqlClient.MySqlDataReader myData;conn = new MySql.Data.MySqlClient.MySqlConnection();cmd = new MySql.Data.MySqlClient.MySqlCommand();string SQL;UInt32 FileSize;byte[] rawData;FileStream fs;conn.ConnectionString = "server=127.0.0.1;uid=root;" +    "pwd=12345;database=test;";SQL = "SELECT file_name, file_size, file FROM file";try{    conn.Open();    cmd.Connection = conn;    cmd.CommandText = SQL;    myData = cmd.ExecuteReader();    if (! myData.HasRows)throw new Exception("There are no BLOBs to save");    myData.Read();    FileSize = myData.GetUInt32(myData.GetOrdinal("file_size"));    rawData = new byte[FileSize];    myData.GetBytes(myData.GetOrdinal("file"), 0, rawData, 0, FileSize);    fs = new FileStream(@"C:\newfile.png", FileMode.OpenOrCreate, FileAccess.Write);    fs.Write(rawData, 0, FileSize);    fs.Close();    MessageBox.Show("File successfully written to disk!","Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);    myData.Close();    conn.Close();}catch (MySql.Data.MySqlClient.MySqlException ex){    MessageBox.Show("Error " + ex.Number + " has occurred: " + ex.Message,"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);} 
连接后,文件表的内容将被加载到MySqlDataReader对象中。使用MySqlDataReader的GetBytes方法将BLOB加载到字节数组,然后使用FileStream对象将字节数据写入磁盘。

MySqlDataReader的GetOrdinal方法可用于确定命名列的整数索引。如果SELECT查询的列顺序发生变化,使用GetOrdinal方法能够防止错误。

26.2.4.6. 与Crystal Reports一起使用MySQL Connector/NET

26.2.4.6.1. 前言
26.2.4.6.2. 创建数据源
26.2.4.6.3. 创建报告
26.2.4.6.4. 显示报告
26.2.4.6.1. 前言
Crystal Reports是Windows应用程序开发人员用于通报文档生成的常用工具。在本节中,介绍了Crystal Reports XI与MySQL和Connector/NET一起使用的方法。

在MySQL Connector/NET安装的Samples目录的CrystalDemo子目录下,可找到完整的示例应用程序。

26.2.4.6.2. 创建数据源

在Crystal Reports中创建报告时,在设计报告时,有两个用于访问MySQL数据的选项。

第1个选项是,设计报告时,使用Connector/ODBC作为ADO数据源。你能够浏览数据库,并使用拖放式操作选择表和字段以创建报告。该方法的缺点是,必须在应用程序中执行额外操作以生成与报告预期的数据集匹配的数据集。

第2个选项是在VB.NET中创建数据集,并将其保存为XML格式。随后,该XML文件可被用于设计报告。在应用程序中显示报告时,它的表现相当良好,但设计时的通用性较差,这是因为在创建数据集时,必须选择所有的相关列。如果忘记选择了某一列,在能够将列添加到报告前,必须重新创建数据集。

使用下述代码,可根据查询操作创建数据集,并将其写入磁盘。

[VB]

Dim myData As New DataSetDim conn As New MySqlConnectionDim cmd As New MySqlCommandDim myAdapter As New MySqlDataAdapterconn.ConnectionString = "server=127.0.0.1;" _    & "uid=root;" _    & "pwd=12345;" _    & "database=world"Try    conn.Open()    cmd.CommandText = "SELECT city.name AS cityName, city.population AS CityPopulation, " _ & "country.name, country.population, country.continent " _& "FROM country, city ORDER BY country.continent, country.name"    cmd.Connection = connmyAdapter.SelectCommand = cmd    myAdapter.Fill(myData)myData.WriteXml("C:\dataset.xml", XmlWriteMode.WriteSchema)Catch ex As Exception    MessageBox.Show(ex.Message, "Report could not be created", MessageBoxButtons.OK, MessageBoxIcon.Error)End Try 

[C#]

DataSet myData = new DataSet();MySql.Data.MySqlClient.MySqlConnection conn;MySql.Data.MySqlClient.MySqlCommand cmd;MySql.Data.MySqlClient.MySqlDataAdapter myAdapter;conn = new MySql.Data.MySqlClient.MySqlConnection();cmd = new MySql.Data.MySqlClient.MySqlCommand();myAdapter = new MySql.Data.MySqlClient.MySqlDataAdapter();conn.ConnectionString = "server=127.0.0.1;uid=root;" +  "pwd=12345;database=test;";  try{  cmd.CommandText = "SELECT city.name AS cityName, city.population AS CityPopulation, " +  "country.name, country.population, country.continent " +  "FROM country, city ORDER BY country.continent, country.name";  cmd.Connection = conn;    myAdapter.SelectCommand = cmd;  myAdapter.Fill(myData);    myData.WriteXml(@"C:\dataset.xml", XmlWriteMode.WriteSchema);}catch (MySql.Data.MySqlClient.MySqlException ex){  MessageBox.Show(ex.Message, "Report could not be created",  MessageBoxButtons.OK, MessageBoxIcon.Error);}
设计报告时,可将该代码生成的XML文件用作ADO.NET XML数据源。

如果你选择使用Connector/ODBC来设计报告,可从dev.mysql.com下载它。

26.2.4.6.3. 创建报告
对于大多数应用目的,标准的报告向导应能帮助你完成报告的最初创建。要想启动向导,打开Crystal Reports并从“文件”菜单选择“New > Standard Report”选项。

向导首先要求你提供数据源。如果你正使用Connector/ODBC作为数据源,选择数据源时,请使用OLE DB (ADO)树的“用于ODBC的OLEDB provider”选项,,而不是来自ODBC (RDO)的对应选项。如果你使用的是已保存的数据集,请选择ADO.NET (XML)选项,并浏览你保存的数据集。

在报告的创建过程中,剩余部分将由向导自动完成。

创建完报告后,选择“文件”菜单中的“Report Options...”菜单项。取消对“Save Data With Report”(与报告一起保存数据)选项的选择。这样,就能防止保存的数据干扰应用程序中的数据加载操作。

26.2.4.6.4. 显示报告

要想显示报告,首先用报告所需的数据填充数据集,然后加载报告,并将其与绑定到数据集。最后,将报告传递给crViewer控制,以便向用户显示它。

在显示报告的项目中,需要下述引用:

·CrytalDecisions.CrystalReports.Engine

·CrystalDecisions.ReportSource

·CrystalDecisions.Shared

·CrystalDecisions.Windows.Forms

在下述代码中,假定你使用数据集(用创建数据源中给出的代码保存的数据集)创建了报告,并在名为“myViewer”的表单上有1个crViewer控件。

[VB]

Imports CrystalDecisions.CrystalReports.EngineImports System.DataImports MySql.Data.MySqlClientDim myReport As New ReportDocumentDim myData As New DataSetDim conn As New MySqlConnectionDim cmd As New MySqlCommandDim myAdapter As New MySqlDataAdapterconn.ConnectionString = _    "server=127.0.0.1;" _    & "uid=root;" _    & "pwd=12345;" _    & "database=test"Try    conn.Open()cmd.CommandText = "SELECT city.name AS cityName, city.population AS CityPopulation, " _ & "country.name, country.population, country.continent " _& "FROM country, city ORDER BY country.continent, country.name"    cmd.Connection = connmyAdapter.SelectCommand = cmd    myAdapter.Fill(myData)myReport.Load(".\world_report.rpt")    myReport.SetDataSource(myData)    myViewer.ReportSource = myReportCatch ex As Exception    MessageBox.Show(ex.Message, "Report could not be created", MessageBoxButtons.OK, MessageBoxIcon.Error)End Try

[C#]

using CrystalDecisions.CrystalReports.Engine;using System.Data;using MySql.Data.MySqlClient;ReportDocument myReport = new ReportDocument();DataSet myData = new DataSet();MySql.Data.MySqlClient.MySqlConnection conn;MySql.Data.MySqlClient.MySqlCommand cmd;MySql.Data.MySqlClient.MySqlDataAdapter myAdapter;conn = new MySql.Data.MySqlClient.MySqlConnection();cmd = new MySql.Data.MySqlClient.MySqlCommand();myAdapter = new MySql.Data.MySqlClient.MySqlDataAdapter();conn.ConnectionString = "server=127.0.0.1;uid=root;" +    "pwd=12345;database=test;";try{    cmd.CommandText = "SELECT city.name AS cityName, city.population AS CityPopulation, " +"country.name, country.population, country.continent " +"FROM country, city ORDER BY country.continent, country.name";    cmd.Connection = conn;    myAdapter.SelectCommand = cmd;    myAdapter.Fill(myData);    myReport.Load(@".\world_report.rpt");    myReport.SetDataSource(myData);    myViewer.ReportSource = myReport;}catch (MySql.Data.MySqlClient.MySqlException ex){    MessageBox.Show(ex.Message, "Report could not be created",MessageBoxButtons.OK, MessageBoxIcon.Error);}

使用相同的查询(用于生成前面保存的数据集),可生成新的数据集。一旦填充了数据集,可使用ReportDocument加载报告文件,并将其与数据集绑定在一起。ReportDocument是作为crViewer的ReportSource而传递的。

使用Connector/ODBC从单个表创建报告时,采用了相同的方法。数据集替换报告中使用的表,并恰当显示报告。

如果报告是使用Connector/ODBC从多个表创建的,在我们的应用程序中必须创建具有多个表的数据集。这样,就能用数据集中的报告替换报告数据源中的各个表。

在我们的MySqlCommand对象中提供多条SELECT语句,通过该方式,用多个表填充数据集。这些SELECT语句基于SQL查询,如数据库菜单“Show SQL Query”选项中的“Crystal Reports”中显示的那样。假定有下述查询:

SELECT `country`.`Name`, `country`.`Continent`, `country`.`Population`, `city`.`Name`, `city`.`Population`
FROM `world`.`country` `country` LEFT OUTER JOIN `world`.`city` `city` ON `country`.`Code`=`city`.`CountryCode`
ORDER BY `country`.`Continent`, `country`.`Name`, `city`.`Name`

该查询将被转换为两条SELECT查询,并以下述代码显示:

[VB]

Imports CrystalDecisions.CrystalReports.EngineImports System.DataImports MySql.Data.MySqlClientDim myReport As New ReportDocumentDim myData As New DataSetDim conn As New MySqlConnectionDim cmd As New MySqlCommandDim myAdapter As New MySqlDataAdapterconn.ConnectionString = "server=127.0.0.1;" _    & "uid=root;" _    & "pwd=12345;" _    & "database=world"Try    conn.Open()    cmd.CommandText = "SELECT name, population, countrycode FROM city ORDER BY countrycode, name; " _& "SELECT name, population, code, continent FROM country ORDER BY continent, name"    cmd.Connection = connmyAdapter.SelectCommand = cmd    myAdapter.Fill(myData)myReport.Load(".\world_report.rpt")    myReport.Database.Tables(0).SetDataSource(myData.Tables(0))    myReport.Database.Tables(1).SetDataSource(myData.Tables(1))    myViewer.ReportSource = myReportCatch ex As Exception    MessageBox.Show(ex.Message, "Report could not be created", MessageBoxButtons.OK, MessageBoxIcon.Error)End Try

[C#]

using CrystalDecisions.CrystalReports.Engine;using System.Data;using MySql.Data.MySqlClient;ReportDocument myReport = new ReportDocument();DataSet myData = new DataSet();MySql.Data.MySqlClient.MySqlConnection conn;MySql.Data.MySqlClient.MySqlCommand cmd;MySql.Data.MySqlClient.MySqlDataAdapter myAdapter;conn = new MySql.Data.MySqlClient.MySqlConnection();cmd = new MySql.Data.MySqlClient.MySqlCommand();myAdapter = new MySql.Data.MySqlClient.MySqlDataAdapter();conn.ConnectionString = "server=127.0.0.1;uid=root;" +    "pwd=12345;database=test;";try{    cmd.CommandText = "SELECT name, population, countrycode FROM city ORDER " +"BY countrycode, name; SELECT name, population, code, continent FROM " +"country ORDER BY continent, name";    cmd.Connection = conn;    myAdapter.SelectCommand = cmd;    myAdapter.Fill(myData);    myReport.Load(@".\world_report.rpt");    myReport.Database.Tables(0).SetDataSource(myData.Tables(0));    myReport.Database.Tables(1).SetDataSource(myData.Tables(1));    myViewer.ReportSource = myReport;}catch (MySql.Data.MySqlClient.MySqlException ex){    MessageBox.Show(ex.Message, "Report could not be created",MessageBoxButtons.OK, MessageBoxIcon.Error);}   
应将SELECT语句按字母顺序排列,这点很重要,原因在于,这是报告希望其源表所具有的顺序。对于报告中的每个表,均需要一条SetDataSource语句。

该方法会导致性能问题,这是因为Crystal Reports必须在客户端一侧将表绑定在一起,与使用以前保存的数据集相比,速度较慢。

26.2.4.7. 在MySQL Connector/NET中处理日期和时间信息

26.2.4.7.1. 前言
26.2.4.7.2. 使用无效日期时的问题
26.2.4.7.3. 限制无效日期
26.2.4.7.4. 处理无效日期
26.2.4.7.5. 处理NULL日期
26.2.4.7.1. 前言
MySQL和.NET语言处理日期和时间信息的方式是不同的,MySQL允许使用无法由.NET数据类型表示的日期,如“0000-00-00 00:00:00”。如果处理步当,该差异会导致问题。

在本节中,介绍了使用MySQL Connector/NET时恰当处理日期和时间信息的方法。

26.2.4.7.2. 使用无效日期时的问题
对于使用无效日期的开发人员来说,数据处理方面的差异会导致问题。无效的MySQL日期无法被加载到.NETDateTime对象中,包括NULL日期。

由于该原因,不能用MySqlDataAdapter类的Fill方法填充.NETDataSet对象,这是因为无效日期会导致System.ArgumentOutOfRangeException异常。

26.2.4.7.3. 限制无效日期
对日期问题的最佳解决方案是,限制用户输入无效日期。这即可在客户端上进行,也可在服务器端进行。

在客户端上限制无效日期十分简单,即总使用.NET DateTime类来处理日期。DateTime类仅允许有效日期,从而确保了数据库中的值也是有效的。该方法的缺点是,在使用.NET和非.NET代码操作数据库的混合环境下不能使用它,这是因为各应用程序必须执行自己的日期验证。

MySQL 5.0.2和更高版本的用户可使用新的传统SQL模式来限制无效日期值。关于使用传统SQL模式的更多信息,请参见http://dev.mysql.com/doc/mysql/en/server-sql-mode.html。

26.2.4.7.4. 处理无效日期
强烈建议在你的.NET应用程序中应避免使用无效日期,尽管如此,也能tongguoMySqlDateTime数据类型使用无效日期。

MySqlDateTime数据类型支持MySQL服务器支持的相同日期值。MySQL Connector/NET的默认行为是,对有效的日期值返回1个.NET DateTime对象,对无效日期值返回错误。可以更改该默认方式,使MySQL Connector/NET为无效日期返回MySqlDateTime对象。

要想使MySQL Connector/NET为无效日期返回MySqlDateTime对象,可在连接字符串中添加下行:

  Allow Zero Datetime=True
  

请注意,使用MySqlDateTime类仍会产生问题。下面介绍了一些已知问题:

1. 无效日期的数据绑定仍会导致错误(零日期0000-00-00看上去不存在该问题)。

2. ToString方法返回按标准MySQL格式进行格式处理的日期(例如,2005-02-23 08:50:25)。这与.NET DateTime类的ToString行为不同。

3. MySqlDateTime类支持NULL日期,但.NET DateTime类不支持NULL日期。如果未首先检查NULL,在试图将MySQLDateTime转换为DateTime时,会导致错误。

由于存在上述已知事宜,最佳建议仍是,在你的应用程序中仅使用有效日期。

26.2.4.7.5. 处理NULL日期

.NET DateTime数据类型不能处理NULL值。同样,在查询中为DateTime变量赋值时,必须首先检查值是否是NULL。

使用MySqlDataReader时,在赋值前,应使用.IsDBNull方法检查值是否为NULL:

[VB]

If Not myReader.IsDBNull(myReader.GetOrdinal("mytime")) Then    myTime = myReader.GetDateTime(myReader.GetOrdinal("mytime"))Else    myTime = DateTime.MinValueEnd If  

[C#]

if (! myReader.IsDBNull(myReader.GetOrdinal("mytime")))    myTime = myReader.GetDateTime(myReader.GetOrdinal("mytime"));else    myTime = DateTime.MinValue;  
NULL值能够在数据集中使用,也能将其绑定以构成控件,无需特殊处理。

26.2.5. MySQL Connector/NET变更史

26.2.5.1. 版本2.0.0
26.2.5.2. 版本1.0.7
26.2.5.3. 版本1.0.6
26.2.5.4. 版本1.0.5
26.2.5.5. 版本1.0.4 1-20-05
26.2.5.6. 版本1.0.3-gamma 12-10-04
26.2.5.7. 版本1.0.2-gamma 04-11-15
26.2.5.8. 版本1.0.1-beta2 04-10-27
26.2.5.9. 版本1.0.0 04-09-01
26.2.5.10. 版本0.9.0 04-08-30
26.2.5.11. 版本0.76
26.2.5.12. 版本0.75
26.2.5.13. 版本0.74
26.2.5.14. 版本0.71
26.2.5.15. 版本0.70
26.2.5.16. 版本0.68
26.2.5.17. 版本0.65
26.2.5.18. 版本0.60
26.2.5.19. 版本0.50

26.2.5.1. 版本2.0.0

·更正了在未填充Connection.Database的情况下使用存储程序时出现的异常 (Bug #11450) 。

·特定的残缺查询将触发“连接必须是有效和打开的”错误消息 (Bug #11490) 。

26.2.5.2. 版本1.0.7

·调用其某一参数含有特殊字符(如“@”)的存储程序将产生异常。注意,必须启用ANSI_QUOTES才会使之成为可能 (Bug #13753) 。

·如果语句包含对相同参数的多个引用,无法对其进行预处理 (Bug #13541) 。

·Ping()方法不更新Connection对象的State属性 (Bug #13658) 。

26.2.5.3. 版本1.0.6

·Nant构建序列有问题(Bug #12978)

·如果传递的第1个值是NULL,参数的串行化操作失败 (Bug #13276) 。

·含下述字符的字段名将导致错误:()%<>/ (Bug #13036) 。

·MySQL Connector/NET 1.0.5安装程序不能同时安装MySQL Connector/NET 1.0.4. (Bug #12835)。

·在Mono上MySQL Connector/NET 1.0.5不能连接 (Bug #13345) 。

26.2.5.4. 版本1.0.5

·连接字符串中有多个主机时,MySQL Connector/NET无法与列表中的1个主机相连 (Bug #12628) 。

·MySQL Connector/NET将新的十进制数据类型解释为字节数组 (Bug #11294) 。

·不支持cp1250字符集 (Bug #11621) 。

·当.NET线程池无可用的工作线程时,连接可能失败 (Bug #10637) 。

·十进制参数导致语法错误 (Bug #11550, Bug #10486, Bug #10152)。

·如果存储程序不含参数,调用存储程序将导致异常 (Bug #11542) 。

·特定的残缺查询将触发“连接必须是有效和打开的”错误消息 (Bug #11490) 。

·除了默认数据库外,MySqlCommandBuilder类不能处理引用了其他数据库中表的查询 (Bug #8382) 。

·MySQL Connector/NET无法特定的局部设置一起正常工作 (WL#8228)。

·未填充Connection.Database时使用存储程序导致异常 (Bug #11450) 。

·读取TIMESTAMP列时产生异常 (Bug #7951) 。

·用换行符隔开参数时,无法识别参数 (Bug #9722) 。

·在初始连接上未设置连接字符串时,调用MySqlConnection.clone将导致错误 (Bug #10281) 。

·增加了对从MySQL Connector/NET调用存储函数的支持 (Bug #10644) 。

·MySQL Connector/NET不能连接到MySQL 4.1.14. (Bug #12771)。

·用设计器添加了MySqlConnection对象时,无法设置ConnectionString属性 (Bug #12551, Bug #8724)。

26.2.5.5. 版本1.0.4 1-20-05

·Bug #7243:调用准备导致异常[已更正]。

·更正了与预处理语句有关的另一个小问题。

·Bug #7258:MySqlCommand.Connection返回IDbConnection [已更正]。

·Bug #7345:MySqlAdapter.Fill方法抛出错误消息:需要非负数值[已更正]。

·Bug #7478:MySqlCommand中的克隆方法缺陷[已更正]。

·Bug #7612:当字段为NULL时,MySqlDataReader.GetString(index)返回了非Null值[已更正]。

·Bug #7755:如果列是无符号类型,MySqlReader.GetInt32抛出异常[已更正]。

·Bug #7704:GetBytes不再工作[已更正]。

·Bug #7724:引用字符“\222”在EscapeString中未被引用[已更正]。

·更正了命名管道不能与某些Blob功能一起工作的问题。

·更正了与共享内存连接有关的问题。

·Bug #7436:与多个结果集有关的问题… [已更正]。

·在API参考文档中增加了多个主题。

26.2.5.6. 版本1.0.3-gamma 12-10-04

·使MySQL成为默认的命名管道名称。

·现在,连接时SHOW COLLATION可用于检索完整的字符集ID列表。

·更正了无效字符集索引:200 (Bug #6547) 。

·安装器现在包含了多个选项,可安装至GAC中,并创建“开始”菜单项。

·Bug #6863:MySqlCommand参数中的Int64支持[已更正]。

·对于连接,现在无需在连接字符串上给出数据库。

·Bug #6770:MySqlDataReader.GetChar(int i)抛出IndexOutOfRange异常[已更正]。

·更正了因具有不同行数的多个结果集而导致的问题。

·Bug #6983:再次抛出异常时异常堆栈跟踪丢失[已更正]。

·更正了与使用预处理语句检测Null值有关的主要问题。

·Bug #6902:解析存储程序参数时的错误[已更正]。

·Bug #6668:存储程序的整数输出参数返回为字符串[已更正]。

·Bug #7032:按文本分类的数据表中的MySqlDateTime,无数据 [已更正]。

·Bug #7133:使用inout参数时的无效查询字符串[已更正]。

·Bug #6831:与MySQL 4.0一起时,测试失败,原因在于表名的大小写敏感性[已更正]。

·Bug #7132:插入DateTime导致System.InvalidCastException的抛出[已更正]。

·Bug #6879:使用DATE_ADD-function时的InvalidCast[已更正]。

·Bug #6634:1个打开的连接被主机系统关闭[已更正]。

·为MySqlConnection添加了ServerThread属性以显示服务器线程ID。

·为MySqlConnection增加了Ping方法。

·将测试包的名称更改为MySql.Data.Tests.dll。

26.2.5.7. 版本1.0.2-gamma 04-11-15

·更正了与MySqlBinary有关的问题,其中,无法使用字符串值更新扩展的文本列。

·更正了使用定制安装时忽略的安装目录问题(Bug #6329)。

·更正了设置命令文本将命令留在预处理状态的问题。

·更正了MySqlParameter双类型处理问题(字符串parameterName,对象值)(Bug #6428)。

·更正了填充数据集时返回零日期“0000-00-00”错误(Bug #6429)。

·更正了调用存储程序可能会导致“Illegal mix of collations”(非法校对组合)的问题。

·增加了charset连接字符串选项。

·更正了#HY000“Illegal mix of collations”(非法校对组合)(latin1_swedish_ci,IMPLICIT)和(utf8_general_ (Bug #6322)问题。

·增加了TableEditor CS和VB示例。

·更正了关于UCS-2的Charset-map问题(Bug #6541)。

·更新了安装器,包含了新的示例。

·更正规了Long插入耗时很长的问题(Bug #5453)。

·更正了对象无法被处理的问题(Bug #6649)。

·提供方正将服务器指定的字符集用作默认字符集。

26.2.5.8. 版本1.0.1-beta2 04-10-27

·更正了MySqlParameter(string, object)构造函数中的可能缺陷BUG #5602。

·更正了BUG #5458,在longtext列上调用GetChars将抛出异常。

·更正了BUG #5474,无法运行存储程序来填充mysqlcommand.parameters。

·更正了BUG #5469,设置DbType时抛出NullReferenceException。

·更正了在关闭套接字之前连接器无法发出CMD_QUIT的问题。

·更正了BUG #5392,MySqlCommand在字符串文本内容中发现作为参数的“?”。

·更正了与ConnectionInternal有关的问题,其中,1个键可能会被添加多次。

·当服务器版本为4.1.2或更高时,CP1252仅用于Latin1。

·更正了BUG #5388,如果1行为NULL,DataReader通报所有行均为NULL。

·虚拟化了驱动子系统,以便未来版本能轻易地支持客户端或嵌入式服务器。

·再次使用字段缓冲,以减少内存分配并增加速度。

·更正了相应的问题,使用接口时使用旧语法将导致问题。

·对于写入流操作,使用PacketWriter取代Packet。

·在CompressedStream中再分解压缩代码,以清理NativeDriver。

·增加了用于在预处理命令上重置命令文本的测试范例。

·更正了给定Null值时MySqlParameterCollection.Add()将抛出不明异常的问题(Bug #5621)。

·更正了MySqlCommand()中的构造函数初始化问题(Bug #5613)。

·更正了解析“;”字符的问题(Bug #5876)。

·更正了在DbType设置器中丢失引用的问题(Bug #5897)。

·更正了使用YEAR数据类型时的System.OverflowException问题(Bug #6036)。

·增加了聚合函数测试(实际上不是缺陷)。

·更正了浮点参数(double, numeric, single, decimal)的序列化问题(Bug #5900)。

·IsNullable错误(Bug #5796)。

·更正了不遵守连接字符串上给出的连接寿命的问题。

·更正了不遵守Min Pool Size(最小池大小)的问题。

·更正了MySqlDataReader和“show tables from ...”(从…显示表)行为(Bug #5256)。

·实施了SequentialAccess。

·更正了发现第1个0后MySqlDateTime在所有subseq.records上设置IsZero属性的问题(Bug #6006)。

·更正了无法正确显示中文字的问题(Bug #5288)。

·还更正了俄文字符支持。

·更正了Method TokenizeSql()仅将有限的有效字符用于参数的问题(Bug #6217)。

·更正了丢失resx文件的NET Connector源(Bug #6216)。

·更正了与检索/更新查询一起使用是会导致问题的DBNull值 (Bug #5798) 。

·更正了仍有另一个“未设置给对象实例的对象引用”(Bug #5496)。

·更正了PacketReader中的问题,其中,会试图在EnsureCapacity中分配错误的缓冲大小。

·更正了GetBoolean返回错误值的问题(Bug #6227)。

·更正了带有GetString(index)的DataReader一起读取BLOB时的IndexOutOfBounds问题(Bug #6230)。

26.2.5.9. 版本1.0.0 04-09-01

·更正了BUG# 3889,不能正确支持Thai编码。

·更新了很多测试范例。

·更正了与使用压缩有关的问题。

·将贝塔1版本的版本号扩充为1.0.0。

·增加了用于安装器的COPYING.rtf文件。

·删除了所有的XML注释警告(以后将更好地清理它们)。

·删除了一些对ByteFX的最近引用。

26.2.5.10. 版本0.9.0 04-08-30

·为预处理语句增加了测试定位器。

·目前,所有类型的类均实施了SerializeBinary方法,用于将其数据发送给PacketWriter。

·增加了PacketWriter类,允许将来的低内存大对象处理。

·更正了运行预处理语句和存储程序中存在的很多小缺陷。

·更改了多条命令,使得在执行带有特定参数(采用旧语法模式)的存储程序时不再抛出异常。

·SingleRow现在工作正常,即使在存在限制的情况下也同样。

·GetBytes目前仅作用在二进制列上。

·Logger现在能够截短长的SQL命令,从而使得blob列不会“撑爆”日志。

·主机和数据库目前的默认值为“”,除非作了其他设置。

·更正了BUG# 5214,忽略了连接超时。

·增加了测试范例,针对bug# 5051:GetSchema不能正确工作。

·更正了当列为关键字时GetSchema为IsUnique返回“假”的问题。

·MySqlDataReader GetXXX方法目前采用了字段级MySqlValue对象,不执行转换。

·更正了BUG# 5097:DataReader为时间列返回NULL。

·A增减了针对LOAD DATA LOCAL INFILE的测试范例。

·增加了replacetext custom nant任务。

·增加了CommandBuilderTest定位器。

·为CommandBuilder增加了Last One Wins(最后一个胜出)特性。

·更正了持续性安全信息问题。

·更正了GetBool,使得1, true, "true"和"yes"均可表示trueWL# 2024,从而使得参数标志成为可配置的。

·增加了"old syntax"连接字符串参数,允许使用“@”参数标记符。

·更正了Bug #4658,MySqlCommandBuilder。

·更正了Bug #4864,如果“Persist Security Info”(持续性安全信息)为假,ByteFX.MySqlClient将对密码进行缓冲处理。

·在所有的源文件中更新了许可标志,以包含FLOSS异常。

·针对目前所有的MySql类型,增加了新的.Types名称空间和具体实施。

·增加了作为MySqlField子类的MySqlField41。

·更改了很多类,使之能够使用新的.Types类型。

·将enum int类型更改为Int32,将short类型更改为Int16,并将bigint类型更改为Int64。

·增加了伪类型UInt16、UInt32和UInt64,允许创建无符号参数。

·现在,从连接池拉出连接时,连接将被复位。

·在驱动程序中再次分解了auth代码,使得其即能用于auth,也能用于reset。

·在PoolingTests.cs中增加了UserReset测试。

·现在,使用COM_CHANGE_USER从池中拉出连接时,连接将被复位。

·实现了SingleResultSet行为。

·实现了对unicode的支持。

·为utf-8和ucs-2增加了字符集映射。

·更正了Bug #4520,使用bytefx .net mysql驱动时,时间字段溢出。

·在数据类型测试定位器中修改了时间测试,以便能够检查“hours > 24”的时间跨度。

·更正了Bug #4505,在ByteFx.Data.MySqlClient.MySqlParameter中带有反斜杠转义的错误字符串。

·为参数测试范例TestQuoting增加了代码,以测试反斜线符号。

·更正了Bug #4486,与multi-word列名一起工作时,mysqlcommandbuilder失败。

·更正了TokenizeSql中的缺陷,其中,下划线将中止获取参数名中的字符。

·为列名空间增加了测试范例。

·更正了bug# 4324,MySqlDataReader.GetBytes不能正确工作。

·为DataReader测试定位器增加了GetBytes()测试范例。

·现在,能够将InternalConnection.Configure中的所有服务器变量读入到Hashtable。

·目前使用字符串[],用于CharSetMap中的索引映射。

·为SQL中的carriage返回增加了CRInSQL测试范例。

·在Driver.ctor中,将maxPacketSize设为默认值。

·更正了bug #4442,在参数上设置MySqlDbType的操作不设置一般类型。

·删除了过时的列类型Long和LongLong。

·更正了bug# 4071,在连接字符串上使用“use pipe”时,抛出溢出异常。

·将关键字“use pipe”更改为“pipe name”或“pipe”。

·允许从单个查询读取多个结果集。

·为ServerStatusFlags enum增加了标志属性。

·将ServerStatus enum的名称更改为ServerStatusFlags。

·更正了BUG #4386,插入的数据行未正确更新。

·更正了bug #4074,错误处理表明创建了表。

·将Packet.ReadLenInteger更改为ReadPackedLong,并增加了packet.ReadPackedInteger,它总读取用2、3、4组装的整数。

·增加了syntax.cs测试定位器,以测试各种SQL语法缺陷。

·更正了bug# 4149,对时间值的不当处理。现在,值“00:00:00”不再被当作Null。

·将所有的测试包文件移到了TestSuite文件夹。

·更正了空列会将结果信息包指针向后移的问题。

·增加了新的nant创建脚本。

·更正了BUG #3917,清除表名,以便能在下一GenerateSchema执行期间恰当地重新生成它。

·更正了bug #3915,GetValues总返回0,而且总是试图复制所有字段,而不是根据所传入数组的大小。

·实施了共享内存访问协议。

·实施了针对的MySQL 4.1的预处理语句。

·实施了针对MySQL 5.0的存储程序。

·将MySqlInternalConnection重新命名为InternalConnection。

·SQL现在被解释为字符,更正了与其他语言有关的问题。

·增加了日志功能,并允许批连接字符串选项。

·更正了bug #3888,设置DataAdapter属性时未设置RowUpdating事件。

·更正了字符集映射中存在的缺陷。

·实施了4.1鉴定。

·改善了驱动中的open/auth代码。

·改善了在连接过程中连接位的设置方式。

·现在,在初始的握手阶段,将数据库名传递给了服务器。

·将客户端的名称空间更改为MySql.Data.MySqlClient。

·将客户端的装配名称更改为MySql.Data.dll。

·将所有源文件中的许可文本更改为了GPL。

·增加了MySqlClient.build Nant文件。

·删除了mono批处理文件。

·将一些未使用的文件移到了notused文件夹,从而使得nant创建文件能够使用通配符。

·实施了共享内存访问。

·对代码结构进行了较大修补。

·现在,预处理语句能够在MySql 4.1.1和更高版本中使用。

·对4.0、4.1.0和4.1.1完成了auth实施。

·将名称空间从MySQL.Data.MySQLClient更改为MySql.Data.MySqlClient。

·更正了CharSetMapping中存在的缺陷,其中,它试图将文本名称用作ints。

·将名称空间更改为MySQL.Data.MySQLClient。

·集成了来自UC2004的auth变动。

·更正了在读取数据之前和值后、在datareader上调用任何GetXXX方法时不能抛出恰当异常的缺陷(感谢Luca Morelli morelli.luca@iol.it)。

·在parameter.cs中增加了TimeSpan代码,以便能恰当地将timespan对象处理为mysql时间格式(感谢Gianluca Colombo g.colombo@alfi.it)。

·为参数序列化代码增加了TimeStamp。防止DataAdatper不正常的更新(感谢MIchael King)。

·更正了MySqlHelper.cs中的拼写错误(感谢Patrick Kristiansen)。

26.2.5.11. 版本0.76

·驱动程序现在能使用握手协议中给定的字符集编号创建编码。

·更改了命令编辑器,使之指向MySqlClient.Design。

·更正了Version.isAtLeast中的缺陷。

·更改了DBConnectionString,使之能够支持对MySqlConnectionString所作的更改。

·删除了SqlCommandEditor和DataAdapterPreviewDialog。

·在很多地方采用了新的Long返回值。

·集成了新的CompressedStream类。

·更改了ConnectionString并增加了多项属性,从而使之能够在MySqlClient.Design中使用。

·更改了packet.cs,以支持ReadLenInteger中的较新长度。

·更改了其他类,以使用MySqlConnectionString的新属性和字段。

·现在,ConnectionInternal能够使用PING命令查看服务器是否可用。

·将工具箱位图移到了resource/下。

·更改field.cs,允许值直接来自行缓冲器。

·进行了相应的更改,以使用新的driver.Send语法。

·使用了新的信息包排队系统。

·开始着手进行“损坏的”压缩信息包处理。

·更正了StreamCreator中的缺陷,无法连接到主机将导致无限循环(感谢Kevin Casella)。

·改善了connectstring处理。

·将设计器移到了Pro产品中。

·从command.cs删除了一些旧的、被注释掉的代码。

·更正了与压缩有关的1个问题。

·更正了连接对象,打开连接前抛出的异常不会使连接保持在连接状态(感谢Chris Cline)。

·增加了GUID支持。

·更正了序列混乱缺陷(感谢Mark Reay)。

26.2.5.12. 版本0.75

·现在,可将Enum值作为参数值加以支持(感谢Philipp Sumi)。

·支持Year数据类型。

·更正了压缩问题。

·更正了以TimeSpan作为值的参数无法恰当序列化的缺陷。

·更正了默认ctor不能设置默认连接字符串值的缺陷。

·为一些新成员增加了一些XML注释。

·着手更正/改善压缩处理事宜。

·改善了ConnectionString处理功能,使之能够与SqlClient设定的标准更好地匹配。

·如果用户名未包含在连接字符串中,将抛出MySqlException。

·如果在连接字符串中未指定,本地主机将用作默认主机。

·如果在连接打开的同时试图设置连接字符串,将抛出异常。

·对ConnectionString文档进行了小的修改。

·删除了MultiHostStream和MySqlStream。采用Common/StreamCreator取而代之。

·增加了对“Use Pipe”连接字符串值的支持。

·增加了Platform类,以便能更容易地访问平台的实用工具功能。

·更正了小的连接池缺陷,即,在IsAlive失败后,不能创建新的连接。

·增加了Platform.cs和StreamCreator.cs。

·更正了Field.cs,以便能恰当处理4.1版分格的时间戳。

·将Common.Version更改为Common.DBVersion,以避免名称冲突。

·更正了field.cs,从而使得文本列能返回正确的字段类型(感谢beni27@gmx.net)。

·增加了MySqlError类,以提供对错误代码的一些引用(感谢Geert Veenstra)。

26.2.5.13. 版本0.74

·增加了Unix套接字支持(感谢Mohammad DAMT [md@mt.web.id])。

·没有可用数据时,仅调用Thread.Sleep。

·该井了参数数据中引用字符的转义特性。

·删除了parameter.cs中易造成误解的注释。

·更正了连接池缺陷。

·再次更正了相同的连接池缺陷!! ;-)

·更正了ConnectionSTring编辑器对话框(感谢marco p (pomarc))。

·现在,在连接字符串中支持UserId(感谢Jeff Neeley)。

·创建非输入参数时抛出异常(感谢Ryan Gregg)。

·增加了更多文档。

·提供了新的MultiHostStream能力。诚挚感谢Dan Guisinger对此的贡献。是他首次提供了在连接字符串上支持多台机器的代码和观念。

·增加了大量文档。仍有很多文档需要增加。

·更正了与0.73有关的速度事宜。

·更改了MySqlDataStream中的Thread.Sleep(0),以便在不需要等待时优化性能(感谢Todd German)。

·预先将idlepools填充到了MinPoolSize。

·个高质量MySqlPool死锁条件以及愚蠢的缺陷,其中,CreateNewPooledConnection从不为连接池添加新连接。此外,还更正了MySqlStream.ReadBytes和ReadByte,从而不再使用并非始终正确的TicksPerSecond。(感谢Matthew J. Peddlesden)。

·修正了精度和标度(感谢Matthew J. Peddlesden)。

·为流读取方法增加了Thread.Sleep(1),使之对CPU更友好(感谢Sean McGinnis)。

·更正了ExecuteReader有时会返回Null的问题(感谢Lloyd Dupont)。

·更正了与Null字段处理有关的主要缺陷(感谢Naucki)。

·封装了针对max_allowed_packet的查询,以及Try Catch中的字符集(并设置为默认)。

·更正了套接字未能恰当关闭的问题(感谢Steve)。

·更正了ExecuteNonQuery不能始终返回正确值的问题。

·更正了InternalConnection,不使用@@session.max_allowed_packet,而是使用@@max_allowed_packet。(感谢Miguel)。

·增加了很多新XML文档行。

·更正了SQL解析功能,不发送控查询(感谢Rory)。

·更正了阅读器在关闭时不能unpeeking信息包的问题。

·更正了不能处理用户变量的问题(感谢Sami Vaaraniemi)。

·更正了MySqlPool中的循环检查功能(感谢Steve M. Brown)。

·更正了ParameterCollection.Add方法,以与SqlClient匹配(感谢Joshua Mouch)。

·更正了ConnectionSTring解析功能,以处理布尔类型的NO和YES,以及非小写值(感谢Naucki)。

·增加了InternalConnection类,修改了连接池功能。

·实现了Persist Security Info(持续性安全信息)。

·为项目增加了security.cs和version.cs。

·更正了Parameter.cs中的DateTime处理功能(感谢Burkhard Perkens-Golomb)。

·更正了某些类型抛出cast异常的参数序列化问题。

·更正了DataReader,转换所有的返回值以防止抛弃错误(感谢Keith Murray)。

·为Command.ExecuteReader增加了代码,如果初始SQL命令抛出异常,将返回Null(感谢Burkhard Perkens-Golomb)。

·构造了与重组一起引入ExecuteScalar缺陷。

·进行了重新构造,允许LOCAL DATA INFILE,以及更好的信息包排序。

·更正了与重组有关的数个缺陷。

·完成了前期工作,支持Mysql 4.1中更安全的密码。不再支持4.1版中的旧密码。

·正确处理系统参数后显示参数(Adam M. (adammil))。

·现在,可将字符串直接赋给blob字段(Adam M.)。

·更正了浮点参数(感谢Pent)。

·改善了参数ctor和ParameterCollection.Add方法,以更好地匹配SqlClient(感谢Joshua Mouch)。

·更正了Connection.CreateCommand以返回MySqlCommand类型。

·更正了连接字符串设计器的对话框问题(感谢Abraham Guyt)。

·更正了与发送命令无法总是读取响应信息包有关的问题(感谢Joshua Mouch)。

·更正了某些Blob类型无法被处理的参数序列化问题(感谢Sean McGinnis)。

·从DataReader代码中删除了伪MessageBox.show(感谢Joshua Mouch)。

·更正了split sql代码中的丑陋缺陷(感谢所有人! :-) )

26.2.5.14. 版本0.71

·更正了MySqlStream中的缺陷,即可能会读取过多数据(感谢Peter Belbin)。

·实现了HasRows(感谢Nash Pherson)。

·更正了大于256列的表会导致异常的问题(感谢Joshua Kessler)。

·更正了以“;”结束的SQL语句会导致问题的缺陷(感谢Shane Krueger)。

·更正了驱动中的缺陷,即,错误消息被截去1个字符(感谢Shane Krueger)。

·使得MySqlException成为可序列化的(感谢Mathias Hasselmann)。

26.2.5.15. 版本0.70

·更新了一些字符代码页,使之更加准确。

·更正了阅读器能够在已有打开阅读器的连接上打开的问题。

·发布了0.70。

·将测试移至单独的MySqlClientTests下。

·更正了驱动程序序列混乱的愚蠢问题(感谢Peter Belbin)。

·增加了一些管道测试。

·将默认最大池大小增加到50。

·与Mono 0-24一起进行了编译。

·更正了连接和数据阅读器处理问题。

·为参数序列化增加了字符串数据类型处理功能。

·更正了抛出异常后在驱动程序中出现的顺序问题(感谢Burkhard Perkens-Golomb)。

·增加了对CommandBehavior.SingleRow到DataReader的支持。

·更正了命令sql的处理功能,以便能更好地处理引用(感谢Theo Spears)。

·更正了double、single和decimal值的解析问题,以解释非英文分隔符。如果你正使用硬编码sql,仍须使用正确的语法,但是,如果你使用参数,代码将转换浮点类型,以便在进出服务器的过程中恰当地在内部使用“.”。[感谢匿名人]。

·增加了MySqlStream类,以简化超时和驱动编码。

·更正了DataReader,以便在相关连接关闭时恰当地关闭它。[感谢smishra]。

·使得客户端更兼容SqlClient,在连接能够用于运行另一命令前关闭DataReaders。

·改进了字段中的DBNull.Value处理功能。

·增加了数个单元测试。

·更正了MySqlException,以便能调用基本类:-o

·改进了驱动编码。

·更正了NextResult在最后1个结果集上返回“假”的缺陷。

·为MySQL增加了多个测试。

·通过等化无符号32bit值和Int64,以及无符号16bit值和Int32等,改进了抛弃问题。

·为MySqlParameter增加了新的ctor(名称、类型、大小、srccol)。

·更正了MySqlDataReader中存在的问题,即,在返回字段计数前,不能检查空的字段列表。

·开始增加了MySqlClient单元测试(增加了MySqlClient/Tests文件夹以及一些测试范例)。

·更正了连接字符串处理中的一些问题。

·将INIT_DB移到MySqlPool。可或许会在此移动它,这是在协商的准备过程中。

·更正了CommandBuilder中存在的缺陷,该缺陷会阻止插入正确出现。

·改写了一些内部构件,从而使得Command的所有三种执行方法均能正确工作。

·更正了在基准测试过程中发现的一些小问题。

·CoonectionPooling的首次截除工作恰当。保留了“min pool size”和“max pool size”。

·进行处理,允许返回多个结果集。

·现在,字符集的处理更为智能化。启动时,驱动程序查询MySQL,寻找默认的字符集。随后,如果能够加载代码页,该字符集将用于转换。如不然,将使用当前操作系统的默认代码页。

·增加了代码,以便将推断的类型保存在名称,以及参数的值ctor中。

·此外,如果使用Value属性更改了空参数的值,还能推断类型。

·转换了所有的文件以使用恰当的Camel范例。现在,在所有文件中,MySQL是MySql。PgSQL现在是PgSql。

·为PgSql代码增加了属性,以防止设计器显示它。

·为参数对象增加了MySQLDbType属性,并为从DbType到MySQLDbType的转换增加了恰当的转换代码。

·从MySQLParameter.cs中删除了从未使用的ObjectToString方法。

·更正了ParameterCollection中的Add(..)方法,不必使用Add(name, value)取而代之。

·更正了ParameterCollection中的IndexOf和Contains,使之清楚保存参数名时不需要@。

·更正了Command.ConvertSQLToBytes,仅允许能够构出现在MySQL变量名中的字符。

·更正了DataReader和字段,从而使得Blob字段能够从Field.cs读取其数据,而且GetBytes工作正确。

·为MySQLCommand的CommandText属性增加了简单的构造器编辑器。

·更正了CommandBuilder和Parameter序列化,指明在参数名称中不保存@。

·从Field.cs删除了MySQLFieldType enum,现使用MySQLDbType enum。

·为数个类增加了Designer属性,防止了使用VS.Net时的设计器视图。

·更正了ConnectionString设计器中的初始目录类型。

·删除了与(名称、类型、值)冲突的3种MySQLParameter参数ctor。

·更改了MySQLParameter,现在能够保存paramName而无需前导@(这修正了使用设计器是的Null插入问题)。

·更改了用于MySQLParameter的TypeConverter,以便能够与所有属性一起使用ctor。

26.2.5.16. 版本0.68

·更正了驱动程序中的顺序问题。

·增加了DbParametersEditor,使得参数编辑更像SqlClient。

·更正了Command类,以便能够使用设计器编辑参数。

·更新了连接字符串设计器,支持使用压缩标志。

·更正了字符串编码功能,从而使得欧洲字符(如ä)能够正确工作。

·创建了基本类,以帮助创建新的数据Provider。

·在连接字符串中增加了对UID关键字的支持。

·字段、参数和命令现在都能使用DBNull.Value,而不是null。

·使用DBNull.Value的CommandBuilder。

·未出现auto_insert字段时,CommandBuilder现在能正确创建插入命令。

·现在,字段使用typeof关键字来返回System.Types(性能)。

26.2.5.17. 版本0.65

·目前实现了MySQLCommandBuilder。

·目前实现了事务支持(并非所有的表类型均支持它)。

·更正了GetSchemaTable,不再使用xsd(对于Mono)。

·驱动程序先能兼容Mono!!

·现在支持TIME数据类型。

·需要更多工作以改善Timestamp数据类型处理。

·更改了所有类的特征以匹配对应的SqlClient类。

26.2.5.18. 版本0.60

·采用SharpZipLib的协议压缩(www.icsharpcode.net)。

·Windows平台上的命名管道现工作正常。

·完成了更多工作,改善了Timestamp数据类型处理。

·在DataReader上实现了Ienumerable,以使DataGrid能恰当工作。

26.2.5.19. 版本0.50

·通过删除网络同步代码中的缺陷,大幅度提高了速度。

·驱动程序不再对数据行进行缓冲处理(更兼容ADO.Net)。

·更正了与TIMESTAMP和DATETIME字段有关的转换缺陷。