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
しかし、これは機能しません。これに対する回避策はありますか?