如何在参数中创建没有“N”字符的语句

时间:2014-04-29 18:07:18

标签: c# ado.net

我遵循ADO.Net C#代码来执行带参数的存储过程。当我观察分析器时,它被列为

 exec uspSecurityGetChildActivitiesByInternalName @ActivityInternalName = N'INVWLVIEWEDIT'

但我希望将其修改为

  exec uspSecurityGetChildActivitiesByInternalName @ActivityInternalName = 'INVWLVIEWEDIT'

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

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

参考

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

    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  
    }
    

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

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

从您对AddWithValue的调用返回SQLParameter对象,因此您可以根据需要进行设置。

我没有用你的代码测试这个,所以希望我没有遗漏一些东西,但这就是你如何指定参数的类型。