当我在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
这段代码的问题是,如果你从同一个表名中选择两次,你就不知道它在数据集中得到了哪个名字(可能是一个错误,因为同一个表名被用了两次。 例如,存储过程:
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
但这不起作用。有解决方法吗?