如何获取一个表结构
用C#如何获取一个表结构,并放到dataset中
如:
列名 字段类型 长度
c1 varchar 50
c2 int 4
c3 datetime 8
…………………………
[解决办法]
直接根据格式新建一个 DataTable,然后放到一个 DataSet 不是很好吗?
如果已有一个 DataTable,使用 DataTable.Clone() 可以复制结构,不包括数据。
[解决办法]
sp_help tablename
[解决办法]
执行sp_help tablename 之后会返回一个dataset
其中第二个datatable就是你想要的,但是要注意length,比如nvchare类型,表里的长度为50,在这个datatable里面会显示100
[解决办法]
jxzhang615(冰河) 正解
[解决办法]
不错的方法,受教了
[解决办法]
1.如果这个表(假如名是dt)已经存在,就用DataTable dt1=dt.Clone()
2.如果不存在:
DataTable dt1=new DataTable();
dt1.Columns.Add( "c1 ",typeof(string));
dt1.Columns.Add( "c2 ",typeof(int));
dt1.Columns.Add( "c3 ",typeof(DateTime));
DataSet.Tables.Add(dt1)
[解决办法]
string myConnString = "Provider=SQLOLEDB;Data Source=server;Initial Catalog=Duwamish7;Integrated Security=SSPI;Connect Timeout=30 ";
OleDbConnectionconn = new OleDbConnection(myConnString);
DataSetds = new DataSet();
using (conn)
{
conn.Open();
//取表
DataTable dataTalbeschema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
new Object[]{ null, null, null, "TABLE " } );
//取表结构
foreach (DataRow tableRow in dataTalbeschema.Rows)
{
String tableName = tableRow[ "Table_Name "].ToString();
string sql = "select * from " + tableName ;
OleDbDataAdapter oda= new OleDbDataAdapter(sql,conn);
oda.MissingSchemaAction = MissingSchemaAction.AddWithKey;
oda.FillSchema(ds,SchemaType.Mapped,tableName);
}
//添加Relation
DataTable dtfk = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Foreign_Keys,null );
foreach (DataRow fkRow in dtfk.Rows)
{
String fkName = fkRow[ "Fk_Name "].ToString();
DataColumn parentColumn = ds.Tables[fkRow[ "Pk_Table_Name "].ToString()].Columns[fkRow[ "Pk_Column_Name "].ToString()];
DataColumn childColumn = ds.Tables[fkRow[ "Fk_Table_Name "].ToString()].Columns[fkRow[ "Fk_Column_Name "].ToString()];
ds.Relations.Add(fkName,parentColumn,childColumn);
}
conn.Close();
}
[解决办法]
SELECT
表名 = case when a.colorder=1 then d.name else ' ' end,
表说明 = case when a.colorder=1 then isnull(f.value, ' ') else ' ' end,
字段名 = a.name,
主键 = case when exists(SELECT 1 FROM sysobjects where xtype= 'PK ' and parent_obj=a.id and name in (
SELECT name FROM sysindexes WHERE indid in(
SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid))) then '√ ' else ' ' end,
类型 = b.name,
占用字节数 = a.length,
长度 = COLUMNPROPERTY(a.id,a.name, 'PRECISION '),
默认值 = isnull(e.text, ' '),
字段说明 = isnull(g.[value], ' ')
FROM
syscolumns a
left join
systypes b
on
a.xusertype=b.xusertype
inner join
sysobjects d
on
a.id=d.id and d.xtype= 'U ' and d.name <> 'dtproperties '
left join
syscomments e
on
a.cdefault=e.id
left join
sysproperties g
on
a.id=g.id and a.colid=g.smallid
left join
sysproperties f
on
d.id=f.id and f.smallid=0
where
d.name= 'LW_Equipment_Stock_List ' --如果只查询指定表,加上此条件
-----------------------
获取表内所有字段
Select Name From SysColumns Where ID=OBJECT_ID( 'table1 ') Order By ColID
[解决办法]
直接用Sql去查你要的字段就可以了,比如:
SELECT b.*
FROM sysobjects a INNER JOIN
syscolumns b ON a.id = b.id
WHERE (a.name = 'tablename ')