DOBON.NETプログラミング道掲示板

No34172 の記事


■34172 / )  Re[1]: ポルトガル語の登録
□投稿者/ 魔界の仮面弁士 大御所(1209回)-(2019/02/28(Thu) 19:18:02)
  • アイコン
    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();
                }
            }
        }
    }

違反を報告
返信 削除キー/


Mode/  Pass/


- Child Tree -