0

当我在我的 C# 应用程序中使用 MySQL 连接器/NET 并使用它调用存储过程时,我使用ExecuteReaderDataTable 上的方法和扩展来填充它。这是代码:

            using (IDataReader reader = db.ExecuteReader(cmd))
            {
                DataTable dt;
                while (!reader.IsClosed)
                {
                    dt = new DataTable();
                    Extensions.Fill(dt, reader, true);
                    ds.Tables.Add(dt);
                } if(!reader.IsClosed) reader.NextResult();
            }

和扩展:

public static class Extensions
{
    #region Extensions
    public static void Fill(this DataTable table, IDataReader reader, bool createColumns)
    {
        if (createColumns)
        {
            table.Columns.Clear();
            var schemaTable = reader.GetSchemaTable();
            foreach (DataRowView row in schemaTable.DefaultView)
            {
                var columnName = (string)row["ColumnName"];
                var type = (Type)row["DataType"];
                table.Columns.Add(columnName, type);
            }
        }
        table.Load(reader);
    }

    #endregion

这段代码的问题是,如果你从同一个表名中选择两次,你不知道它在数据集中得到了哪个名字(可能是一个错误,因为同一个表名被使用了两次。例如存储过程:

CREATE PROCEDURE `test`.`mytestproc` ()
BEGIN
    SELECT NOW() FROM DUAL;
    SELECT NOW() FROM DUAL;
END

扩展可能会看到相同的表名 ('DUAL') 两次。我不想在我的程序中提示表名是什么,我尝试了以下操作:

CREATE PROCEDURE `test`.`mytestproc` ()
BEGIN
    SELECT * FROM (SELECT NOW() FROM DUAL) a;
    SELECT * FROM (SELECT NOW() FROM DUAL) b;
END

但这不起作用。有解决方法吗?

4

0 回答 0