郁闷,上一帖没人回答,开帖再问:有关于读取数据库表结构信息的问题

OriesMap 2006-06-01 02:03:55
所用的Sql语句如下(就是在CSDN论坛找到的经典算法):

SELECT 表名 = d.name , 字段名= 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.xtype,

长度 = COLUMNPROPERTY(a.id,a.name,'PRECISION'), --有问题的地方
小数位数 = isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0), --有问题的地方

允许空 = case when a.isnullable=1 then '√'else '' end FROM AccountPayableDB..syscolumns a left join AccountPayableDB..systypes b on a.xusertype=b.xusertype inner join AccountPayableDB..sysobjects d on a.id=d.id and d.xtype='U' and d.name<>'dtproperties' left join AccountPayableDB..syscomments e on a.cdefault=e.id left join AccountPayableDB..sysproperties g on a.id=g.id and a.colid=g.smallid left join AccountPayableDB..sysproperties f on d.id=f.id and f.smallid = 0 order by a.id,a.colorder

我在查询分析器中试过,结果是没问题的,但是在c#中用sqlDataAdapter填充到DataTable后,
dataTable中“长度”一列结果都为System.DBNull, 小数位数都是0。

怎样才能解决这个问题
...全文
416 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
lw8122 2006-07-01
  • 打赏
  • 举报
回复
收藏一下
zjcxc 2006-06-06
  • 打赏
  • 举报
回复
:D
CCjian 2006-06-05
  • 打赏
  • 举报
回复
LZ多试试就知道了,先用简单例子测,
OriesMap 2006-06-05
  • 打赏
  • 举报
回复
To:肥羊 与 CCjian(默契)

以前也真的不知道SqlDataReader里的GetSchemaTable方法,因为我极少数用SqlDataReader(汗一个)。

我刚才大概看了一下,觉得这个方法确实不错。不知道他一下子能不能读出所有用户数据库中用户表的结构信息。我将来还要用这个信息反向数据的。

谢谢关注。
OriesMap 2006-06-05
  • 打赏
  • 举报
回复
这一段Sql代码是邹建写的,问题也是他帮助我解决了。解决的办法见:
http://blog.csdn.net/zjcxc/archive/2005/08/24/463973.aspx?Pending=true

mqmmx 2006-06-02
  • 打赏
  • 举报
回复
你一样要填DataTable,为什么不用SqlDataReader里的GetSchemaTable方法。还省得写这么复杂的sql一句select就行了。
CCjian 2006-06-02
  • 打赏
  • 举报
回复
to mqmmx(传说中的肥羊)
嗯,是个不错的点子,值得一学,
但有时还是要温故下SQL的,路通了,才好找捷径走嘛,呵呵
RyanLove 2006-06-02
  • 打赏
  • 举报
回复
jf
kssys 2006-06-01
  • 打赏
  • 举报
回复
哦,可变的指的是float/Double等类型,如果是decimal不会有这种问题。那么SQL可以改为以下:

SELECT SO.Name AS 表名,SC.Name AS 字段名,'' AS 主键,ST.Name AS 类型,
SC.Length AS 长度,SC.xScale AS 小数位数,
(CASE SC.IsNullable WHEN 0 THEN '是' ELSE '否' END) AS 允许空
FROM SysObjects SO
INNER JOIN SysColumns SC ON SC.ID=SO.ID
LEFT JOIN SysTypes ST ON ST.xType=SC.xType
OriesMap 2006-06-01
  • 打赏
  • 举报
回复
小数位长度是可变的是什么意思?比如说我设了一个字段为
decimal(18,4)或numeric(18,2),不可能下回变成了decimal(18,3)或numeric(18,3)吧。
kssys 2006-06-01
  • 打赏
  • 举报
回复
小数位长度是可变的。如float/Double等。无法确定,如果要确定小数位,请使用Decimal类型

SP_PKeys 是系统内置的。
OriesMap 2006-06-01
  • 打赏
  • 举报
回复
我只需要数据库表结构的信息,不要存储过程与自定义函数什么的。
OriesMap 2006-06-01
  • 打赏
  • 举报
回复
To: kssys()

谢谢你。小数位数是有用的。因为往数据库中写记录时不同长度的小数位数,肯定结果会不一样。是不是。再谢谢你。
kssys 2006-06-01
  • 打赏
  • 举报
回复
主鍵和小數位需要再處理,其它的可一次性出來。

另小數位=?沒有什麼作用吧?

SELECT SO.Name AS 表名,SC.Name AS 字段名,'' AS 主鍵,ST.Name AS 類型,
SC.Length AS 長度,0 AS 小數位數,
(CASE SC.IsNullable WHEN 0 THEN '是' ELSE '否' END) AS 允許空
FROM SysObjects SO
INNER JOIN SysColumns SC ON SC.ID=SO.ID
LEFT JOIN SysTypes ST ON ST.xType=SC.xType
OriesMap 2006-06-01
  • 打赏
  • 举报
回复
比如我查询出这样的结果,

表名 字段名 主键 类型 长度 小数位数 允许空


还有没有别的简单的方法。我看有许多人都这些语句太长了。
OriesMap 2006-06-01
  • 打赏
  • 举报
回复
to:dgrwang()
我在查询分析器中试过,数据正确的。

至于语句有点长,这也难怪,因为我也不太懂这些语句。这些语句是从csdn.net中搜出来的代码。
kssys 2006-06-01
  • 打赏
  • 举报
回复
主鍵可以使用:sp_PKeys TableName獲取
kssys 2006-06-01
  • 打赏
  • 举报
回复
至於你的小數,是不需要的。

也可以通過以下語句獲取相關欄位信息:
SELECT *
FROM SysColumns
WHERE ID=Object_ID(TableName)
dgrwang 2006-06-01
  • 打赏
  • 举报
回复
如果你查出来的数据正确,不会有DBNull的问题,除非为空
  • 打赏
  • 举报
回复
这个语句有点长。。
加载更多回复(5)

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧