您的位置:首页 > 数据库 > MySQL

.net core 2.0 下,用C#自创实现MysqlHelper的ExecuteDataTable 功能[2017-10-30]

2017-10-30 13:04 507 查看
如何在.net core 2.0环境下填充DataTable?

目前(2017-10-30),mysql 提供的.net core 2.0的 MySql.Data.MySqlClient.MysqlHelper 类尚未实现ExecuteDataTable()或ExecuteDataSet()等功能,MysqlDataReader.GetSchemaTable()也没有推出。自己试着用DataTable.Load(DataReader)这样的方法也告失败。

本人经过摸索,用MysqlDataReader读出一行数据后,获取到各个列的数据类型,然后据此构造DataTable,从而曲线实现了ExecuteDataTable()的功能。

注意:此技术路线的缺陷是,如果查询结果无数据,则无法获取到DataTable中各列的数据类型。

现贴出代码共享给大家。

using System;

using System.Data;

using MySql.Data.MySqlClient;

/// <summary>

/// 作者:蔡延曦

/// 2017-10-30

/// </summary>

class MysqlHelpercyx

{

    /// <summary>

    /// 利用MysqlDataReader曲线构造并填充DataTable

    /// </summary>

    /// <param name="connectionString"></param>

    /// <param name="sql"></param>

    /// <returns></returns>

    public static DataTable ExecuteDataTable(string connectionString, string sql)

    {

        DataTable dt = new DataTable();

        MySqlDataReader dr = MySqlHelper.ExecuteReader(connectionString, sql);

        try

        {

            int fieldCount = dr.FieldCount;

            //获取schema并填充第一行数据

            if (dr.Read())

            {                

                    for (int i = 0; i < fieldCount; i++)

                {

                    string colName = dr.GetName(i);

                    dt.Columns.Add(colName, dr[i].GetType());

                }

                DataRow newrow = dt.NewRow();

                for (int i = 0; i < fieldCount; i++)

                {

                    newrow[i] = dr[i];

                }

                dt.Rows.Add(newrow);

            }

            

            //填充后续数据

            while (dr.Read())

            {

                DataRow newrow = dt.NewRow();

                for (int i = 0; i < fieldCount; i++)

                {

                    newrow[i] = dr[i];

                }

                dt.Rows.Add(newrow);

            }

            dt.AcceptChanges();

        }

        catch (Exception e1)

        {

            Console.WriteLine(e1.Message);

            //throw;

        }

        finally

        {

            dr.Close();

        }

        return dt;

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息