当我在我的 C# 应用程序中使用 MySQL 连接器/NET 并使用它调用存储过程时,我使用ExecuteReader
DataTable 上的方法和扩展来填充它。这是代码:
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
但这不起作用。有解决方法吗?