■No34169に返信(あばば無人君さんの記事) > DBに登録するとポルトガル語のアクセント記号が消えてアルファベットのみになってしまいます。 SqlParameter の SqlDbType が Text になっていたりはしませんか? たとえば下記の場合、 パターン 1 と 3 では正常に書き込まれますが、 パターン 2 の時にはアクセント記号が失われます。 using Dapper; using System.IO; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; /* CREATE TABLE Test ( Id int NOT NULL PRIMARY KEY, Message nvarchar(MAX) NULL ) */ namespace ConsoleApp01 { class Program { static void Main() { string 葡語 = "Com licen\u00E7a, voc\u00EA pode falar Portugu\u00EAs?"; string sql = "INSERT INTO Test (Id, Message) VALUES (@Id, @Message)"; using (var con = new SqlConnection(Properties.Settings.Default.ConnectionString)) { con.Open(); con.Execute("TRUNCATE TABLE Test"); // パターン1 con.ExecuteScalar(sql, new { Id = 1, Message = 葡語 }); // パターン2 using (var cmd = con.CreateCommand()) { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; cmd.Parameters.Add("@Id", SqlDbType.Int).Value = 2; cmd.Parameters.Add("@Message", SqlDbType.Text).Value = 葡語; cmd.ExecuteNonQuery(); } // パターン3 using (var cmd = con.CreateCommand()) { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; cmd.Parameters.Add("@Id", SqlDbType.Int).Value = 3; cmd.Parameters.Add("@Message", SqlDbType.NText).Value = 葡語; cmd.ExecuteNonQuery(); } // 確認のため、書き込んだ結果を DataSet に SELECT しなおしてからファイルに保存 using (var ds = new DataSet("Example")) using (var adp = new SqlDataAdapter("SELECT * FROM Test ORDER BY Id", con)) { adp.Fill(ds, "Test"); var q = ds.Tables["Test"].AsEnumerable().Select( r => $"{r["Id"]}\t{r["Message"]}"); File.WriteAllLines(@"C:\TEMP\test.txt", q, Encoding.UTF8); ds.WriteXmlSchema(@"C:\TEMP\test.schema.xml"); ds.WriteXml(@"C:\TEMP\test.xml"); } con.Close(); } } } }
■No34174に返信(魔界の仮面弁士さんの記事) > 妙ですね。 > 当方環境で追試験してみましたが、下記の 4 や 5 では問題ありませんでした。 NVARCHAR 列に照合順序を明示した場合もテストしてみたので、一応参考までに。 なお、当方データベースの照合順序は [Japanese_BIN] です。 /* CREATE TABLE Example ( Id int NOT NULL PRIMARY KEY, Msg1 nvarchar(MAX) NULL, Msg2 nvarchar(MAX) COLLATE Japanese_CI_AS NULL, Msg3 nvarchar(MAX) COLLATE Japanese_BIN2 NULL, Msg4 nvarchar(MAX) COLLATE Japanese_XJIS_100_BIN2 NULL, Msg5 nvarchar(MAX) COLLATE Japanese_Unicode_BIN2 NULL ) */ string 葡語 = "Com licen\u00E7a, voc\u00EA pode falar Portugu\u00EAs?"; string template1 = "INSERT INTO Example (Id, Msg1, Msg2, Msg3, Msg4, Msg5) VALUES ({0}, N'{1}', N'{1}', N'{1}', N'{1}', N'{1}')"; string template2 = "INSERT INTO Example (Id, Msg1, Msg2, Msg3, Msg4, Msg5) VALUES ({0}, '{1}', '{1}', '{1}', '{1}', '{1}')"; // 下記では、すべての列でアクセント記号が維持されていた。 string sql1 = string.Format(template1, 1, 葡語); // 下記では、すべての列でアクセント記号が失われていた。 string sql2 = string.Format(template2, 2, 葡語);