c# - SSIS 脚本任务 - 使用 C# 将 VARCHAR 转换为 NVARCHAR
问题描述
我正在使用 SQL Server 2014 Enterprise 和 Visual Studio 2103。
我有数百个 TSV 文件,其中包含要导入 SQL Server 的外来字符。我有一个 SSIS 包可以自动执行此操作(只是我在网上找到的使用 C# 的脚本任务)。使用所有列的数据类型创建NVARCHAR(MAX)
表,然后脚本逐行读取每个文件,并将值插入表中。
源 TSV 文件导出为 Unicode,但 SQL Server 似乎并不关心 - 它将文件导入为VARCHAR
(即,中文字符作为“??????”)。如果您手动将文件导入 SQL Server,代码页会显示“65001 (UTF-8)”,所以我不确定为什么数据类型默认为VARCHAR
.
现在,我想我可以为每个文件配置一个 DATA CONVERSION TRANSFORM,但是文件太多,我认为这可以在脚本任务插入中即时完成:
脚本任务:
一些用于编码的变量:
Encoding ascii = Encoding.ASCII;
Encoding unicode = Encoding.Unicode;
Encoding utf8 = Encoding.UTF8;
Encoding utf32 = Encoding.UTF32;
脚本任务代码的以下部分是我尝试转换编码的地方(IF 语句的第一部分(未显示)创建接收表)。它在指示的地方出错:
else
{
//ADJUST FOR SINGLE QUOTES:
line = line.Replace("'", "''");
byte[] unicodeBYTES = unicode.GetBytes(line);
byte[] unicodeCONVERT = Encoding.Convert(unicode, utf8, unicodeBYTES); <--- ERRORS OUT
char[] unicodeCHARS = new char[unicode.GetCharCount(unicodeCONVERT, 0, unicodeCONVERT.Length)];
unicode.GetChars(unicodeCONVERT, 0, unicodeCONVERT.Length, unicodeCHARS, 0);
string NEWline = new string(unicodeCHARS);
string query = "Insert into " + SchemaName + ".[" + TableName + "] (" + ColumnList + ") ";
query += "VALUES('" + NEWline + "')";
// MessageBox.Show(query.ToString());
SqlCommand myCommand1 = new SqlCommand(query, myADONETConnection);
myCommand1.ExecuteNonQuery();
}
但是,如果我换行:
byte[] unicodeCONVERT = Encoding.Convert(unicode, utf8, unicodeBYTES);
到以下:
byte[] unicodeCONVERT = Encoding.Convert(unicode, unicode, unicodeBYTES);
它加载数据,但仍为 ASCII 格式(带有“??????”字符)。
任何帮助,将不胜感激。
谢谢你。
解决方案
推荐阅读
- python-3.x - ffmpy.FFExecutableNotFoundError:找不到可执行文件'ffmpeg'?
- rust - 一个人怎么能等待一个盒装的未来的结果呢?
- asp.net-core - 我可以在同一个项目中同时使用 Blazor 客户端和服务器端吗?更重要的是,我可以在同一个页面中使用它吗?
- javascript - 如何使用 lodash 将两个数组(数组 1d 和数组 2d)合并为一个对象
- prometheus - Prometheus 导出器客户端在源停止后继续发送最后一个值
- php - 使用 WP Query 在 wordpress 中显示最新的 100 个帖子,每页分页 5 个帖子
- amazon-web-services - amazon-Cloudformation 指标警报防止在没有信息时保持警惕
- java - 为什么我的应用程序在手机重启后尝试打开文件时会崩溃?
- laravel - 如何在 Laravel/Eloquent 中获得完整的关系
- c# - 托管在 Windows 服务中的 ASP.NET Core - 未提供静态文件(即 /wwwroot 的内容)