我有一个包含 8100 万条记录的数据库表,用于将特定 URL 与请求生成 URL 的客户联系起来。为了从这个表中查询 url 有点合理,我将 url 字段设为 varchar(500)(我们看到的最大 url 长度是 410)。

当我在 SSMS 中运行以下查询时,我立即得到结果:

select CustomerId, UserId, Requested from LogURL where LogData = '<url>'

然后我在 C# 中编写了一个方法来执行此查询以处理日志文件:
    public UrlInformation GetInfoForUrl(string url)
    {
        const string query = "select top 1 CustomerId, UserId, Requested from LogURL where LogData = @url";

        using (var command = new SqlCommand(query, _connection))
        {
            command.Parameters.Add(new SqlParameter
            {
                DbType = DbType.AnsiString,
                ParameterName = "url",
                Value = url
            });

            using (var reader = command.ExecuteReader())
            {
                UrlInformation info = null;

                // Sometimes there are multiple results, just take the first
                if (reader.Read())
                {
                    var customerId = reader.GetInt32(0);
                    var userId = reader.GetInt32(1);
                    var date = reader.GetDateTime(2);

                    info = new UrlInformation
                    {
                        CustomerId = customerId,
                        UserId = userId,
                        RequestedDate = date
                    };
                }

                return info;
            }
        }

(注意这个类在构造函数中创建并打开了sql连接,并在Dispose()中进行了处理,所以应该重复使用相同的连接)。

当此代码运行时,command.ExecuteReader() 每次需要 3-5 秒(通过 StopWatch 类测量)。打开 sql 探查器,我看到实际执行的查询是:
exec sp_executesql N'select top 1 CustomerId, UserId, Requested from LogURL where LogData = @url',N'@url nvarchar(346)',@url=N'<url>'

由于它将 url 转换为 nvarchar,因此它没有使用我的 varchar() 引用并且似乎在进行全表扫描。

如何让 C# 代码将 url 视为 varchar 而不是 nvarchar?

最佳答案

由于您使用的是 SqlParameter 也可能使用 SqlDbType 而不是 DbType 。如果你这样做,那么你可以使用 SqlDbType.VarChar 而不是 DbType.Ansi

command.Parameters.Add(new SqlParameter
{
    SqlDbType = SqlDbType.VarChar,
    ParameterName = "url",
    Value = url
});

此外,来自 MSDN, DbType 参数 DbType 通过覆盖基本 DbType 属性来获取或设置参数的 SqlDbType

关于c# - 如何强制 SqlCommand 不将参数编码为 un​​icode/nvarchar?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19891999/

10-11 05:52