Я использую функцию c # SqlBulkCopy для сохранения записей с многоязычными значениями, кодированными UTF8. Поле моей базы данных - «NVARCHAR (max)», а мое значение для сохранения - æ'å¤šè¨ € 語㠧æ '. Но это экономит как «???????» , Есть ли способ сохранить это точное японское / многоязычное значение через SqlBulkCopy
.
row["ParameterValue"] = RegData.ParamValue;
Я отладил и проверил вышеприведенную строку. Но данные поступают и на вышеприведенную линию также полностью прекрасны. После этой строки, которую я выполняю
bulkCopy.WriteToServer(dataTable);
(Я пробовал это с простой вставкой db и отлично работал, но у меня есть миллионы записей, которые нужно сохранить сразу, поэтому простая вставка db не подходит для меня)
' ???????
'- результат, который я ожидаю от:
select cast(N'æˆ‘å¤šè¨€èªžã§æˆ‘' as varchar(max))
Вставка в столбец NVARCHAR
через недавно созданный DataTable
со столбцом string
похоже, работает для меня ...
Если вы запустите трассировку профилировтора SQL, вы увидите инструкцию insert bulk ...
с типом данных, который используется для массивного набора данных (nb вы не увидите значения).
Если это и целевое поле являются правильными NVARCHAR
, может быть, существует некоторая обработка на стороне сервера?
Изменить: для меня работает следующее
// insert code to create SqlConnection
var dbName = string.Format("Test{0}", Environment.TickCount);
var command = connection.CreateCommand();
command.CommandText = string.Format("create database {0}", dbName);
command.ExecuteNonQuery();
command.CommandText = string.Format("use {0}", dbName);
command.ExecuteNonQuery();
try
{
command.CommandText = "create table Test (Value nvarchar(max))";
command.ExecuteNonQuery();
var dataTable = new DataTable();
dataTable.Columns.Add("Value", typeof(string));
var row = dataTable.NewRow();
row["Value"] = "æˆ‘å¤šè¨€èªžã§æˆ‘";
dataTable.Rows.Add(row);
var sqlBulkCopy = new SqlBulkCopy(connection);
sqlBulkCopy.DestinationTableName = "Test";
sqlBulkCopy.WriteToServer(dataTable);
Console.WriteLine("Please check the following query:");
Console.WriteLine(string.Format("select * from {0}..Test", dbName));
Console.ReadKey();
}
finally
{
command.CommandText = string.Format("drop database {0}", dbName);
command.ExecuteNonQuery();
}