0

C#アプリケーションでMySQL Connector / NETを使用ExecuteReaderし、DataTableのメソッドとExtentionを使用してストアドプロシージャを呼び出し、それを埋める場合。コードは次のとおりです。

            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

このコードの問題は、同じテーブル名から2回選択した場合、データセットでどの名前を取得するかわからないことです(同じテーブル名が2回使用されるため、エラーが発生する可能性があります。たとえば、ストアドプロシージャ:

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

拡張機能には、おそらく同じテーブル名('DUAL')が2回表示されます。私は自分の手順でテーブル名が何であるかをほのめかしたくありません、私は次のことを試みました:

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

しかし、これは機能しません。これに対する回避策はありますか?

4

0 に答える 0