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

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
UpDateVB.netにおける固定長出力方法(3) | NomalDataObjectの使いまわし(5) | NomalVB.NETからRDゲートウェイを利用したリモートデスクトップ接続(3) | NomalLIstview のDataSource(2) | NomalClassの作り方(2) | NomalOpenFileDialogの初期ファイル名の表示が変(1) | NomalVB.NETのVBA化(2) | Nomal改行のコード(7) | NomalGoogle翻訳の結果の取得(2) | NomalStopwatchクラスのElapsedMillisecondsの挙動(2) | Nomal.net Chartで二重ドーナツグラフの作り方(3) | Nomalexeをショートカットから起動した場合のエラー(2) | Nomalデスクトップ と Desktop(6) | Nomalデザイナのプロパティウィンドウで静的プロパティを選択したい(3) | NomalPHPでシリアライズした、データをデシリアライズしたい(4) | Nomal二次元配列 インデックスが配列の境界外(2) | NomalVB.netで作成したexeのNgenによる弊害(1) | NomalDrawBezierの使い方について(7) | Nomalメジャーバージョンの異なるLog4netライブラリを参照したい(4) | NomalVB6→2005変換時のDeclare宣言のマーシャリング属性(8) | NomalGROUPBOXの複製について(vb.net)(1) | NomalActiveReports 3.0からActiveReports 7.0へのァイルコンバータについて(4) | NomalAccess OLEでExecuteNonQuery(3) | NomalKeyDownでの右コントロールキーイベント(2) | NomalExcel複数シートの印刷順序(3) | NomalWMPへno(3) | NomalDataGridViewの行番号(7) | Nomalapp.config定義によるネットワークトレースログの世代管理(2) | Nomalrelease/debugのどちらで作成されたものかを判断する方法(2) | NomalC#コンソールアプリでタイピング練習ソフト作成(3) | Nomal自分自身を呼び出すのはOKですか(1) | NomalWebBrowser Control foreachで値が消える(2) | NomalDeclare宣言するdllと参照追加をするdllの区別(4) | NomalTaskクラスを.NET Framework 2.0で実現させる方法(2) | NomalVS2017で作成されたDLLをVS2005で作成されたAPで使用する方法(4) | NomalWebBrowser Controlを使って、任意の値を取得(5) | NomalEditボックスに簡体字をセットする方法(2) | NomalList型でエラーが起きてしまい・・・(1) | Nomalフォルダ内の全ての容量を取得したい(4) | NomalWebClientが上手く動かない(2) | Nomal共変性と反変性ってこういうこと?(4) | Nomalモードレスフォーム Warning IDE0067を回避したい(7) | NomalLINQの拡張メソッドの定義(1) | Nomalこんな演算子初めて見ました。(5) | Nomalプロセスからウインドウを取得(4) | Nomalフォーム外のカーソルの変更(2) | NomalLINQのメソッド構文の書き方(3) | NomalVB.NETでCSVを読み込む際にSQL文を使いたい(3) | NomalRichTextBoxで入力文字の自動折り返しを止めたい(2) | NomalRichTextBoxで入力文字の自動折り返しを止めたい(5) | Nomalラムダ式の勉強中(2) | NomalWebClientで、短期間にDownloadStringAsyncを実行したい(2) | Nomalvb.net+SQLiteで複数データベースファイルへのトランザクション方法(3) | NomalNewの使い方間違ってますか?(4) | Nomalジェネリック型インターフェースを使った変数を扱いたい(3) | NomalC#をVBに変換(2) | NomalProcess.WaitForExitで正常に動作しない?(3) | NomalCatch時のex.StackTraceの情報(3) | Nomalユーザーコントロール内のテキストボックスのmodifiedプロパティ(4) | NomalPictureBox.Locationのキャンセル(3) | NomalJOIN操作の構文エラー(4) | NomalVisualStudioでマクロ(3) | NomalVisualStudioでExcelのVSTO開発(3) | NomalOracleDataAccess を参照したプログラムでデバッグモードが機能しなくなる(3) | NomalIE11では表示されるが、.netのWebBrowserでは、表示されないHPを表示する方法(7) | NomalマウスのないOSでマウスカーソルの表示(2) | NomalRDP接続でのネットワーク帯域制限(0) | NomalFILE.COPYでIOExceptionエラーが出る(11) | NomalToolStripMenuItemにShortcutKeysを指定した際の、元のコントロールを取得する方法(2) | Nomal動的にプロパティや変数の値の取得(4) | NomalVB6 ほかのアプリケーションを起動し そのアプリケーションは終了させる方法(4) | NomalMouseEventArgsのカレント座標(2) | Nomalリッチテキストボックスでの字間の調整(2) | NomalDrawImage でメモリ不足エラー(3) | Nomal必須コンポーネントの一覧に追加したい(0) | NomalCode128でバーコードが読み取れない(8) | NomalあるWindows10PCでビルドしたEXEがW8.1以下で実行エラー(5) | NomalApp.configのMy.Application.Log設定で使用できない属性が出る(0) | NomalVC++ → VB.Netに変換時に文法エラー(2) | Nomalvb2010を使用したmicrosoft Wordの任意の行の削除(0) | NomalVb.netからAccessへの接続について(3) | NomalSQL-Server Compact 4.0が表示されない(2) | Nomalバーコードの数字を非表示にしたい(2) | Nomal令和の日付への対応(3) | Nomalスクロールバーが出た時に高さを変えたい(4) | Nomal自作したアプリの発行元を明記したい(2) | NomalHTTP 417エラーを発生させるためのIIS設定はどうすればよいか(3) | Nomal起動ディスプレイの指定方法について(6) | NomalSystem.Threading.Thread.Sleep()と変数(2) | NomalVisual Studio DataTableの値のアクセスの仕方(2) | NomalDatagridviewのクリア(2) | NomalDataGridView 行の背景色の設定(2) | NomalListBoxにデータが表示されない(6) | NomalPIctureBox同士を論理合成したい(3) | NomalDrawString前のFillRectangle有無により文字の太さが違う理由について教えて下さい(3) | Nomalポルトガル語の登録(5) | NomalnumericUpDwonコントロールのvalue(2) | Nomalデータセット定義ファイルからDataTable(3) | NomalDataTableの構造が同じか調べるメソッド(2) | Nomalネットの画像の複数枚を重ね合わせたい(3) |



■記事リスト / ▼下のスレッド
■34169 / 親記事)  ポルトガル語の登録
□投稿者/ あばば無人君 一般人(1回)-(2019/02/28(Thu) 18:08:02)
  • アイコン環境/言語:[Win10Pro(Ver1809)、SQLServer2017、C#(.Net4.7.1)] 
    分類:[.NET] 

    DB(SQLServer2017)も絡む質問なのでこちらへ投稿して良いか分からなかったのですが、
    いくら調べても手掛かりが無いので投稿させて頂きました。

    現在Win10Pro(Ver1809)+SQLServer2017+C#(.Net4.7.1)の環境でアプリケーション構築を行っております。
    このアプリケーションでは画面のテキストボックスにはポルトガル語が入力されるのですが、
    DBに登録するとポルトガル語のアクセント記号が消えてアルファベットのみになってしまいます。
    ※アクセント記号について:https://www.porgoru.com/213.html

    DBテーブルの対象カラムは型をNVARCHARにして、INSERT文には「N'あたい'」の実装も行っており、
    中国語や韓国語は問題無く登録出来ていることを確認しています。
    ポルトガル語でアクセント記号も込みで登録するにはこの対応以外にも必要な何かがあるのでしょうか?

    C#での多言語アプリケーションに詳しい方、いらっしゃいましたらお力添え頂きたいです。
    どうか宜しくお願い致します。

違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■34172 / ResNo.1)  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();
                }
            }
        }
    }

違反を報告
引用返信
■34173 / ResNo.2)  Re[2]: ポルトガル語の登録
□投稿者/ あばば無人君 一般人(2回)-(2019/03/01(Fri) 10:14:41)
  • アイコンNo34172に返信(魔界の仮面弁士さんの記事)
    > SqlParameter の SqlDbType が Text になっていたりはしませんか?
    >
    > たとえば下記の場合、
    > パターン 1 と 3 では正常に書き込まれますが、
    > パターン 2 の時にはアクセント記号が失われます。

    非常に分かりやすいサンプル、ありがとうございます。
    そして参画している案件のSQL発行方式では非常にまずいことがわかりました・・・。

    当案件ではINSERT文を発行する時は
    string sql = "INSERT INTO Test (Id, Message) VALUES (1, N'ポルトガル語')";
    cmd.CommandText = sql;
    cmd.ExecuteNonQuery();
    という風にパラメータを使用せず、直にVALUESの文字列まで含めたSQLを生成しています。

    この発行方式ですとnvarcharカラムのデフォルトのSqlDbTypeが「Text」になってしまう様ですね・・・。

    発行方式の変更をプロジェクトメンバーと検討しようと思います。
    本当にありがとうございました。

    しかし質問しておいてなんですが、何故この様な知識をお持ちなのでしょうか?
    私は「SQLServer 2017 C# ポルトガル語 登録 アクセント記号 消える」のキーワードで
    検索しても1件もヒットしなかったので不思議です。

違反を報告
引用返信
■34174 / ResNo.3)  Re[3]: ポルトガル語の登録
□投稿者/ 魔界の仮面弁士 大御所(1210回)-(2019/03/01(Fri) 10:39:35)
  • アイコンNo34173に返信(あばば無人君さんの記事)
    > 当案件ではINSERT文を発行する時は
    > string sql = "INSERT INTO Test (Id, Message) VALUES (1, N'ポルトガル語')";
    > cmd.CommandText = sql;
    > cmd.ExecuteNonQuery();
    > という風にパラメータを使用せず、直にVALUESの文字列まで含めたSQLを生成しています。


    妙ですね。

    当方環境で追試験してみましたが、下記の 4 や 5 では問題ありませんでした。
    6 については、アクセント記号が失われて
     "Com licenca, voce pode falar Portugues?"
    になってしまいましたけど…。


    // パターン4(非推奨)
    using (var cmd = con.CreateCommand())
    {
     cmd.CommandText = $"INSERT INTO Test (Id, Message) VALUES (4, N'{葡語}')";
     cmd.CommandType = CommandType.Text;
     cmd.ExecuteNonQuery();
    }

    // パターン5(非推奨)
    con.ExecuteScalar($"INSERT INTO Test (Id, Message) VALUES (5, N'{葡語}')");

    // パターン6(非推奨)
    con.ExecuteScalar($"INSERT INTO Test (Id, Message) VALUES (6, '{葡語}')");


    > この発行方式ですとnvarcharカラムのデフォルトのSqlDbTypeが「Text」になってしまう様ですね・・・。
    いや、そもそも SqlParameter を使っていないのなら、SqlDbType は関係ないです。


    > しかし質問しておいてなんですが、何故この様な知識をお持ちなのでしょうか?
    知識なんて無いですよ。検索もしていません。

    質問を受けて、実際に何パターンかで検証してみようと、
    先のコードを書いてみただけのことです。
    ポルトガル語がどんなものかも知りませんでしたので、
    挿入するサンプル文も、Google 翻訳で適当な文章をでっち上げただけですし。
違反を報告
引用返信
■34175 / ResNo.4)  Re[4]: ポルトガル語の登録
□投稿者/ 魔界の仮面弁士 大御所(1211回)-(2019/03/01(Fri) 11:15:24)
  • アイコン
    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, 葡語);

違反を報告
引用返信
■34176 / ResNo.5)  Re[5]: ポルトガル語の登録
□投稿者/ あばば無人君 一般人(3回)-(2019/03/01(Fri) 12:02:32)
  • アイコンNo34175に返信(魔界の仮面弁士さんの記事)
    >>妙ですね。
    >>当方環境で追試験してみましたが、下記の 4 や 5 では問題ありませんでした。

    本当に申し訳ありません。上記の通り問題無く、こちらの試験環境が原因でした。
    再度他言語化対応アプリケーションを試験環境へアップして確認したら問題ありませんでした。

    昨日は私が多言語化対応の調査のために試験環境を占有して使用するはずでしたが、
    私が休憩で離席した時に他の開発員が自前でビルドした実行体を勝手に試験環境へ
    アップしていました。(報告するか、せめて戻してくれていれば・・・)

    こんなくだらないことで魔界の仮面弁士さんのお時間を取らせてしまい本当に申し訳ありませんでした。



    >>知識なんて無いですよ。検索もしていません。
    >>
    >>質問を受けて、実際に何パターンかで検証してみようと、
    >>先のコードを書いてみただけのことです。

    質問から1時間ちょっとであれだけのパターンを検証されたのですね。驚嘆の一言です。
    私も魔界の仮面弁士さんに近づけるように精進致します。



違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-5]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34166 / 親記事)  numericUpDwonコントロールのvalue
□投稿者/ gese 一般人(1回)-(2019/02/26(Tue) 18:24:34)
  • アイコン環境/言語:[c#6.0] 
    分類:[.NET] 

    NumericUpDownコントロールのValueプロパティに値をセットしようとしました。

    Int16型の値はValueプロパティに登録されましたが、
    他の3つはValueプロパティに何も入らずに「0」と表示されてしまいます。
    なぜでしょうか?

    Int16 atai1 = 100;
    numericUpDown1.Value = atai1;

    Int32 atai2 = 200;
    numericUpDown1.Value = atai2;

    Int64 atai3 = 300;
    numericUpDown1.Value = atai3;

    int atai4 = 400;
    numericUpDown1.Value = atai4;

    こちらのサイトにプロパティ値がDecimalになっていると書いてあるので、
    キャストしてみましたが、上と同様にInt16型以外はValueが「0」になってしまいます。こちらもなぜキャストができないのでしょうか?キャストする方法はあるんでしょうか?

    https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.numericupdown.value?view=netframework-4.7.2#System_Windows_Forms_NumericUpDown_Value
    //Int16 atai1 = 100;
    //numericUpDown1.Value = (decimal)atai1;

    //Int32 atai2 = 200;
    //numericUpDown1.Value = (decimal)atai2;

    //Int64 atai3 = 300;
    //numericUpDown1.Value = (decimal)atai3;

    //int atai4 = 400;
    //numericUpDown1.Value = (decimal)atai4;
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34167 / ResNo.1)  Re[1]: numericUpDwonコントロールのvalue
□投稿者/ 魔界の仮面弁士 大御所(1206回)-(2019/02/26(Tue) 18:34:06)
  • アイコン2019/02/26(Tue) 21:35:19 編集(投稿者)

    No34166に返信(geseさんの記事)
    > 環境/言語:[c#6.0] 
    6.0 ということは、最低でも Visual Studio 2015 以上ということですね。


    > NumericUpDownコントロールのValueプロパティに値をセットしようとしました。
    Value プロパティは decimal 型ですので、
    decimal 型の値をセットするべきではありますが、
    整数型から decimal 型への変換は暗黙的に行われるので、
    整数値を代入したとしても、本来は問題無いはずです。


    > 他の3つはValueプロパティに何も入らずに「0」と表示されてしまいます。
    まずは numericUpDown1 の Maximum プロパティを確認してみてください。
    (初期値は 100 です)

    たとえば、Maximum = 100 のままだと、100 よりも大きい値は
    代入できませんので、その場合、Value 値が書き換わることなく、
    直前の値のままになってしまっているのではないでしょうか。


    本来であれば、Minimum〜Maximum の範囲外の値を Value にセットすると
    例外で停止するはずですが、64bit 環境(かつ Windows 8.1 未満)において、
    Form の Load イベント内に記述していた場合、例外が発生しても
    Visual Studio 側で拾えないので、例外を見落としてしまっているのかも。



    > キャストする方法はあるんでしょうか?

    キャストの仕方はそれで正しいです。
    ちなみに末尾に "m" または "M" を付けた場合、decimal 型のリテラルを意味します。

     numericUpDown1.Value = 5.67m;

    小数値を指定する場合は、DecimalPlaces プロパティの設定も忘れずに。



    蛇足ですが、decimal では桁数も管理されるようになっています。
    そのため下記の 2 つは、数値としては同じ値ながらも、
    ToString 時の結果が異なることになります。

    decimal a = 10.0m;
    decimal b = 10.0000m;
    label1.Text = a.ToString();
    label2.Text = b.ToString();
違反を報告
引用返信
■34168 / ResNo.2)  Re[2]: numericUpDwonコントロールのvalue
□投稿者/ gese 一般人(2回)-(2019/02/27(Wed) 09:54:03)
  • アイコン
    >6.0 ということは、最低でも Visual Studio 2015 以上ということですね。
    
    環境はWin7のVS 2015です。
    
    >まずは numericUpDown1 の Maximum プロパティを確認してみてください。
    
    ここが問題でした。Maximumが100でした・・・
    
    >本来であれば、Minimum〜Maximum の範囲外の値を Value にセットすると
    >例外で停止するはずですが、64bit 環境(かつ Windows 8.1 未満)において、
    >Form の Load イベント内に記述していた場合、例外が発生しても
    >Visual Studio 側で拾えないので、例外を見落としてしまっているのかも。
    
    おっしゃる通り64ビットの環境でWin7です。そしてLoad イベントに書いてあります。
    試しにMaximumを1000にして以下のコードを実行したら、ボタン押下時に例外が発生しました。
    
       private void Form1_Load(object sender, EventArgs e)
            {
                Int64 atai3 = 3000;
                numericUpDown1.Value = (decimal)atai3;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Int64 atai3 = 4000;
                numericUpDown1.Value = (decimal)atai3;
            }
    
    >ちなみに末尾に "m" または "M" を付けた場合、decimal 型のリテラルを意味します。
    
    なるほど、これは知りませんでした。
    
    勉強になりました。ありがとうございます。

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34159 / 親記事)  データセット定義ファイルからDataTable
□投稿者/ ナンバー 一般人(2回)-(2019/02/25(Mon) 16:27:43)
  • アイコン環境/言語:[c# 6] 
    分類:[.NET] 

    データセット定義ファイル(xsdファイル)を利用して、DataTableを作成しました。

    参考にしたのは下記のサイトになります。
    https://www.ipentec.com/document/csharp-database-create-dataset

    できたのは下記のURLのようになります。
    https://mscdn.ipentec.com/document/image/csharp-database-create-dataset-05?maxwidth=1440

    MyDataSet.xsdファイルのSimpleProductというDataTableができました。
    ----
    ここからが知りたいことです。

    1.
    SimpleProductというDataTableをインスタンス化するには、このような方法をとりましたが
    あってるでしょうか?

    var dt = new DataTable();
    dt = MyDataSet.SimpleProduct();

    2.
    Form上のボタンを押すたびに、
    このDataTableに行を追加したいと思います。SimpleProductテーブルにはID(主キー)、ProductName、Priceと列情報があります。

    dt.Rows.Add(dt.NewRow()); // ←ここでエラー発生
    dt.[0]["id"] = "1";
    dt.[0]["ProductName"] = "A";
    dt.[0]["Price"] = "100";

    とすると、
    型 'System.Data.NoNullAllowedException' のハンドルされていない例外が System.Data.dll で発生しました

    追加情報:列 'id' に nulls を使用することはできません。

    というエラーメッセージが表示されます。idが主キーだからそのようにメッセージがでるのはわかる気がしますが、
    行を追加するにはどのようにすればいいでしょうか?

違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■34161 / ResNo.1)  Re[1]: データセット定義ファイルからDataTable
□投稿者/ 魔界の仮面弁士 大御所(1203回)-(2019/02/25(Mon) 17:15:40)
  • アイコンNo34159に返信(ナンバーさんの記事)
    > var dt = new DataTable();
    > dt = MyDataSet.SimpleProduct();

    dt への代入を 2 回行っているのは何故でしょうか?

    たとえば普段、
     string s = ""; // 1 回目の代入
     s = textBox1.Text; // 2 回目の代入
    と書くのではなく、
     string s = textBox1.Text; // 1 回目の代入
    と書きますよね。


    > 1.SimpleProductというDataTableをインスタンス化するには、このような方法をとりましたが
    > あってるでしょうか?

    そもそも『dt = MyDataSet.SimpleProduct();』だとコンパイルエラーになりませんでしたか?


    // 案1
    var ds = new MyDataSet();
    var dt = ds.SimpleProduct;

    // 案2
    var dt = new MyDataSet().SimpleProduct;

    // 案3
    var dt = new MyDataSet.SimpleProductDataTable();


    お奨めは 案1 ですが、どの方法でも構いません。
    ただし 案3 の方法だと、dt.DataSet が null になる点にご注意ください。


    上記の dt は System.Data.DataTable 型ではなく、それを継承した
    プロジェクトの名前空間.MyDataSet.SimpleProductDataTable 型である点が肝です。



    > 2.
    > Form上のボタンを押すたびに、
    > このDataTableに行を追加したいと思います。

    (1) MyDataSet.xsd を含むプロジェクトをコンパイルします。

    (2) フォームデザイナーを開くと、ツールボックス先頭に "MyDataSet" が現れるので、
     それを Form1 にドロップします。"myDataSet1" が貼られるはず。

    (3) button1_Click に以下を記述します。
    this.myDataSet1.SimpleProduct.AddSimpleProductRow("1", "A", 100);


    今回の場合、id 列が主キー設定されているようなので、
    同じ id を追加で登録しようとすると、キー重複で制約エラーになります。
    (ただし DataSet の EnforceConstraints を false にしていた場合は、制約エラーが無視されます)


    > dt.Rows.Add(dt.NewRow()); // ←ここでエラー発生
    > dt.[0]["id"] = "1";
    > dt.[0]["ProductName"] = "A";
    > dt.[0]["Price"] = "100";

    「dt.Rows.Add(dt.NewRow());」は実行時エラーで済みそうですが、
    その後の「dt.[0]」という構文は、そもそもコンパイルエラーになりませんか?


    それと、Price 列が 数値(int とか decimal とか)ではなく
    数字(string) な点も気にかかります。
    列のデータ型は、DataSet デザイナーで列を選択して、
    DataType プロパティから確認できますので、確認しておいてください。



    > 行を追加するにはどのようにすればいいでしょうか?

    【型付の DataTable に行を追加する場合】
    // 案1
    dt.AddSimpleProductRow("1", "A", 100);


    // 案2
    var newRow = dt.NewSimpleProductRow();
    newRow.id = "1";
    newRow.ProductName = "A";
    newRow.Price = 100;
    dt.AddSimpleProductRow(newRow);




    【素の DataTable に行を追加する場合】
    // 案1
    dt.Rows.Add("1", "A", 100);

    // 案2
    DataRow newRow = dt.NewRow();
    newRow["id"] = "1";
    newRow["ProductName"] = "A";
    newRow["Price"] = 100;
    dt.Rows.Add(newRow);
違反を報告
引用返信
■34162 / ResNo.2)  Re[2]: データセット定義ファイルからDataTable
□投稿者/ ナンバー 一般人(5回)-(2019/02/26(Tue) 14:10:24)
  • アイコン>そもそも『dt = MyDataSet.SimpleProduct();』だとコンパイルエラーになりませんでしたか?

    はい、コンパイルエラーになりませんでした。

    >上記の dt は System.Data.DataTable 型ではなく、それを継承した
    >プロジェクトの名前空間.MyDataSet.SimpleProductDataTable 型である点が肝です。

    なるほど、よく理解できました。

    >「dt.Rows.Add(dt.NewRow());」は実行時エラーで済みそうですが、
    >その後の「dt.[0]」という構文は、そもそもコンパイルエラーになりませんか?

    コンパイルエラーにはならず、実行時にエラーがでました。

    無事に疑問だったことが解決されました。ありがとうございます。
解決み!
違反を報告
引用返信
■34163 / ResNo.3)  Re[3]: データセット定義ファイルからDataTable
□投稿者/ 魔界の仮面弁士 大御所(1204回)-(2019/02/26(Tue) 16:41:17)
  • アイコンNo34162に返信(ナンバーさんの記事)
    > >そもそも『dt = MyDataSet.SimpleProduct();』だとコンパイルエラーになりませんでしたか?
    > はい、コンパイルエラーになりませんでした。

    それは妙ですね。

    「dt = new MyDataSet.SimpleProduct();」や
    「dt = myDataSet.SimpleProduct;」ならばまだしも、
    「dt = MyDataSet.SimpleProduct();」は、通常ならエラーになるはずなのですが。

    エラーにならなかったのであれば、MyDataSet.cs に対して、
    static な「SimpleProduct メソッド」を追加していたのかもしれません。


    > >「dt.Rows.Add(dt.NewRow());」は実行時エラーで済みそうですが、
    > >その後の「dt.[0]」という構文は、そもそもコンパイルエラーになりませんか?
    > コンパイルエラーにはならず、実行時にエラーがでました。

    「dt.[0]」でなく
    「dt[0]」だったということはないですか?

    「dt.[0]」な記述は、C# では構文エラー『識別子がありません』となるはずです。
    「dt[0]」や「dt.Rows[0]」という構文ならありえますが。


    もしくは、コンパイルに失敗した後の
    『ビルド エラーが発生しました。続行して、最後に成功したビルドを実行しますか?』
    の警告を無視して実行していたとか…。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-3]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34156 / 親記事)  DataTableの構造が同じか調べるメソッド
□投稿者/ ナンバー 一般人(1回)-(2019/02/22(Fri) 17:43:48)
  • アイコン環境/言語:[C#5] 
    分類:[.NET] 

    DataTableが2つあります。このDataTable同士の構造が同じかどうかを簡単に
    判断するメソッドはあるでしょうか?

    DataTableの中身は置いておいて、構造のみ同じかどうかを簡単にしる
    手立てがあればお教え頂けないでしょうか。
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34157 / ResNo.1)  Re[1]: DataTableの構造が同じか調べるメソッド
□投稿者/ 魔界の仮面弁士 大御所(1201回)-(2019/02/22(Fri) 18:55:47)
  • アイコンNo34156に返信(ナンバーさんの記事)
    > DataTableが2つあります。このDataTable同士の構造が同じかどうかを簡単に
    > 判断するメソッドはあるでしょうか?

    こんなのはどうでしょう。

    var ms1 = new MemoryStream();
    var ms2 = new MemoryStream();
    dataTable1.WriteXmlSchema(ms1);
    dataTable2.WriteXmlSchema(ms2);

    bool isSameSchema = ms1.ToArray().SequenceEqual(ms2.ToArray());



    > DataTableの中身は置いておいて、構造のみ同じかどうかを簡単にしる

    比較すべき「構造」情報に、TableName プロパティの差を
    含めれるかどうかも検討する必要がありそうです。

    たとえば、下記の 2 つを同じものとみなすか否か。

    var dt1 = new DataTable("Employees") { Columns = { new DataColumn("Id"), new DataColumn("Name"), new DataColumn("EMail") } };
    var dt2 = new DataTable("Customers") { Columns = { new DataColumn("Id"), new DataColumn("Name"), new DataColumn("EMail") } };
違反を報告
引用返信
■34160 / ResNo.2)  Re[2]: DataTableの構造が同じか調べるメソッド
□投稿者/ ナンバー 一般人(3回)-(2019/02/25(Mon) 16:28:19)
  • アイコン比較できました。ありがとうございます。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▲上のスレッド
■34153 / 親記事)  ネットの画像の複数枚を重ね合わせたい
□投稿者/ そら 一般人(1回)-(2019/02/21(Thu) 18:19:05)
  • アイコン環境/言語:[環境(Windows 7 32bit)、使用言語(VB.NET)] 
    分類:[.NET] 

    サイト上にある.gif画像数枚をpictureboxに重ね合わせて表示したいです。
    http://www.*****.jp/Img/1.gif ←地図の画像
    http://www.*****.jp/Img/2.gif ←マーク

    このふたつの画像は同じサイズで、マークの画像のまわりは透明になっています。地図の上にマークを表示させたいです。何か方法はありますか?
違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■34154 / ResNo.1)  Re[1]: ネットの画像の複数枚を重ね合わせたい
□投稿者/ 魔界の仮面弁士 大御所(1200回)-(2019/02/21(Thu) 19:07:30)
  • アイコンNo34153に返信(そらさんの記事)
    > このふたつの画像は同じサイズで、マークの画像のまわりは透明になっています。

    PictureBox1.BackgroundImageLayout = ImageLayout.None
    PictureBox1.Load("http://www.*****.jp/Img/1.gif") '←地図の画像
    PictureBox1.BackgroundImage = PictureBox1.Image
    PictureBox1.Load("http://www.*****.jp/Img/2.gif") '←マーク
違反を報告
引用返信
■34155 / ResNo.2)  Re[2]: ネットの画像の複数枚を重ね合わせたい
□投稿者/ そら 一般人(2回)-(2019/02/22(Fri) 16:09:22)
  • アイコンNo34154に返信(魔界の仮面弁士さんの記事)

    こんにちは。回答ありがとうございます。魔界の仮面弁士さんのコードでは正しく実行できました。しかし、3枚以上の画像をこのように重ねようとすると
    PictureBox1.BackgroundImageLayout = ImageLayout.None
    PictureBox1.Load("http://www.*****.jp/Img/1.gif") '←地図の画像
    PictureBox1.BackgroundImage = PictureBox1.Image
    PictureBox1.Load("http://www.*****.jp/Img/2.gif") '←マーク
    PictureBox1.BackgroundImage = PictureBox1.Image
    PictureBox1.Load("http://www.*****.jp/Img/3.gif") '←マーク2つ目

    地図の画像が重ねられていなく、マークの画像2枚だけが重ねられてしまいます。
    この問題を解決するためにはどうすればいいのでしょうか?

違反を報告
引用返信
■34158 / ResNo.3)  Re[3]: ネットの画像の複数枚を重ね合わせたい
□投稿者/ 魔界の仮面弁士 大御所(1202回)-(2019/02/22(Fri) 19:04:34)
  • アイコンNo34155に返信(そらさんの記事)
    > 3枚以上の画像をこのように重ねようとすると

    (案1) PictureBox1.BackgroundImage に地図画像を割り当てて、
     Paint イベントにてマークを e.Graphics.DrawImage する。


    (案2) 画像サイズの Bitmap インスタンスを生成して Graphics.FromImage し、
     そこに地図やマークを DrawImage した後、その Bitmap インスタンスを
     PictureBox1.Image プロパティに割り当てる。


    描画処理については、ここの Tips 集などを参考に。
    https://dobon.net/vb/dotnet/graphics/index.html
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-3]






Mode/  Pass/


- Child Tree -

2020/12/02(Wed) 11:09:02 に作成されたキャッシュを表示しています。
生のデータを表示する | キャッシュを最新にする