-1

我在msdn上找到了有关 string(.net framework type) 和相应 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上的指令有误解吗?

谢谢你。

4

1 回答 1

1

我不完全确定你的问题是什么。您是否感到困惑,因为文档说了一件事;但你还能做其他事情吗?

您使用以下内容显式设置参数类型...

var p = comm.CreateParameter();
p.SqlDbType = System.Data.SqlDbType.VarChar;
p.Size = 5000;
p.ParameterName = "@s";
p.Value = 'c';

编辑:根据您包含的文档,我解释它的方式,大小可以大于 4000;您只需要显式设置 SqlDbType 。过去,当我遇到这种情况时,行为要么会截断数据,要么会给我一个错误,指出字符串或二进制数据将被截断。

不幸的是,SqlServer 并不是我最强的技能。

于 2013-07-01T15:13:27.583 回答