Как работать со специальными символами при использовании textfieldparser в задаче SSIS script
У меня есть пакет SSIS для работы с несколькими файлами, несколькими типами разделителей, разными именами столбцов, нет разных столбцов и т. д.. Теперь у меня есть проблема при загрузке специальных символов в БД из csv. В моей целевой таблице есть только поля nvarchar. Если я включаю N" до данных, то он показывает несколько иной характер, чем исходные данные. В противном случае, это видно ?. Поскольку я ожидаю файлы с разными разделителями, иногда текстовый квалификатор, иногда нет, выпуск кодовой страницы и т. д., Используя задачу скрипта для загрузки данных.
Исходные данные:
ними - ними - ними
Когда N":
ними � ними � ними
При использовании кодировки:
именем именем именем
Что я уже пробовал:
public void Main() { // TODO: Add your code here string delimiter = Dts.Variables["User::var_Delimiter"].Value.ToString(); string TableName = Dts.Variables["$Package::Param_Tbl_Name"].Value.ToString(); string filePath = Dts.Variables["User::var_File_Path"].Value.ToString(); string fileName = Dts.Variables["User::var_File_Name"].Value.ToString(); string srcfolder = Dts.Variables["$Package::Param_Src_Folder"].Value.ToString(); string tbl = TableName.Replace("[", ""); tbl = tbl.Replace("]", ""); tbl = tbl.Replace("dbo.", ""); string fieldname_file = ""; string fieldname_tbl = ""; string fieldnames = ""; string query = ""; int counter = 0; string line = ""; int maxcol = 0; int maxcol1 = 0; SqlConnection myADONETConnection = new SqlConnection(); myADONETConnection = (SqlConnection)Dts.Connections["ADOAUDIT"].AcquireConnection(Dts.Transaction) as SqlConnection); SqlCommand sqlCommand = null; using (TextFieldParser parser = new TextFieldParser(filePath, System.Text.Encoding.GetEncoding("iso-8859-8"));)) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(delimiter); parser.HasFieldsEnclosedInQuotes = true; while (!parser.EndOfData) { string[] fieldrow = parser.ReadFields(); if (counter == 0) { for (int i = 0; i < fieldrow.Length; i++) { fieldname_file = fieldrow[i]; if (!String.IsNullOrEmpty(fieldname_file)) { fieldname_file = fieldname_file.Substring(0, 6); query = "select name from sys.columns " + "where object_id = (select object_id from sys.objects where name = '" + tbl + "')" + "and name like '%" + fieldname_file + "%'"; sqlCommand = new SqlCommand(query, myADONETConnection); fieldname_tbl = (string)sqlCommand.ExecuteScalar(); if (!String.IsNullOrEmpty(fieldname_tbl)) { fieldnames = fieldnames + "[" + fieldname_tbl.Replace("'", "''") + "],"; maxcol = i; } } } query = "select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS" + " where table_name ='" + tbl + "' " + "and column_name like '%file%name%'"; sqlCommand = new SqlCommand(query, myADONETConnection); fieldname_tbl = (string)sqlCommand.ExecuteScalar(); //fieldnames = fieldnames + "[FileName]"; fieldnames = fieldnames + "["+fieldname_tbl+"]"; } else { query = ""; line = ""; if (fieldrow.Length == maxcol + 1) { for (int j = 0; j < fieldrow.Length; j++) { line = line + "N'" + fieldrow[j].Replace("'", "''") + "',"; } } else { for (int j = 0; j < fieldrow.Length - (fieldrow.Length - (maxcol + 1)); j++) { line = line + "N'" + fieldrow[j].Replace("'", "''") + "',"; maxcol1 = j; } } line = line + "'" + fileName + "'"; query = "insert into " + tbl + "(" + fieldnames + ") values(" + line + ")"; sqlCommand = new SqlCommand(query, myADONETConnection); sqlCommand.ExecuteNonQuery(); } counter++; } }
#realJSOP
Символ � существует потому, что символ, который он пытается представить, не может быть декодирован. Можете ли вы показать нам часть файла, которая генерирует этот символ?
Richard Deeming
Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]
Richard Deeming
Кроме того, проверьте кодировку исходного файла - вы абсолютно уверены, что это ISO-8859-8
?