请注意,当我使用“schema”这个词时,我的意思是Schema作为Sql Server提供的安全功能(“dbo”...),如果你想要查询,你必须提供表名。成功,而不是它的元数据(列......)。
我正在使用这段代码来获取表元数据(列,类型等):
// Parameter table includes the schema name.
public DataTable GetTableSchema(string table)
{
var tbl = new DataTable();
using (var conn = new SqlConnection(ConnectionString))
using (var adapter = new SqlDataAdapter(String.Format("SELECT * FROM {0} WHERE 1=0", table), conn))
{
tbl = adapter.FillSchema(tbl, SchemaType.Source);
}
return tbl;
}
我的问题是属性DataTable.TableName
不包含表架构(“dbo”或任何自定义架构),我在对象中找不到允许我获取该信息的任何属性,因此它在进程中丢失(或者我必须将几个变量传递给方法,而我想将所有内容保存在DataTable对象中,这应该是合乎逻辑的。)
我在哪里/如何将其与数据库结构一起使用?
我发现只有解决方案:在返回表格之前添加tbl.TableName = table;
但感觉错误。
答案 0 :(得分:3)
您可以查询INFORMATION_SCHEMA。TABLES视图并从TABLE_SCHEMA字段获取您的信息
"SELECT TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES where table_name = '" + table "'";
目前尚不清楚为什么需要此信息,因此我只建议运行此代码
SqlCommand cmd = new SqlCommand(@"SELECT TABLE_SCHEMA
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = @table", con);
cmd.Parameters.Add("@table", SqlDbType.NVarChar).Value = table;
string schema = (string)cmd.ExecuteScalar();
还有一种替代方案,可以在一次调用中返回您桌面上的一些信息和table_schema
DataTable dt = new DataTable();
dt = cnn.GetSchema("COLUMNS", new string[] { null, null, table, null });
Console.WriteLine(dt.Rows[0]["TABLE_SCHEMA"].ToString());
此代码返回有关您的表以及TABLE_SCHEMA列的大量信息 不确定这种方法是否适合您的目的,因为此处返回的数据表包含每列的行,此DataTable的每列包含有关列的详细信息(如OrdinalPosition,IsNullable,DataType,Character_Maximum_Length)