这个问题应该说是关于MS2005的问题。
问题起因是:我的网站系统有这样一个功能:
要通过查询用户帐号来查询用户信息。
当用户名为英文的时候的没有任何问题,但是当用户名为中文的时候,始终查不出任何信息。
于是我做了一下工作,发现了一些问题。(1)我检查拉存储过程,并直接在数据库中以中文名验证,没有什么问题。
执行的语句如下
.....
exec 过程名称, @用户名过程参数 = N'用户名称'--N代表unicode编码
.....
(2)于是我打开sql server profiler来监测。然后我访问网页,发现显示的调用语句如下:
.....
exec 过程名称, @用户名过程参数 = '???' --跟上面的差别在于少了一个N,导致产生乱码。
.....
(3)现在解决问题的关键就是如何能让数据库在直接来自于网站的查询时,能执行(1)中的语句。

解决方案 »

  1.   

    exec 过程名称, @用户名过程参数 = N'用户名称'
    //这句是直接用sql 写的还是用参数添加的形式写的?
      

  2.   

    重新描述一下:
    (1)我检查拉存储过程,并在数据库中执行过程,输入中文名参数验证,没有什么问题。  
    产生的执行的语句如下  
    .....  
    exec  过程名称,  @用户名过程参数  =  N'用户名称'--N代表unicode编码  
    .....  
    (2)于是我打开sql  server  profiler来监测。然后我访问网页,发现sql  server  profiler显示的调用语句如下:  
    .....  
    exec  过程名称,  @用户名过程参数  =  '???' --跟上面的差别在于少了一个N,导致产生乱码。  
    .....  
    (3)现在解决问题的关键就是如何能让数据库在完成来自于网站的查询时,能执行(1)中的语句。
      

  3.   

    直接用command.Text = " exec 过程 N'名称' "不要@参数=
      

  4.   

    如果传参数,参数类型用nvarchar. 如果用sql字符串拼接, 参照上面的。
      

  5.   

    如果数据库中使用unicode存储,那么参数值也必须使用utf-8,可以在查询前使用
    encoding.getstring()作一下转换
      

  6.   

    先确定是否必须用unicode,好像这样的需求不太多。当然存在,但也许你的应用环境下根本不需要
      

  7.   


    过程参数是nvarchar另外在sql    server    profiler监测过程中发现这么有趣的现象:
    asp.net自带的控件查询数据库时,执行存储过程时,数据库执行时会自动给参数类型是nvarchar的参数在执行时加上N,所以不会遇到以上问题。
    意思就是说我自己写的存储过程在执行时,数据库就会把应该加的N给去掉,所以导致乱码。经cpp2017(慕白兄) 兄提醒最后解决方案是,在网站程序中组成sql语句,在语句中加上N,然后执行。不过这个问题到底出在那里,还有待研究。