【发布时间】:2014-05-12 19:43:27
【问题描述】:
我正在使用 C# EzAPI 构建动态 SSIS 包,并且我想将元数据映射存储在 SQL Server 表中。
我在将分隔符(例如“\t”)和 EOL 字符(“\r\n”)从表中拉入 C# 时遇到问题。
这是我要开始工作的代码行:
flatFileColumn.ColumnDelimiter = columns.GetUpperBound(0) ==
Array.IndexOf(columns, column) ? SqlValuesDictionary["EndOfLineChar"] : SqlValuesDictionary["Delimiter"];
这些字典值是我从 SQL Server 数据读取器中检索到的字符串,如下所示:SqlValuesDictionary["Delimiter"] = DataReader["Delimiter"].ToString()其中分隔符是包含"\t" 的列。
所以问题是当我从 SQL Server 读取这个值时,它似乎正在转义每个引号和\,并导致当我真的想要一个文字“\t”作为制表符分隔符时值发生变化。
所以当我将代码更改为:
flatFileColumn.ColumnDelimiter = columns.GetUpperBound(0) ==
Array.IndexOf(columns, column) ? "\r\n" : "\t";
效果很好。
调试器没有太大帮助,因为它似乎显示了甚至不存在的转义,因此尝试替换额外的 \s 无济于事。
在调试器中,当文字表值为"\t" 时,SqlValuesDictionary["Delimiter"] 的值显示为"\"\\t\""。当我将表值更改为\t 时,调试器将其显示为"\\t",但仍然失败。
谁能给我一个更好的方向来解决这个问题?也许我的做法是错误的。对于那些关注 SQL 注入的人,这些表将仅由内部员工严格控制。
澄清和总结:我可以在 SQL 表中放入什么值,以及如何在 C# 中检索它以等同于 var tab = "\t"
【问题讨论】:
-
您遇到的具体问题是什么?
SqlValuesDictionary是什么? -
C# 将 "\t" 正确解释为选项卡,我希望能够从表中读取它。它只是一个
用于存储 sql 表中的数据。 -
C# 将
\t解释为仅在字符串文字中的制表符。当它来自数据库时,该序列没有什么特别之处。 -
不知何故,在数据阅读器中从数据库中读取值使其与我从字面上键入它不同。那就是问题所在。当我在 C# 中键入“\t”时,它会将其解释为制表符的符号并且工作正常。当我使用数据读取器从数据库中提取 nvarchar 值 \t 或 "\t" 并转换为字符串时,它会将其解释为带有转义符 "\\t" 或 \"\\t\" 的文字字符串,这不是我想要什么。
-
字符串实际上没有有转义。这只是字符串。想一想——为什么从外部读取的数据会遵循与 C# 语言中的字符串文字相同的语法规则?为什么它不遵循 VB.NET 或 Java 的规则?甚至是 T-SQL?事实上,数据就是数据。
标签: c# sql c#-4.0 ssis sqldatareader