【问题标题】:How to avoid the single quote within a column value如何避免列值中的单引号
【发布时间】:2014-06-10 21:12:58
【问题描述】:

我有以下代码遍历 CSV 文件并写入 SQL 表:

foreach (string line in lines.Skip(1))
{
     var sqlfmt = "INSERT INTO [" + tab + "] values ({0})";
     var insert = string.Format(sqlfmt, line.Replace("\"", "'"));

     MessageBox.Show(insert + "");

     SqlCommand ty = new SqlCommand(insert, myConnection);
     ty.ExecuteNonQuery();
}

我现在遇到的问题是,如果其中一列在我的应用程序崩溃的文本中包含 '

避免该问题的最佳方法是什么?

【问题讨论】:

  • @David:这不是链接问题的副本
  • @Cory - 你是对的。我重新打开了它。但是,正如您在下面的评论中指出的那样,使用参数化查询而不是转义字符串是解决此问题的正确答案,因此首先关闭它很难感觉太糟糕。
  • @DavidStratton:我同意 :)

标签: c# sql sql-server csv


【解决方案1】:

只是改变

var insert = string.Format(sqlfmt, line.Replace("\"", "'"));

收件人:

var insert = string.Format(sqlfmt, line.Replace("'", "''").Replace("\"", "'"));

原因是在 T-SQL(SQL Server 的 SQL 版本)中,字符串中的单引号被另一个单引号转义。例如,如果您想正确引用字符串 Bob's quotes',则正确转义的 SQL 字符串将是 'Bob''s quotes'''

【讨论】:

  • 谢谢。我会试试看。
  • 另外我想提一下,准备好的语句是首选的方式。它们通过为您处理所有字符转义情况来防止 SQL 注入。在此处查看示例:msdn.microsoft.com/en-us/library/…
  • 一旦它工作,我将把所有东西都转移到参数中。谢谢。
  • @Cory 这是一个很好的观点。存储过程甚至更好。
  • @SearchForKnowledge,有趣的方法。从困难、复杂的方式开始,一旦奏效,就换成更简单的方式。
猜你喜欢
  • 2018-11-07
  • 1970-01-01
  • 2016-05-20
  • 2015-03-24
  • 2021-06-30
  • 2022-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多