我遵循ADO.Net C#代码来执行带参数的存储过程。当我观察分析器时,它被列为
exec uspSecurityGetChildActivitiesByInternalName @ActivityInternalName = N'INVWLVIEWEDIT'
但我希望将其修改为
exec uspSecurityGetChildActivitiesByInternalName @ActivityInternalName = 'INVWLVIEWEDIT'
我需要避免N
之前的参数值。这应该是可能的,因为在原始跟踪中,它没有N
(虽然我没有源代码)。
我们如何修改以下C#代码,以便在没有exec
的情况下在分析器中创建N
语句?
参考
代码:
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
}
答案 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对象,因此您可以根据需要进行设置。
我没有用你的代码测试这个,所以希望我没有遗漏一些东西,但这就是你如何指定参数的类型。