我在SQL Server 2008中将法语文本插入nvarchar列。法语重音字符未正确存储在SQL DB中。
string strData = "Accented chars- Les caractères accentués français ";
DataTable dtTemp = new DataTable();
dtTemp.Columns.Add("ID", typeof(string));
dtTemp.Columns.Add("Value", typeof(string));
DataRow dr = dtTemp.NewRow();
dr["ID"] = "100";
dr["Value"] = strData;
dtTemp.Rows.Add(dr);
strSQLCon = GetSQLConnectionString();
using (SqlConnection cn = new SqlConnection(strSQLCon))
{
cn.Open();
using (SqlBulkCopy copy = new SqlBulkCopy(cn))
{
copy.ColumnMappings.Add("ID", "ID");
copy.ColumnMappings.Add("Value", "Value");
copy.DestinationTableName = "MYTABLE";
copy.WriteToServer(dtTemp);
}
}
法语字符未正确存储在SQL Server数据库中。 当我执行普通的插入查询时,它工作正常。插入MYTABLEvalues(1,'Accented chars-Lescaractèresaccentuésfrançais')
请告诉我为什么它不适用于SQL Bulk副本类。需要更改任何设置或需要修改C#代码以正确存储非英文字符。
答案 0 :(得分:2)
我正在设计此表,每列的排序规则设置为French_CI_AS
,法国文化,重音敏感。 考虑每个sql字符串类型。
我正在为此表构建类型化数据集(不是此问题的目的)。
Sql 批量复制:
var ds = new FrenchCharacters.FrenchDataSet();
using (var destinationConnection = new SqlConnection(StackOverflow.Properties.Settings.Default.StackOverflowConnectionString))
{
destinationConnection.Open();
//all French characters http://en.wikipedia.org/wiki/French_orthography
string[] sArray = new string[] {
"Àà, Ââ, Ææ, Ää"
, "Çç"
, "Îî, Ïï"
, "Ôô, Œœ, Öö"
, "Ùù, Ûû, Üü"
, "Ÿÿ"
};
// open the connection
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection.ConnectionString))
{
bulkCopy.BatchSize = 500;
bulkCopy.NotifyAfter = 10000;
bulkCopy.DestinationTableName = "French";
//
// build data table to be written to the server
// data table is now strongly-typed ds.French
//
for (int i = 0; i < 100; i++)
{
foreach (string s in sArray)
ds.French.AddFrenchRow(s, s, s, s, s, s);
}
//
bulkCopy.WriteToServer(ds.French);
}
}
结果:
请注意,无论sql char类型是什么都没有无效的条目!。
答案 1 :(得分:1)
我在下表中测试了您的代码,它运行良好,至少在SQL Server 2012上。
CREATE TABLE [dbo].[MYTABLE](
[ID] [varchar](20) NOT NULL,
[Value] [nvarchar](255) NOT NULL)
答案 2 :(得分:0)
感谢您的回复。在批量插入之前将csv文件读入数据表时似乎会出现此问题。我在读取csv文件时包含了编码参数。 (Encoding.Default)它正确加载法语文本,并且它存储在SQL DB中而没有任何问题。
旧代码: List lstData = File.ReadAllLines(stFile).ToList();
工作代码: List lstData = File.ReadAllLines(stFile,Encoding.Default).ToList();
感谢 阿肖克