【问题标题】:Having Trouble Pulling a Value with Quotes from SQL Server Table in C#在 C# 中从 SQL Server 表中提取带引号的值时遇到问题
【发布时间】: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


【解决方案1】:

我也遇到了同样的问题。

找到了两种合理的解决方法:

A:在表格中插入一个实际的<cr><lf>

UPDATE [EzAPI_Meta].[ezapi].[FlatFile]
   SET [RowDelimiter] = CHAR(13)+CHAR(10)

I think it's a problem that you can't see those characters when you look at the table.

B:所以我最终替换了我的 C# 代码中的字符:

RowDelimiter.Replace("\\r\\n", "\r\n").Replace("{CR}{LF}", "\r\n");

With this one you can enter "\r\n" or "{CR}{LF}" as plain text in your table 

【讨论】:

    猜你喜欢
    • 2021-07-28
    • 2018-11-29
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多