获取表的SQL Server架构

时间:2009-04-08 14:58:16

标签: c# .net sql ado.net schema

我有以下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。

4 个答案:

答案 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();