SqlHelper.FillDataset 的一个 Bug

转载 2007年09月21日 13:17:00
今天在做项目时,想用SqlHelper下的FillDataset 这个方法,要网上查了下,说这个里面有bug,所以就记下来

这两天在做数据查询的时候,在一个存储过程对多表进行查询,分别填充到强类型的 DataSet 不同的表。把存储过程写好以后,使用 SqlHelper.FillDataset 方法调用存储过程。发现的数据只有两个表填上了,而别的指定的表没有填上数据。跟踪的时候发现,DataSet 里边多了表,也就是数据实际上填到 DataSet 了只是没有填到指定的表。
       于是怀疑是DataSet 表没拖拽好。重新拖拽后,测试发现还是一样的结果。然后把存储过程改成拼接 SQL 也不行。但是如果自己使用 SqlDataAdapter 时就没问题。索性上网 google 了一下。发现原来是 Data Access Application Block 2.0 中的一个Bug(《ADO.NET中的多数据表操作浅析之读取》)。
        希望以后有人碰到同样问题 goole 一下,别瞎忙乎了。
/**//**//**//// <summary> 
        
/// Private helper method that execute a SqlCommand (that returns a resultset) against the specified SqlTransaction and SqlConnection 
        
/// using the provided parameters. 
        
/// </summary> 
        
/// <remarks> 
        
/// e.g.:   
        
///  FillDataset(conn, trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24)); 
        
/// </remarks> 
        
/// <param name="connection">A valid SqlConnection</param> 
        
/// <param name="transaction">A valid SqlTransaction</param> 
        
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> 
        
/// <param name="commandText">The stored procedure name or T-SQL command</param> 
        
/// <param name="dataSet">A dataset wich will contain the resultset generated by the command</param> 
        
/// <param name="tableNames">This array will be used to create table mappings allowing the DataTables to be referenced 
        
/// by a user defined name (probably the actual table name) 
        
/// </param> 
        
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> 

        private static void FillDataset(SqlConnection connection, SqlTransaction transaction, CommandType commandType,  
            
string commandText, DataSet dataSet, string[] tableNames, 
            
params SqlParameter[] commandParameters) 
        
...
            
if( connection == null ) throw new ArgumentNullException( "connection" ); 
            
if( dataSet == null ) throw new ArgumentNullException( "dataSet" ); 
 
            
// Create a command and prepare it for execution 
            SqlCommand command = new SqlCommand(); 
            
bool mustCloseConnection = false
            PrepareCommand(command, connection, transaction, commandType, commandText, commandParameters, 
out mustCloseConnection ); 
                 
            
// Create the DataAdapter & DataSet 
            using( SqlDataAdapter dataAdapter = new SqlDataAdapter(command) ) 
            
...
                 
                
// Add the table mappings specified by the user 
                if (tableNames != null && tableNames.Length > 0
                
...
                    
string tableName = "Table"
                    
for (int index=0; index < tableNames.Length; index++
                    
...
                        
if( tableNames[index] == null || tableNames[index].Length == 0 ) throw new ArgumentException( "The tableNames parameter must contain a list of tables, a value was provided as null or empty string.""tableNames" ); 
                        
// 
                        
// 错误处. 
                        
//dataAdapter.TableMappings.Add(tableName, tableNames[index]); 
                        
//tableName += (index + 1).ToString();  
                        
// 
                        
// 修正Bug. 
                        dataAdapter.TableMappings.Add((index>0? (tableName+index.ToString()):tableName, tableNames[index]); 
                    }
 
                }
 
                 
                
// Fill the DataSet using default values for DataTable names, etc 
                dataAdapter.Fill(dataSet); 
 
                
// Detach the SqlParameters from the command object, so they can be used again 
                command.Parameters.Clear(); 
            }
 
 
            
if( mustCloseConnection ) 
                connection.Close(); 
        }
 

 // 错误处.
                        
//dataAdapter.TableMappings.Add(tableName, tableNames[index]);
                        
//tableName += (index + 1).ToString(); 
                        
//
                        
// 修正Bug.
                        dataAdapter.TableMappings.Add((index>0? (tableName+index.ToString()):tableName, tableNames[index]);

C#关于Dataset的fill方法的解说

/创建SqlConnection数据库连接对象 SqlConnection Conn = new SqlConnection(sConnectionString); //打开Conn Conn....
  • baomihua21
  • baomihua21
  • 2013年04月20日 11:23
  • 1041

SqlHelper.FillDataset 的一个 Bug

今天在做项目时,想用SqlHelper下的FillDataset 这个方法,要网上查了下,说这个里面有bug,所以就记下来转这两天在做数据查询的时候,在一个存储过程对多表进行查询,分别填充到强类型的 ...
  • lanlandechong
  • lanlandechong
  • 2007年09月21日 13:17
  • 838

怎样很好的描述一个BUG

 优秀的测试人员能通过优秀的bug报告让开发人员心悦诚服的修改bug,可以想象一名被bug困扰的焦头烂额的开发人员,在看到一条含糊不清,语句不通,还夹杂着几个错别字的bug描述记录时的心情会怎样?  ...
  • xingqisan
  • xingqisan
  • 2011年06月29日 16:42
  • 1715

如何写出一个让人很难发现的bug?

点击上方“程序人生”,选择“置顶公众号” 第一时间关注程序猿(媛)身边的故事 程序员的日常三件事:写bug、改bug、背锅。连程序员都自我调侃道,为什么每天都在加班?因为我...
  • csdnsevenn
  • csdnsevenn
  • 2018年01月29日 00:00
  • 2696

分页关键DbDataAdapter.Fill(DataSet, int startRecord, int maxRecords)

使用 DataSet 和源表名称、命令字符串以及命令行为,在 DataSet 的指定范围中添加或刷新某些行以使它们与数据源中对应的行相一致。protected virtual int Fill( D...
  • ericfine
  • ericfine
  • 2004年07月25日 14:51
  • 2102

SqlDataAdapter.Fill(DataSet,String) 第二个参数的作用

C#里sqlDataAdapter.fill(DataSet,String)的用法。第二个参数是用来干什么的MSDN没看明白,请求高手说详 答: 第二个参数 String是指定DataSet 里...
  • xjincxiazai
  • xjincxiazai
  • 2016年11月15日 13:05
  • 45

一个bug的成本

我想说的当然不是一个bug价值多少钱,因为软件行业因行业不同,公司不同,业务不同,你的软件价值也不同;其实bug用价值来形容当然不合适,更应该用损失或者公司的支出来形容了。         写出本文...
  • xingyu_qie
  • xingyu_qie
  • 2016年03月15日 10:44
  • 1116

修改bug的一个小故事

今天在网站上看见一个故事,很有趣,但也值得思考:那还是80年代初期,我爸爸在一家存储设备公司工作,这个公司现在已经不存在了,它生产磁带机和驱动这些磁带高速运转的气动系统 —— 这是那个时代的产物。他们...
  • qq_25673113
  • qq_25673113
  • 2016年09月09日 15:23
  • 206

VS自动生成的DataSet中Fill方法(追加记录的实现)

       在VS2008中向一个winform project中加入一个绑定数据源的时候,IDE会自动生成一个相应的dataSet.xsd文件,这个文件的用途就是相当于封装了一层数据源,我们可以直...
  • cisee
  • cisee
  • 2008年12月10日 11:24
  • 2037

SqlDataAdapter对象的Fill(dataset,datatable)方法中的dataTable

今天看到有人问了个问题,和我的想法差不多,贴出来大家共享。 ado.net中SqlDataAdapter对象的Fill()方法()中的2个参数是什么意思? [ 标签:sqldataad...
  • lllljz
  • lllljz
  • 2012年04月26日 16:52
  • 3981
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SqlHelper.FillDataset 的一个 Bug
举报原因:
原因补充:

(最多只允许输入30个字)