【问题标题】:How to create statements without `N` character in parameter如何在参数中创建没有“N”字符的语句
【发布时间】:2014-04-29 18:07:18
【问题描述】:

我有以下 ADO.Net C# 代码用于执行带参数的存储过程。当我观察分析器时,它被列为

 exec uspSecurityGetChildActivitiesByInternalName @ActivityInternalName = N'INVWLVIEWEDIT'

但我希望它被修改为

  exec uspSecurityGetChildActivitiesByInternalName @ActivityInternalName = 'INVWLVIEWEDIT'

我需要在参数值之前避免N。这应该是可能的,因为在我拥有的原始跟踪中,它没有N(尽管我没有源代码)。

我们如何修改以下 C# 代码以在没有 N 的情况下在分析器中创建 exec 语句?

参考

  1. Can SQL Profiler display return result sets alongside the query?
  2. Exception when AddWithValue parameter is NULL

代码

using (SqlCommand command = new SqlCommand(spName, connection))
{
    WriteLogFunction(spStatement);
    command.CommandType = System.Data.CommandType.StoredProcedure;

    if (paramsList.Count > 0)
    {
       foreach (Parameter p in paramsList)
       {
           command.Parameters.AddWithValue(p.MyParameterName, p.MyVal);
       }
    }

    string resultVal=String.Empty;

    using (SqlDataReader reader = command.ExecuteReader())
    {
        if (reader.HasRows)
        {
            while (reader.Read())
            {
                resultVal = reader.GetString(0);
            }
        }
    }

    //Other code  
}

【问题讨论】:

  • 为什么? N 表示值作为 unicode 传递
  • @YuriyGalanter 我需要这个才能使用默认设置;不指定 unicode
  • 是否所有参数都传递给了 SP 字符串? SP 中定义的它们的大小是多少?
  • 你说你想要,你说你需要,但你没有说为什么。如果我们更了解您,可能会更容易提出有用的建议。
  • @TaW 我正在尝试从跟踪文件中执行所有 SP。参考stackoverflow.com/questions/2086713/…

标签: c# ado.net


【解决方案1】:

您可以强制使用非 Unicode 参数,方法是将其类型指定为 VarChar

command.Parameters.AddWithValue(p.MyParameterName, p.MyVal).SqlDbType = SqlDbType.VarChar;

这应该传递不带“N”的参数 - 但如果不是所有参数都是字符串 - 你将不得不添加检查,以便整数,其余的不会搞砸。

【讨论】:

    【解决方案2】:

    假设您的存储过程出于某种原因需要 ANSI 字符串而不是 Unicode 字符串:

    在您的代码中,您允许从传递的值推断参数的类型。 .NET 字符串是 Unicode 字符串,因此参数类型被推断为 Unicode 字符串(导致 N'')。对于需要为非 Unicode 的参数,您需要将参数的 DbType 属性设置为 AnsiString 或将 SqlDbType 设置为 Text(而不是 NText)。 (或者是的......正如 Yuri 所说,VarChar 可能就是你想要的。)

    SQLParameter 对象是从您对 AddWithValue 的调用中返回的,因此您可以在需要时设置它。

    我没有用你的代码对此进行测试,所以希望我没有遗漏什么,但这就是你指定参数类型的方式。

    【讨论】:

      猜你喜欢
      • 2022-09-28
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      相关资源
      最近更新 更多