http://stackoverflow.com/questions/1574492/how-does-getschematable-work

The implementation of IDataReader.GetSchemaTable() is up to the provider - so it will vary. You can write your own providers and do it any way you want.

To be honest this is bad bit of design in the framework - you should never have interface methods that return an untyped DataTable or DataSet as that result could contain anything. Kinda defeats the point of constraining it by an interface in the first place: "you must have a method that returns DataTable but we don't care what rows or columns it has"

Even if the provider is SQL GetSchemaTable() doesn't go back to the [syscolumns] or [sysobjects]. That would be an additional DB call, require additional privileges and not work anyway, as the result set doesn't need to reflect any objects in the DB.

I'm not certain, but I'd expect the vast majority of IDataReader.GetSchemaTable() implementations to read some properties of the meta data held with the result set.

http://axislover.blog.163.com/blog/static/10776515200742792722670/

public static DataTable ConvertDataReaderToDataTable(SqlDataReader dataReader)
        {
            //把那个DataReader转化成DataTable。
            DataTable datatable = new DataTable();
            DataTable schemaTable = dataReader.GetSchemaTable();
            //动态添加列
            try
            {
                foreach (DataRow myRow in schemaTable.Rows)
                {
                    DataColumn myDataColumn = new DataColumn();
                    myDataColumn.DataType = myRow[0].GetType();
                    myDataColumn.ColumnName = myRow[0].ToString();
                    datatable.Columns.Add(myDataColumn);
                }
                //添加数据
                while (dataReader.Read())
                {
                    DataRow myDataRow = datatable.NewRow();
                    for (int i = 0; i < schemaTable.Rows.Count; i++)
                    {
                        myDataRow[i] = dataReader[i];
                        Type type = dataReader[i].GetType();
                        switch (type.Name)
                        {
                            case "String":
                                myDataRow[i] = (string)dataReader[i];
                                break;
                            case "Int16":
                                myDataRow[i] = (short)dataReader[i];
                                break;
                            case "Int32":
                                myDataRow[i] = (int)dataReader[i];
                                break;
                            case "Int64":
                                myDataRow[i] = (long)dataReader[i];
                                break;
                            case "DateTime":
                                myDataRow[i] = (DateTime)dataReader[i];
                                break;
                            case "Decimal":
                                myDataRow[i] = (decimal)dataReader[i];
                                break;
                            case "Char":
                                myDataRow[i] = (char)dataReader[i];
                                break;
                            case "Double":
                                myDataRow[i] = (double)dataReader[i];
                                break;
                            default:
                                myDataRow[i] = dataReader[i];
                                break;
                        }
                    }
                    datatable.Rows.Add(myDataRow);
                    myDataRow = null;
                }
                schemaTable = null;
                dataReader.Close();
                return datatable;
            }
            catch (Exception ex)
            {
                Error.Log(ex.ToString());
                throw new Exception("转换出错出错!", ex);
            }
        }

http://www.cnblogs.com/puresoul/archive/2010/06/29/1767333.html

http://weijingnawjn.blog.163.com/blog/static/3719707720091129101023132/

http://blog.csdn.net/jianxiong8814/article/details/2221635

最新文章

  1. Android 学习笔记之二——开启闪光灯
  2. HDU 1524 A Chess Game【SG函数】
  3. ASP.NET MVC 网站开发总结(五)——Ajax异步提交表单之检查验证码
  4. Baraja演示15种不同的洗牌特效
  5. iOS数据本地持久化
  6. Error on SVN checkout:SSL handshake failed
  7. ImageLoader的使用
  8. Python学习日记:day6----小知识点总结
  9. 关于MySQL-python-1.2.3.tar.gz安装失败的解决方案
  10. mvc部分视图转换成html字符串
  11. [UE4]在蓝图中设置图片
  12. Expressions入门示例
  13. Salesforce随笔: 将Visualforce Page渲染为PDF文件(Render a Visualforce Page as a PDF File)
  14. H5 Day1 练习
  15. redis 使用管道提升写入的性能[pipeline]
  16. iOS AOP编程思想及实践
  17. 学习sbtenv
  18. 【Loj#535】花火(线段树,扫描线)
  19. [Gradle] 如何强制 Gradle 重新下载项目的依赖库
  20. PHP - 输出缓存 - 关于ob系列函数和flush函数

热门文章

  1. python学习2(转载)
  2. java——极简handler机制
  3. java——为什么要有接口?和抽象类有什么不一样?
  4. T-SQL 聚合函数Count与NULL
  5. jsp中判断if 和 else
  6. Neutron命令测试1
  7. 牛客网Java刷题知识点之父类中的私有内容,子类是否具备? 子类不可直接,但可间接访问父类中的私有内容?
  8. 几个CSS的黑科技
  9. Spring Boot实战(1) Spring基础
  10. OC与JS交互之UIWebView