解决用C#写的窗体应用程序向数据库SQL Server表格中写入中文乱码显示???的方法
在应用程序中尽量使用 nchar、nvarchar 和 nvarchar(max) 替换使用的所有 char、varchar 和 text 数据类型。还有要保证接受数据的数据库的默认字符集是COLLATE Chinese_PRC_CI_AS
如下例子中是:
//添加一个InitAdapter方法,用此方法功能是初始化adapter变量
1 private void InitAdapter() 2 { 3 SqlConnection connection =this.getConnection(); 4 adapter = new SqlDataAdapter("select * from Users",connection); 5 adapter.FillLoadOption = LoadOption.OverwriteChanges; 6 //新增 7 SqlCommand InsertCommand = new SqlCommand(); 8 InsertCommand.Connection = connection; 9 InsertCommand.CommandText = "insert into users(ID,Code,Name) values(@ID,@Code,@Name)"; 10 InsertCommand.Parameters.Add("@ID", SqlDbType.Int, 4, "ID"); 11 InsertCommand.Parameters.Add("@Code", SqlDbType.NVarChar, 20, "Code"); //原来使用的SqlDbType.VarChar, 20, "Code"结果出现写入数据库表中的汉字都变成??? 12 InsertCommand.Parameters.Add("@Name", SqlDbType.NVarChar, 50, "Name"); 13 adapter.InsertCommand = InsertCommand; 14 //修改 15 SqlCommand UpdateCommand = new SqlCommand(); 16 UpdateCommand.Connection = connection; 17 UpdateCommand.CommandText = "update users set Code =@Code,Name =@Name where ID =@ID"; 18 UpdateCommand.Parameters.Add("@ID", SqlDbType.Int, 4, "ID"); 19 UpdateCommand.Parameters.Add("@Code", SqlDbType.NVarChar, 20, "Code"); 20 UpdateCommand.Parameters.Add("@Name", SqlDbType.NVarChar, 50, "Name"); 21 adapter.UpdateCommand = UpdateCommand; 22 //删除 23 SqlCommand DeleteCommand = new SqlCommand(); 24 DeleteCommand.Connection = connection; 25 DeleteCommand.CommandText = "delete users where ID =@ID"; 26 DeleteCommand.Parameters.Add("@ID", SqlDbType.Int, 4, "ID"); 27 adapter.DeleteCommand = DeleteCommand; 28 //添加表映射 29 DataTableMapping TableMapping = new DataTableMapping(); 30 TableMapping = adapter.TableMappings.Add("Users", "Users"); 31 TableMapping.ColumnMappings.Add("Code", "编号"); 32 TableMapping.ColumnMappings.Add("Name", "名称"); 33 TableMapping.DataSetTable = "Users"; 34 }
SELECT '车速平均值'as CARSPEED,查询出的结果是????
解决方法:
第一种办法:先选中出错的数据库→选中以后右键点击属性会弹出数据库属性 对话框→选中数据库属性对话框中的选项→把选项中的排序规则设置成:Chinese_PRC_90_CI_AS→最后点击确定即可。(注意:在选择数据库属性的时候必须确保你所修改的数据库未被使用才可以修改否则会失败的)
第二种办法:首先打开你的sql查询分析器(新建查询),然后输入以下代码执行即可:
ALTER DATABASE 数据库名COLLATE Chinese_PRC_90_CI_AS
解析原因:出现以上情况主要是因为数据库属性的排序规则设置不正确,在Microsoft SQL Server 2005 中,字符串的物理存储由排序规则控制。排序规则指定表示每个字符的位模式以及存储和比较字符所使用的规则。
排序规则名称由两部份构成,前半部份是指本排序规则所支持的字符集。如:
Chinese_PRC_90_CI_AS
前半部份:指UNICODE字符集,Chinese_PRC_指针对大陆简体字UNICODE的排序规则。
排序规则的后半部份即后缀 含义:
_BIN 二进制排序
_CI(CS) 是否区分大小写,CI不区分,CS区分
_AI(AS) 是否区分重音,AI不区分,AS区分
_KI(KS) 是否区分假名类型KI不区分,KS区分
_WI(WS) 是否区分宽度WI不区分,WS区分
区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。
区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项,比较还将重音不同的字母视为不等。
区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。
区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项
附:如果数据库正在被使用会提示错误:
消息 5030,级别 16,状态 2,第 1 行
无法用排他锁锁定该数据库,以执行该操作。
消息 5072,级别 16,状态 1,第 1 行
ALTER DATABASE 失败。无法将数据库 *** 的默认排序规则设置为 Chinese_PRC_90_CI_AS。
解决方法:
确保没有任何用户正在使用数据库,然后将数据库设置为单用户模式。
在数据库“属性”->"选项"->“限制访问”->“Single”
posted on 2012-11-03 15:40 Crystalball 阅读(5175) 评论(0) 编辑 收藏 举报