一个sql以for xml path('') 读取数据只在一个单元格中 但是读取到dataset的时候 就分成两行了 这是什么情况。 还有就是用excuteScalar 读取也只读取到一部分 ,而且这一部分 和dataset中读取的第一行一致。
sql语句直接在sql server读出的数据如 这样子 AAAAAAABBBBBBB
但是利用 sqldataapdater填充到dataset中就成了 AAAAAAA
BBBBBBB
这样子两行 这是为什么, 我查看了这个dataset的列的最大长度,是足够的 。
有谁遇到过这种情况 是哪边出了问题么
找到问题的根源了 不是sql语句的问题 也不是什么转义字符的问题 而是微软对 for xml path的机制问题 还是谢谢各位的时间
The XML data row is truncated at 2,033 characters when you use the
SqlDataReader object
也就是它最多支持2033个字符?超过就换行是吗?
@幕三少: 嗯
官方解释:
如果您使用 ExecuteReader 或 BeginExecuteReader 访问 XML 数据,SQL Server 将以多行(每行 2,033 个字符)方式返回长度大于 2,033 个字符的所有 XML 结果。 若要避免发生此行为,请使用 ExecuteXmlReader 或 BeginExecuteXmlReader 读取 FOR XML 查询。 有关更多信息,请参见位于 http://support.microsoft.com 上的 Microsoft 知识库中的文章 Q310378“PRB: XML Data Is Truncated When You Use SqlDataReader”(PRB:使用 SqlDataReader 时 XML 数据被截断)
没整明白什么意思……
比如说下面的数据,用sql连接各种表 读出来是一行的:
组装1车间H区组装1课05线9点未点检设备如下:笔记本(YM00412120015),笔记本(YM00412120020),显示器(YM00312120038),显示器(YM00312120045),主机(YM00112120074),显示器(YM00312120049),主机(YM00112120077),显示器(YM00312120061),显示器(YM00312120066),主机(YM00112120091),显示器(YM00312120075),主机(YM00112120112),主机(YM00112120130),笔记本(YM00412120051),笔记本(YM00412120054),笔记本(YM00412120058),笔记本(YM00412120060),笔记本(YM00412120061),笔记本(YM00412120063),主机(YM00112120174),主机(YM00112120217),显示器(YM00312120210),显示器(YM00312120269),笔记本(YM00412120122),显示器(YM00312120343),电动螺丝刀(YF00112120011),电动螺丝刀(YF00112120047),自动胶带机(YF00712120018),感应式离子风蛇(YE00612120018),感应式离子风蛇(YE00612120038),电子秤(YH00112120005),电子秤(YH00112120017),静电手环测试仪(YH00612120005),烙铁测温仪(YH00712120005),可程式电源(YH00912120021),可程式电源(YH00912120028),可程式电源(YH00912120054),BERING 锁附治具(YL00312120352),VODKA引线焊接工装(YL00112120290),VODKA引线焊接工装(YL00112120291),PACER-X 螺丝锁附工装(YL00312120381),Pacer-X 锁附治具(YL00312120392),Pacter-X压合工装(YL00312120397),USB线贴标签(YL00412120102),接地弹簧插座焊接工装(YL00112120454),金属底座组装治具(YL00312120510),上盖组装治具(YL00312120511)
但是 在程序里用 ado.net 填充到dataset中 确变成两行了 ;
@mushishi: 你这数据是怎么进去的?是不是Excel倒进去的啊?
@幕三少: 不是 是直接连接各种表组合数据出来的
@mushishi: 我是问你,数据是通过什么方式进数据库的?也就是两个数据之间可能会有/0的存在,你好检查下
@幕三少: /0 这个有什么影响? 我数据是分布在很多个表里面的 我是连接各个表的数据来生成一个信息, 和数据怎么进数据库有什么关系 我现在是取数据
@mushishi:
AAAAAAA
BBBBBBB
这是两条数据还是一条数据显示成两行啊?
@幕三少: 一条数据 在dataset中变成两行了
@mushishi: 还是显示问题呗,那你就查数据里面是否包含转义字符
@幕三少: 没有转移字符 这又不是html
@幕三少: 一条数据填充到dataset还会和转移字符有关系么 我这还没有显示到页面去
@mushishi: 显示是看不到的,我前一段时间刚吃过这样的亏,你在查数据库的时候把/或\给过滤掉试下,很大的可能是这回事
@幕三少: 还是说 用了for xml path的话 会有影响
@mushishi: 代码贴出来看下,估计和这关系不大
成为两行,很可能是因为有换行符。
换行符是\n或者\r,转义之后。这个符号在文本中当然看不到,会被翻译成换行。
怎么检查呢?
你就看在A和B之间是个什么字符就行了,比如
string data=dataSet.Table[0].Rows[0]["YourClmName"].ToString(); // “AAAAAA 换行 BBBBB”
然后你在调试的状态下,查看data[7]是什么,这个7就是A和B之间的位置。
没猜错的话,你会看到一个 \n ,它的ascii数值好像是10, 如果是 \r的话,就是13.
\n 是C# 中才会被认为是换行符 在sql server中转义字符是 单引号
还有 我特意加了 \n 并不是根据\n 来换行 数据库里边还是吧\n当做字符串的 除非我直接输出到页面中
@mushishi: 是啊,所以你sqlserver中查看的是一行,在VS中查看的是两行啊
@mushishi: 转义不分什么语言,是文本的显示定义。
你去调试一下就知道结果了。去试试。
@mushishi: 不是 \r或者\n,就是其他符号,试试就知道了。调试之。
@江湖再见: 那位置是逗号 数据我查看了 。。。 如果是转义字符我早搞定了。。。
@mushishi: 依然怀疑是转义字符,因为sql拿到的数据有,那么剩下的就是显示问题了,也就是怎么翻译从sql读取到的数据,只有转义被翻译成换行才解释的通。
@mushishi: 按照你的说法,那个地方是换行,或者A,或者B,不可能是个逗号啊。
@江湖再见: AAAABBBB 只是个描述 真实数据很长的 数据我都直接查看了,就是这样的
@mushishi: 那个逗号的前一个字符?后一个字符?都查看了,两行之间什么都没有?
@江湖再见: 就和 笔记本(YM00412120060), 一样的数据