2011-11-24 81 views
1

我想使用C#检索表模式信息。使用C#检索表模式信息

我使用sp_help <table_name>查询来检索它,这在我在查询窗口中执行它时效果很好,但无法从C#中检索它。只是我想找回这是必要的两个表,如名称,数据类型,大小,值isPrimary,密钥等

我不得不写下之间的映射表中的所有信息,下面的代码

SqlCommand cmd = sourceCon.CreateCommand(); 
cmd.CommandText = string.Format("sp_help '{0}'", cmbSourceTable.SelectedItem.ToString()); //cmd.CommandType = CommandType.StoredProcedure; 
sourceDataTable = new DataTable(); 
SqlDataReader dr = cmd.ExecuteReader(); 
sourceDataTable.Load(dr); 
dr.Close(); 

它将回报关于表的信息,当它被创建或不是

+0

请显示不起作用的代码。 – jeroenh

+0

我写下了以下代码 SqlCommand cmd = sourceCon.CreateCommand(); cmd.CommandText = string.Format(“sp_help'{0}'”,cmbSourceTable.SelectedItem.ToString()); //cmd.CommandType = CommandType.StoredProcedure; sourceDataTable = new DataTable(); SqlDataReader dr = cmd.ExecuteReader(); sourceDataTable.Load(dr); dr.Close(); 它只会返回关于表格的信息,当它被创建或没有时 – Awadhendra

+0

Awadhendra - 您可以编辑问题以澄清事情 - 我已将您的评论中的代码复制到您的问题中... – Murph

回答

1

我有一个简单的方法来获取表的模式。 只需创建与任何提供程序(如SqlConnection对象)的连接即可。 为选择查询创建一个命令对象(只选择最前面的1条记录,因为您只需要表的模式) 执行那个返回DataReader对象的查询。 每个DataReader对象都有一个名为GetTableSchema()的方法,该方法返回具有精细表格模式的DataTable对象。

通过这种方式,您可以轻松地获取任何表格的模式。

在这里,我将提供一个简单的代码,这

SqlConnection con=new SqlConnection("connString"); con.Open(); SqlCommand cmd= new SqlCommand("select top(1) * from Person.Address",con); DataTable table = cmd.ExecuteReader().GetTableSchema();

现在这个表对象有Person.Address表的架构信息。

+0

你实际上可以使用'TOP 0'而不返回任何实际的行。 –

0

sp_help不能在你的代码中工作?也许你需要包含一个execute语句:exec sp_help。或者应用程序在没有sp_help权限的帐户下运行。

1

我觉得sp_help返回多个结果集,所以你需要使用NextResult,还有更多的细节在这里 - http://support.microsoft.com/kb/311274(这个例子并不是sp_help具体但它应该给你的总体思路)

3

而不是使用的sp_help,你可以尝试以下选项:

1)使用INFORMATION_SCHEMA.COLUMNS观点:

SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'YourTable' 

2)查询SYS.COLUMNS

SELECT c.*, t.name 
FROM sys.columns c 
    JOIN sys.types t ON c.user_type_id = t.user_type_id 
WHERE c.object_id = OBJECT_ID('YourTable') 

这些只是2个选项,将retu一个结果集。 INFORMATION_SCHEMA.COLUMNS不会告诉你(例如)一列是否是一个IDENTITY列,而sys.columns路径在哪里。有更多的信息可以从目录视图中获得,只取决于您需要的其他信息。这是MSDN reference

1

另外,您可以使用SqlConnection中的GetSchema方法。 http://msdn.microsoft.com/en-us/library/ms136367.aspx

像这样:

var tableSchema = con.GetSchema(SqlClientMetaDataCollectionNames.Tables, new string[] { null, null, "[tableName]" }); 

字符串数组是一个“过滤器”,在这里你可以找到你可以筛选列:http://msdn.microsoft.com/en-us/library/ms254969.aspx

对于其他数据库服务器和更多的信息: http://msdn.microsoft.com/en-us/library/kcax58fh.aspx