VB.Net解析含度数符号的CSV并正确存入SQL Server的问题
解决SQL Server中度数符号存储与导出乱码问题
你的核心问题是编码不匹配导致度数符号(°)在存储和导出过程中变成乱码�F。.NET的String本身是Unicode,但如果读取CSV时用了错误的编码,或者数据提交到SQL Server时没有正确处理Unicode,就会出现这种情况。结合你的代码,给你几个关键的修复步骤:
1. 确保CSV文件读取时使用正确的编码
记事本能正常显示度数符号,说明文件本身的编码是支持该字符的(比如UTF-8带BOM、Windows-1252或UTF-16)。但默认的StreamReader可能会用系统默认编码(比如GB2312)读取,导致字符损坏。
修改你的CSV读取逻辑,指定正确的编码:
' 示例:用UTF-8编码读取CSV Using sr As New StreamReader("你的CSV文件路径.csv", Encoding.UTF8) Dim line As String While sr.Peek() >= 0 line = sr.ReadLine() ' 处理每行数据的逻辑(拆分列等) End While End Using
如果UTF-8不行,可以试试Encoding.GetEncoding(1252)(Windows西欧编码,支持度数符号),或者Encoding.Unicode(UTF-16),根据文件实际编码调整。
2. 确保DataAdapter提交时使用Unicode参数
虽然你的数据库字段是NVARCHAR(MAX),但SqlCommandBuilder生成的参数可能默认用VarChar类型,导致Unicode字符被转换。可以通过RowUpdating事件强制将字符串参数设为NVarChar:
在创建SqlDataAdapter后添加事件处理:
adap = New SqlDataAdapter(sqlstr, conn) ' 添加RowUpdating事件处理 AddHandler adap.RowUpdating, Sub(sender As Object, e As SqlRowUpdatingEventArgs) For Each param As SqlParameter In e.Command.Parameters ' 检查参数是否对应字符串类型,强制转为NVarChar If param.DbType = DbType.String Or param.DbType = DbType.AnsiString Then param.SqlDbType = SqlDbType.NVarChar End If Next End Sub
这个步骤能确保所有字符串参数以Unicode形式提交到SQL Server,避免编码损失。
3. 验证存储与导出的编码一致性
- 存储验证:在SSMS中直接查询
Tags表,查看该字段是否显示正确的°F。如果显示正常,说明存储没问题,乱码可能出在导出环节。 - 导出CSV时:导出要使用和读取一致的编码(比如UTF-8),如果导出时用了错误的编码,同样会出现乱码。比如用
StreamWriter导出时指定Encoding.UTF8:
Using sw As New StreamWriter("导出文件路径.csv", False, Encoding.UTF8) ' 写入CSV内容的逻辑 End Using
按照这几个步骤调整后,度数符号应该能在SQL Server中正确存储,导出CSV时也能正常显示了。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

