将.net框架类型映射到dbtype,奇怪的字符串,nvarchar和char

时间:2013-07-01 13:55:14

标签: c# .net sql-server ado.net

我在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上的指令吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

我不完全确定你的问题是什么。你有困惑,因为文件说了一件事;你还能做点什么吗?

使用以下方法显式设置参数类型...

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

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

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