none
SqlDbType.VarChar的问题 RRS feed

  • 问题

  • ShangPinBianHao字段是 nchar 10,
     
    sqlCommand = new SqlCommand(@"SELECT GUID, ShangPinBianHao, ShangPinMingCheng  FROM stock_ShangPinXinXi WHERE (ShangPinBianHao LIKE @ShangPinBianHao + N'%') ORDER BY ShangPinBianHao", conn);
      sqlCommand.Parameters.Add(new SqlParameter("@ShangPinBianHao", SqlDbType.VarChar, 10));
      sqlCommand.Prepare();
      sqlCommand.Parameters["@ShangPinBianHao"].Value = HiddenParam.Value.ToString().Trim();

    下面的查询中, HiddenParam.Value.ToString().Trim()=1  如果用SqlDbType.Char/NChar/NVarChar  查找到的记录只有ShangPinBianHao=1的一条记录, 用VarChar就是正确的. 
    我想如果是=号,非like 就没有这个问题.
    另外不真不知道  字段类型是nchar ,用SqlDbType.Char/NChar 为什么都可以呢.

    谢谢
    • 已移动 Sheng Jiang 蒋晟 2009年11月3日 2:21 SQL Data Access问题 (发件人:Visual C#)
    2009年11月1日 13:44

答案

全部回复

  • 你好!

    这里主要的区别是 char 与 varchar。在设置 SqlParameter 时应该设置和数据字段对应的数据类型。

    char、nchar 长度固定(比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节包括17个空字符);
    varchar、nvarchar 是可变长度
    nchar、nvarchar 用于存储  Unicode 字符,比如中文

    根据上面的描述,两者最终形成SQL的差另如下。

    使用 char(10) 、Nchar(10) 作为参数类型时最终解释的 SQL 为 Where ShangPinBianHao LIKE '1        ' + N'%'
    使用 varchar(10) 、Nvarchar(10) 作为参数类型时最终解释的 SQL 为 Where ShangPinBianHao LIKE '1' + N'%'

    由于需要使用固定长度的情况较少,在设计数据时一般使用 varchar, nvarchar 来存储字符。

    知识改变命运,奋斗成就人生!
    2009年11月2日 1:26
  • 谢谢,这个我明白了

    另外想问下:
     sqlCommand.Parameters.Add(new SqlParameter("@ShangPinBianHao", SqlDbType.VarChar, 10));
    或者
     sqlCommand.Parameters.Add(new SqlParameter("@ShangPinBianHao", SqlDbType.Char, 10));

     sqlCommand.Prepare();
     sqlCommand.Parameters["@ShangPinBianHao"].Value = HiddenParam.Value.ToString().Trim();

    我输入了10个中文字,为什么没有溢出呢?

    谢谢!
    2009年11月2日 2:04
  • SELECT 语句不会报错的, Insert 语句会
    知识改变命运,奋斗成就人生!
    • 已标记为答案 donghaima 2009年11月2日 3:45
    2009年11月2日 2:12