当前位置: 首页 > 编程语言 > C#

如何在SQLServer2000TEXT列中存储C#字符串中的UTF-8字节share

时间:2023-04-10 15:52:42 C#

在文本列中存储文本的UTF-8表示。我没有修改列类型的选项,并且必须能够将来自C#程序的非ASCIIUnicode数据存储到列中。这是代码:sqlcmd.CommandText="INSERTINTONotes"+"(UserID,LocationID,Note)"+"VALUES("+Note.UserId.ToString()+","+Note.LocationID.ToString()+","+"@note);"+"SELECTCAST(SCOPE_IDENTITY()ASBIGINT)";SqlParameternoteparam=newSqlParameter("@note",System.Data.SqlDbType.Text,int.MaxValue);在这一点上,我尝试了几种不同的方法来将我的UTF-8数据放入参数中。例如://方法一byte[]bytes=(byte[])Encoding.UTF8.GetBytes(Note.Note);char[]characters=bytes.Select(b=>(char)b).ToArray();noteparam.Value=newString(字符);我也试过//方法二noteparam.Value=Note.Note;和//三种方法byte[]bytes=(byte[])Encoding.UTF8.GetBytes(Note.Note);noteparam.Value=字节;继续,这是其余代码:sqlcmd.Parameters.Add(noteparam);sqlcmd.准备();尝试{Note.RecordId=(Int64)sqlcmd.ExecuteScalar();}赶上{返回假;方法一(将UTF8字节转换为字符串)做了一些奇怪的事情——我认为它是UTF-8对字符串进行第二次编码。方法2存储垃圾。方法三在ExecuteScalar()中抛出异常,声称它无法将参数转换为String。我已经知道所以不需要告诉我的事情:有什么建议吗?如果数据库排序规则是SQL_Latin1_General_CP1(美国版SQLServer2000的默认排序规则),您可以使用以下技巧将Unicode文本作为UTF-8存储在char、varchar或文本列中:byte[]bytes=Encoding.UTF8.GetBytes(注.注);noteparam.Value=Encoding.GetEncoding(1252).GetString(字节);稍后,当你想读回文本时,逆向过程:SqlDataReaderreader;//...byte[]bytes=Encoding.GetEncoding(1252).GetBytes((string)reader["Note"]);字符串注释=Encoding.UTF8.GetString(bytes);如果数据库排序规则不是SQL_Latin1_General_CP1,则需要将1252替换为正确的代码页。注意:如果您查看企业管理器或查询分析器中存储的文本,您会看到奇怪的字符代替非ASCII文本,就像您在不支持Unicode的文本编辑器中打开UTF-8文档一样。工作原理:当您将Unicode文本存储在非Unicode列中时,SQLServer会自动将文本从Unicode转换为数据库排序规则指定的代码页。目标代码页中不存在的任何Unicode字符都将被不可逆转地损坏,这就是前两种方法不起作用的原因。但是你在方法一的正确轨道上。缺少的步骤是通过使用Windows-1252代码页将原始UTF-8字节转换为Unicode来“保护”它们。现在,当SQLServer执行从Unicode到Windows-1252的自动转换时,它会恢复原始的UTF-8字节。以上就是C#学习教程:如何将C#String中UTF-8字节共享的全部内容存储到SQLServer2000TEXT列中。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: