我在msdn上找到了关于字符串(.net框架类型)和相应的nvarchar(dbtype)映射的信息,其中说:
'如果字符串大于NVarChar的最大大小(4000个字符),则此隐式转换将失败。对于字符串 大于4000个字符,显式设置SqlDbType。'
我只是无法通过“明确设定”来判断出什么意思。所以我写了一些代码如下:
char[] c = new char[5000];
for (int i = 0; i < 5000; i++)
{
c[i] = 'a';
}
string s = new string(c);
using (SqlConnection conn = new SqlConnection(connstr))
{
conn.Open();
// create command object
var comm = conn.CreateCommand();
comm.CommandText = "select @s";
// create parameter for command
var p = comm.CreateParameter();
p.ParameterName = "@s";
// p.DbType = DbType.String;
// p.Size = 5000;
p.Value = s;
// add parameter to command
comm.Parameters.Add(p);
// execute command
var r = comm.ExecuteScalar();
}
如你所见,我没有设置参数类型和参数大小,所以根据msdn上的说明,我认为在运行时会有异常。但不幸的是,它运行得非常正确,结果r是一个包含5000'a'的字符串。 实际上,无论我评论或取消注释设置参数的类型,大小的代码,结果r总是正确的,总是相同的。
请帮助我,我误解了msdn上的指令吗?
谢谢。答案 0 :(得分:1)
我不完全确定你的问题是什么。你有困惑,因为文件说了一件事;你还能做点什么吗?
使用以下方法显式设置参数类型...
var p = comm.CreateParameter();
p.SqlDbType = System.Data.SqlDbType.VarChar;
p.Size = 5000;
p.ParameterName = "@s";
p.Value = 'c';
编辑:根据您提供的文档,我解释它的方式,大小可以大于4000;你只需要显式设置SqlDbType。在过去,当我遇到这个时,行为要么会截断数据,要么会给我一个错误,说明字符串或二进制数据会被截断。
不幸的是,SqlServer不是我最强的技能组合。