我有以下C#代码,我试图返回存储过程结果以及这些结果的模式。以下是我的代码(简化)目前的样子......
Database db = DatabaseFactory.CreateDatabase();
DbCommand dbCommand = db.GetStoredProcCommand("MyStoredProcedure");
IDataReader drData = db.ExecuteReader(dbCommand);
DataTable tblSchema;
tblSchema = drData.GetSchemaTable();
GetSchemaTable返回空。我已经读过我需要将CommandBehavior.KeyInfo传递给ExecuteReader方法但是我不清楚这是如何看待我的代码结构,因为我将dbCommand传递给ExecuteReader。
答案 0 :(得分:1)
如果您正在使用System.Data.Common.DbCommand,那么,我认为您可以调用
IDataReader drData = dbCommand.ExecuteReader(CommandBehavior.KeyInfo);
<强> [编辑] 强>
您也可以使用
DataSet ds = new DataSet();
db.LoadDataSet(dbCommand, ds, "tableName");
或
db.ExecuteDataSet
这是一个有用的link
希望它能回答你的问题
答案 1 :(得分:1)
获取SQL Server存储过程的架构的最佳方法是使用sql:
EXEC sp_help MyStoredProcedure
请参阅http://msdn.microsoft.com/en-us/library/aa933429(SQL.80).aspx
答案 2 :(得分:1)
尴尬的旧代码时间。这是我第一次学习.NET 1.1时使用的,而那个教我的人坚持使用DataSets / Tables而不是业务对象。它大概有5年了,并且从一个旧库中删除了,但是给定一个表名,它会给你一个包含表模式的数据集。
public static DataSet GetTableSchema(string tableName)
{
string query = string.Format("SELECT TOP 0 * FROM {0}", tableName);
using (SqlConnection localSqlConn = new SqlConnection(GetConnectionString()))
{
DataSet ds = new DataSet();
SqlCommand sqlCmd = new SqlCommand(query, localSqlConn);
SqlDataAdapter sda = new SqlDataAdapter(sqlCmd);
sda.FillSchema(ds, SchemaType.Source, tableName);
sda.Fill(ds, tableName);
sda.Dispose();
return ds;
}
}
答案 3 :(得分:1)
更好的答案如下: 2013 Microsoft Support 本文展示了检索表信息的多种方法,这里有一种方法。
SqlConnection cn = new SqlConnection();
SqlCommand cmd = new SqlCommand();
DataTable schemaTable;
SqlDataReader myReader;
//Open a connection to the SQL Server Northwind database.
cn.ConnectionString = "Data Source=server;User ID=login;
Password=password;Initial Catalog=Northwind";
cn.Open();
//Retrieve records from the Employees table into a DataReader.
cmd.Connection = cn;
cmd.CommandText = "SELECT * FROM Employees";
myReader = cmd.ExecuteReader(CommandBehavior.KeyInfo);
//Retrieve column schema into a DataTable.
schemaTable = myReader.GetSchemaTable();
//For each field in the table...
foreach (DataRow myField in schemaTable.Rows){
//For each property of the field...
foreach (DataColumn myProperty in schemaTable.Columns) {
//Display the field name and value.
Console.WriteLine(myProperty.ColumnName + " = " + myField[myProperty].ToString());
}
Console.WriteLine();
//Pause.
Console.ReadLine();
}
//Always close the DataReader and connection.
myReader.Close();
cn.Close();