MySQL Connector升级引起的故障

以前使用 Asp.NET + MySQL 搭建系统平台,使用了 MySQL 网上 Connector 5.22 版,发现其中的 Membership 的实现上存在 Bug,有时会抛出异常,引起网站服务停止,原因不明。

重新登录 MySQL官方网站,发现 Connector 已经升级到 6.22 ,于是下载,升级系统,希望能够修复以上的 Bug。

结果大失所望,6.22 版竟然抛出了另一种异常,原来运行得挺好的系统,跑也跑不起来了。

用户代码未处理 System.FormatException
  Message="GUID 应包含带 4 个短划线的 32 位数(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。"
  Source="mscorlib"
  StackTrace:
       在 System.Guid..ctor(String g)
       在 MySql.Data.Types.MySqlGuid.MySql.Data.Types.IMySqlValue.ReadValue(MySqlPacket packet, Int64 length, Boolean nullVal)
       在 MySql.Data.MySqlClient.NativeDriver.ReadColumnValue(Int32 index, MySqlField field, IMySqlValue valObject)
       在 MySql.Data.MySqlClient.ResultSet.get_Item(Int32 index)
       在 MySql.Data.MySqlClient.MySqlDataReader.GetFieldValue(Int32 index, Boolean checkNull)
       在 MySql.Data.MySqlClient.MySqlDataReader.GetValue(Int32 i)
       在 MySql.Data.MySqlClient.MySqlDataReader.GetValues(Object[] values)
       在 System.Data.ProviderBase.DataReaderContainer.CommonLanguageSubsetDataReader.GetValues(Object[] values)
       在 System.Data.ProviderBase.SchemaMapping.LoadDataRow()
       在 System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping)
       在 System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
       在 System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
       在 System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
       在 System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
       在 System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)

       ……

google 一下,有以下线索:

http://forums.mysql.com/read.php?10,296932,297042#msg-297042

http://dev.mysql.com/doc/refman/4.1/en/connector-net-news-6-2-0.html 

http://bugs.mysql.com/bug.php?id=47928

http://bugs.mysql.com/bug.php?id=48063

不管怎样,6.22 暂时不能用了,又将系统恢复为旧版,一个来回,几十个模块,2个小时不见了。

教训是:

1、要为每个模块创建完善、独立的单元测试集,升级组件时,能够进行完整测试,也能很快找到问题。(创建完整的测试集合,非常费劲,但是很有价值,越到后期,价值越大)

2、单元测试如果涉及到数据库,最好指定独立的connectString,建立另一个数据库,以免影响已有数据。

3、单元测试最好是自己创建的全脚本,全自动化的,保证任何情况下测试集合都能运行才有用。

    这方面,.NET软件测试自动化之道  有很好的范例,如果没有这本书,从网上可以下载到它的代码,对于创建自己独立的自动化测试集很有用。

原文地址:https://www.cnblogs.com/chinaontology/p/1681938.html