【问题标题】:Best way to format a string in C# [duplicate]在 C# 中格式化字符串的最佳方法 [重复]
【发布时间】:2015-05-22 08:38:24
【问题描述】:

我有两种格式,如下所示。

格式 1:

printstring = printstring & "---------------------------------------" & vbNewLine

格式 2:

printstring = String.Format("{0}---------------------------------------{1}", printstring, vbNewLine)

代码优化工具建议遵循格式2

这有什么具体原因吗?比如内存消耗或其他原因?

【问题讨论】:

  • 这两行代码根本不做同样的事情......
  • 我会改用parameterized queries
  • 第二行肯定是错的(类似SQL的注入)。第一个我不确定它是否有效......这取决于您向谁提供查询
  • @utility:不,第二种格式确实没有。您仍然只是将字符串放入 SQL 中。 不要这样做。使用参数化 SQL,这就是它的用途。
  • 从非 SQL 点开始,第二个字符串是可行的方法,但对于 SQL,这是最糟糕的方法,您将自己暴露在 SQL 注入攻击中

标签: vb.net visual-studio-2010


【解决方案1】:

您的代码受到 SQL 注入的影响。

字符串格式对于大字符串比字符串连接更有效。它们也更容易阅读。两者都是完全有效的。

要修复你的 sql 注入,你需要参数化你的查询:

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
    //
    // The name we are trying to match.
    //
    string dogName = "Fido";
    //
    // Use preset string for connection and open it.
    //
    string connectionString =
        ConsoleApplication1.Properties.Settings.Default.ConnectionString;
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        //
        // Description of SQL command:
        // 1. It selects all cells from rows matching the name.
        // 2. It uses LIKE operator because Name is a Text field.
        // 3. @Name must be added as a new SqlParameter.
        //
        using (SqlCommand command = new SqlCommand(
        "SELECT * FROM Dogs1 WHERE Name LIKE @Name", connection))
        {
        //
        // Add new SqlParameter to the command.
        //
        command.Parameters.Add(new SqlParameter("Name", dogName));
        //
        // Read in the SELECT results.
        //
        SqlDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {
            int weight = reader.GetInt32(0);
            string name = reader.GetString(1);
            string breed = reader.GetString(2);
            Console.WriteLine("Weight = {0}, Name = {1}, Breed = {2}",
            weight,
            name,
            breed);
        }
        }
    }
    }
}

输出 (这取决于您的数据库内容。)

体重 = 130,名字 = Fido,品种 = Bullmastiff

【讨论】:

    【解决方案2】:

    我在这里可能错了,但看起来“grd.CurrentRow.Cells(1).Value”将解析为您的 c# 代码中的一个值。然后,您打算将其发送到数据库。换句话说,您的格式 2 将在进入数据库之前用一个值替换“grd.CurrentRow.Cells(1).Value”。您的格式 1 不会,因此很可能是不正确的并且无法正常工作。

    在性能方面,始终建议使用参数化查询,因为它允许 SQL Server(如果这是您正在使用的数据库)内置优化器来构建查询计划以优化常规运行查询。它会将此计划存储在缓存中,因此如果您继续进行相同类型的查询,SQL Server 应该知道在您进行一次\多次调用后调用它的最佳方式。使用实体框架或存储过程进行数据访问将帮助您解决这里问题,而不是构建硬编码的 sql 语句。

    查看这些链接了解更多信息:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-29
      • 2012-07-09
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2018-08-10
      • 1970-01-01
      相关资源
      最近更新 更多