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

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

記事リスト ( )内の数字はレス数
UpDate2つのradの数値から1つの角度を求めるコードを改善できますか?(C++)(2) | Nomalコンソールアプリで、WebView2の利用(2) | NomalEntity Frameworkは、使えるか?(2) | Nomalデータベースからのテーブル名一覧の効率的な取得方法(3) | NomalC#のlong型でオーバーフローになる(2) | Nomal正規表現のパターン表記方法(2) | NomalWebView2によるスクレ―ピング(4) | Nomalこういた物を作れますか?(2) | Nomalツールボックスにtableadapterが表示されない(1) | NomalC# Chart X軸上のグラフ表示(3) | NomalVB.NETでBluetoothデバイスの電池残量を取得する方法(3) | Nomalクリスタルレポート 明細部のサブレポート(0) | Nomal重なったPictureBox同士を透過する方法(7) | NomalWindowsフォームデザイナについて(3) | NomalVB.NETからcmdでpingを実行した時の結果(5) | Nomalvb.netでExcelファイル操作(7) | Nomalvb.netでのExcelファイルそうさ(2) | Nomalキーボード+バーコードでキーボード入力を無効にしたい(6) | Nomalファイルとして配置したマニフェストを優先したい(2) | NomalTabPageの背景色(5) | NomalVB2022でクリスタルレポートが開けない(2) | NomalC#でJpeg圧縮のTiffファイルを作成したい(4) | Nomalエクセルのみ監視ができない(2) | NomalDataGridViewのVirtualModeを有効した場合の実装方法(4) | NomalExcelの数値 -> 日付みたいな関数?(2) | NomalDrawstringでの透過文字作成(3) | Nomaljumbo icon(256x256)が存在するか知る方法(6) | NomalSpinWait()を使う理由(2) | Nomalantecedentってなんですか?(2) | Nomalワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る(3) | Nomalstyle.displayだと効率悪いから違うやり方をしたいです。(5) | Nomalテーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。(4) | NomalJSONの複雑な入れ子内部の値を取りたい。(3) | Nomalグリッド表示レコードをJSONに変換(5) | Nomalシステム時計の設定(3) | NomalSeleniumで開いているページのTableを編集したい(5) | Nomalソケット通信入門 ひらがな(4) | NomalVisual Basicでエラーが出る(3) | Nomalインストーラにて、ローミングフォルダにファイルを配置したい(0) | NomalRGB値の所得(2) | NomalVB.net からAccessDBへの接続(2) | Nomal時間変数(文字列)の扱い(4) | Nomal画像のスクロール(6) | Nomalタイマーの一括処理(6) | NomalTreeViewとDataGridViewのスクロールを同期(シンクロ)させたい(4) | NomalTreeViewの現在位置とDataGridViewの現在位置を合わせたい(7) | Nomalフォームのリサイズ時にDataGridViewが再描画されない(4) | NomalPDFをフォーム上で表示させる方法につきまして(4) | NomalPictureBoxの画像を連続保存(11) | NomalテキストボックスのValidatingイベントよりも先に発生するボタン発生イベントは何でしょう?(2) | Nomal継承元フォームで各フォームのボタン動作を検知したい(3) | NomalWindowsエクスプローラからのドラッグ&ドロップ(2) | Nomalラジオボタンの一括設定(7) | Nomalクリックイベントでexeを作成できるか(2) | Nomal作成した白黒画像をWordに貼り付けてから「図として保存」(8) | Nomalアセンブリ情報が載らない(1) | NomalRichTextBoxのテキストをpictureBOXへ(12) | Nomalc#で日付型の定義の仕方で質問があります。(2) | Nomal先頭に空白(スペース)があるファイルを読み込んでRichTextBoxへ書き出すとスペースが削除える(6) | NomalExcel Com オブジェクトの増殖(13) | Nomal二次元マップから値の取得(1) | NomalアプリでHDMIへ出す解像度を変えたい(4) | NomalDataGridViewのドロップダウンリストの表示と選択後の値を分けたい(1) | Nomal列車の時間ごとの位置情報を表示したいです。(2) | Nomal画像の中心を基点に回転(4) | NomalDataGridViewの行ヘッダーに行番号を表示した時のエラー(4) | NomalタッチキーボードでIMEを自動で切替えたい(6) | NomalVSTOによるエクセルアドインのインストーラーでのアップデート(1) | NomalMP4動画を再生する方法について(5) | NomalVB.NetでVB6.0と同じFontを指定しても同様に印刷されない(9) | NomalLabelで文字単位の背景色(7) | NomalLableのカラー色を文字変数から変更したい(5) | NomalUrlにアクセスするとダウンロードされるファイルを捕まえる(2) | Nomalタブレット等でスワイプによるスクロールを実装(2) | NomalTEXTBOXのプロパティを文字列に(7) | NomalPDFをフォーム上で表示させる方法につきまして(6) | NomalChart X軸上の描画を切り替えたい(0) | NomalRichTextBoxへのドラッグ&ドロップしたExcelファイルの扱い(3) | Nomal特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因(6) | NomalASP.NET WebApi内でXmlReader.Create(url)がタイムアウトする(4) | NomalDatagridViewでファンクションキーを止めたい(5) | Nomal表示動作が重くなる(3) | Nomalbitmapを複数スレッドで処理したい(2) | Nomalフォーム背景のみを半透明にしたい(5) | Nomal読み出し元フォームの位置取得方法(2) | NomalLoadOptionのパラメータの意味(3) | Nomalコンストラクターに続く{}の意味(2) | Nomal1行で書くことできますか?(3) | Nomalvb.netで7zの圧縮・解凍をしたい。(2) | NomalCommandBuilderによって作られるCommandTextの内容(5) | NomalC# NASでのプログレスバー有りのコピー(0) | NomalDataViewのFindRowsde(7) | Nomal正規表現で文字の繰り返しパターン(4) | NomalNPOIでのエクセル編集で期待通りに書き込めません(2) | NomalFormのサイズ変更で掴める辺を制限したい(2) | NomalDataGridのSetDataBindingに代わるもの?(3) | Nomalビデオ圧縮のコーデック(2) | NomalWindowsMediaPlayerで次のURLを指定しても反映されない。(3) | NomalVSTOとWebView2の共存って可能?(3) | NomalDataGridViewの特定セルにボタンを配置する方法(5) |



■記事リスト / ▼下のスレッド
■35105 / 親記事)  LoadOptionのパラメータの意味
□投稿者/ Wan 付き人(73回)-(2022/07/20(Wed) 08:21:43)
  • アイコン環境/言語:[VisualBasic2019 Windows10 Basic Framework4.7.2] 
    分類:[.NET] 

    マイクロソフトのDocsのDataTable.Load メソッドのLoadOptionところに下記のような記述があります。
    https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datatable.load?view=net-6.0#system-data-datatable-load(system-data-idatareader-system-data-loadoption)
    「メソッドの呼び出し Load 時に OverwriteChanges または PreserveChanges オプションを指定すると、受信データが 'プライマリ データ ソースから送信され、DataTable が変更を DataTable追跡し、変更をデータ ソースに反映できることを前提とします。 Upsert オプションを選択した場合、データは、中間層コンポーネントによって提供されるデータなど、セカンダリ データ ソースのいずれかから取得されたものと見なされ、ユーザーによって変更される可能性があります。 この場合、意図は、1 つ以上のデータ ソースからデータを集計し、データをプライマリ データ ソース DataTableに反映することを前提とします。 この LoadOption パラメーターは、主キー比較に使用する行の特定のバージョンを決定するために使用されます。」

    この内容が全く理解できません。
    @ プライマリーデータソース、セカンダリーデータソースって何ですか?Load()の結果Setが複数あり、一つ目をプライマリー、二つ目以後を纏めてセカンダリーと呼んでるのでしょうか?
    A 「プライマリ データ ソースから送信され」とは、Dt.Load()とした場合のDtにスキーマ情報が無い場合は、プライマリーデータからスキーマ情報をすべて取得することを前提としているという解釈でしょうか?
    B 「データをプライマリ データ ソース DataTableに反映することを前提」とは、Dt.Load() のDtにスキーマ情報が存在する場合は、必要に応じて列の追加処理を行うという意味でしょうか?
    C 「主キー比較に使用する行の特定のバージョン」とは、OverwriteChangesは、Originalの主キーデータを、PreserveChangesは、Currentの、Upsertは、Originalが存在すればOriginalを存在しなければCurrentの値を比較するという意味であってますか?

    詳しい方宜しくお願い致します。

違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■35106 / ResNo.1)  Re[1]: LoadOptionのパラメータの意味
□投稿者/ Hongliang 大御所(631回)-(2022/07/20(Wed) 10:19:27)
  • アイコンまずそもそも、DataTable.Load(IDataReader, LoadOption)は、
    > Fills a DataTable with values from a data source using the supplied IDataReader. If the DataTable already contains rows, the incoming data from the data source is merged with the existing rows according to the value of the loadOption parameter.
    > IDataReaderによって提供されるデータソースの値でDataTableを満たします。データテーブルがすでに行を含んでいる場合、データソースからのデータはloadOptionパラメータの値に従って既存の行とマージされます。
    というメソッドであり、loadOptionパラメータは「データソースからのデータ」と「DataTableに既に存在しているデータ」のマージの方法を指定するものです。
    例えばDataTableが空であれば特に意味を持ちません。

    > @ プライマリーデータソース、セカンダリーデータソースって何ですか?Load()の結果Setが複数あり、一つ目をプライマリー、二つ目以後を纏めてセカンダリーと呼んでるのでしょうか?

    複数のデータソースを扱う場合の話ですね。
    大本のデータソースとなるDBからいったんFillして、追加分をまとめたXMLをセカンダリデータソースとしてLoadでマージするとか。

    > A 「プライマリ データ ソースから送信され」とは、Dt.Load()とした場合のDtにスキーマ情報が無い場合は、プライマリーデータからスキーマ情報をすべて取得することを前提としているという解釈でしょうか?

    この記述はスキーマ情報とは関係ないです。
    DataTableがスキーマを持っていない場合の挙動は別の段落に記載があります。
    (そしてDataTableがスキーマを持っていないならそのDataTableは空ということですから、loadOptionは意味を持ちません)

    > B 「データをプライマリ データ ソース DataTableに反映することを前提」とは、Dt.Load() のDtにスキーマ情報が存在する場合は、必要に応じて列の追加処理を行うという意味でしょうか?

    ここもスキーマとは関係ないです。
    スキーマに関することは別段落に記載があり、その際の挙動は表にまとめられています。
    OverwriteChanges/PreserveChangesでLoadしたデータはプライマリデータソースからのデータとみなし、あとあとデータソースに反映させることができるようにDataTableの変更を追跡する、ということです。
    一方Upsertは、Loadするデータがセカンダリデータソースからのデータであるとみなされます。

    > C 「主キー比較に使用する行の特定のバージョン」とは、OverwriteChangesは、Originalの主キーデータを、PreserveChangesは、Currentの、Upsertは、Originalが存在すればOriginalを存在しなければCurrentの値を比較するという意味であってますか?

    表を見る限り、OverwriteChangesとPreserveChangesは同じになっていますが?
違反を報告
引用返信
■35107 / ResNo.2)  Re[1]: LoadOptionのパラメータの意味
□投稿者/ 魔界の仮面弁士 大御所(1436回)-(2022/07/20(Wed) 16:38:40)
  • アイコン2022/07/20(Wed) 16:46:02 編集(投稿者)

    No35105に返信(Wanさんの記事)
    > マイクロソフトのDocsのDataTable.Load メソッドのLoadOptionところに下記のような記述があります。
    > https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datatable.load?view=net-6.0#system-data-datatable-load(system-data-idatareader-system-data-loadoption)

    機械翻訳で文章が崩れているので、人力翻訳されていた頃(VS2008 まで)の
    ドキュメントの方が読み解きやすいかも知れません。下記から入手できます。
    https://www.microsoft.com/ja-jp/download/details.aspx?id=20955

    上記をインストール後、該当ページはこのあたり。
    ms-help://MS.MSDNQTR.v90.ja/fxref_system.data/html/37e7d8d2-8981-efdd-e808-c319ccb71685.htm
    ms-help://MS.MSDNQTR.v90.ja/fxref_system.data/html/16edeab2-613e-c1f8-a1bf-f39d9a655ad0.htm

    上記から引用:
    |
    | Load メソッドを呼び出すときに OverwriteChanges オプションまたは PreserveChanges オプションを
    | 指定した場合、受信データは DataTable の主データ ソースから受信されており、DataTable によって
    | 変更が追跡され、変更をデータ ソースに反映できることが想定されます。Upsert オプションを
    | 選択した場合、データは中間層コンポーネントから得られるデータなどの 2 次データ ソースの
    | 1 つから受信されていることが想定されます。これはユーザーにより変更されている可能性があります。
    | その場合、DataTable 内の 1 つ以上のデータ ソースのデータを集約した後、そのデータを
    | 主データ ソースに反映する意図があることが想定されます。主キーの比較に使用する
    | 行のバージョンを特定するために、LoadOption パラメータが使用されます。
    |
    ----
    |
    | 一般的に PreserveChanges オプションと OverwriteChanges オプションでは、ユーザーが
    | DataSet およびその変更を主データ ソースと同期する必要がある場合を想定しています。
    | Upsert オプションは、1 つ以上の 2 次データ ソースの変更を集約するときに役立ちます。
    |


    > @ プライマリーデータソース、セカンダリーデータソースって何ですか?
    > Load()の結果Setが複数あり、一つ目をプライマリー、二つ目以後を纏めてセカンダリーと呼んでるのでしょうか?

    DataTable は、単一の主データソース(a single primary data source)により同期・更新されます。
    さらに DataTable には、1 つ以上の 2 次データソース(one or more secondary data sources)の
    増分データ(incremental data)を加えることもできます。


    > C 「主キー比較に使用する行の特定のバージョン」とは、
    > OverwriteChangesは、Originalの主キーデータを、
    > PreserveChangesは、Currentの、
    > Upsertは、Originalが存在すればOriginalを存在しなければCurrentの値を比較するという意味であってますか?

    既存行に対する DataRow の特定は PrimaryKey 制約によって行われるわけですが、マッチングされた既存行の
    RowState As DataRowState プロパティに対して、LoadOption がどのように作用するのかを示したものですね。


    Load 時に OverwriteChanges が指定された場合、Original と Current の両方に書き込まれます。
    そして新データにマッチした既存行は、全て Unchanged 状態に上書きされます。
    Deleted 状態だった既存行も、削除が元に戻されて Unchanged 状態に復帰します。
    既存行とマッチしない新規行も、 Unchanged 状態で取り込まれます。

    Load 時に PreserveChanges が指定された場合、Original に書き込まれます。
    Added / Modifed な既存行は、いずれも Modifed 状態になります。
    Unchanged/Deleted な既存行の RowState はそのまま維持されます。
    既存行とマッチしない新規行も、 Unchanged 状態で取り込まれます。

    Load 時に Upsert が指定された場合、Current に対して書き込まれます。
    Added/Modifed な行の RowState はそのまま維持されます。
    Unchanged だった行は、新しい値に応じて Unchanged または Modified のいずれかになります。
    既存行とマッチしない新規行は、 Added 状態で取り込まれます。
違反を報告
引用返信
■35117 / ResNo.3)  Re[2]: LoadOptionのパラメータの意味
□投稿者/ Wan 付き人(74回)-(2022/07/27(Wed) 18:33:48)
  • アイコンHongliang様、魔界の仮面弁士様
    いつも御指南ありがとうございます。
    お返事したつもりが、遅れていなかったようで、結果的に、お礼が遅くなりすみません。
    両者に御指南頂いた内容を熟読して自己研鑽に励みたいと思います。
    現在格闘中です。

    有難うございました

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

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35102 / 親記事)  コンストラクターに続く{}の意味
□投稿者/ Wan 付き人(71回)-(2022/07/12(Tue) 10:47:51)
  • アイコン環境/言語:[VisualBasic2019 Windows10 Basic Framework4.7.2] 
    分類:[.NET] 

    基本的な文法の分類になると思いますが・・・
    コンストラクターの次に続く{}の意味を教えてください。

    次のコードで、New DataColumn()に続いて{}を入力すると、IntelliSenseが働きます。With{}でないので、DataColumnのプロパティではないと思いますが?
    何が、リストアップされるのでしょうか?(pkOrderIDも表示されます)
    また、どのような場合にこれが使えるのでしょうか?
    試しに、Dim Ds As New DataSet("DsTest")に続いて{}を書いてもIntelliSenseは働きません。

    宜しくお願いします。

    Sub Test()
     Dim Ds As New DataSet("DsTest")
    Dim Dt As DataTable = Ds.Tables.Add("DtTest")
    Dim pkOrderID As DataColumn = Dt.Columns.Add("OrderID", Type.GetType("System.Int32"))
    Dt.PrimaryKey = New DataColumn() {pk} ←pkと入力するとpkOrderIDがリストアップされる
    End Sub
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35103 / ResNo.1)  Re[1]: コンストラクターに続く{}の意味
□投稿者/ Hongliang 大御所(630回)-(2022/07/12(Tue) 11:06:09)
  • アイコン> Dt.PrimaryKey = New DataColumn() {pk} ←pkと入力するとpkOrderIDがリストアップされる

    この場合、New DataColumn()は DataColumnの引数なしコンストラクタではなく、DataColumn()、つまりDataColumnの配列をNewしている式になります。
    { }に並べるのは配列の初期要素列です。DataColumnの配列なので個々の要素はDataColumnであり、pkOrderIdももちろん要素に指定可能ということになります。
違反を報告
引用返信
■35104 / ResNo.2)  Re[2]: コンストラクターに続く{}の意味
□投稿者/ Wan 付き人(72回)-(2022/07/12(Tue) 12:39:02)
  • アイコンHongliang様
    いつも大変お世話になっております。

    なるほど・・・です。
    VBだから、分かりづらいんですね?
    PrimaryKetのパラメータがDataColumn[]だから、このような形になるんだと理解しました。

    初歩的なことにも丁寧に回答頂き助かります。
    有難うございました。
解決み!
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35098 / 親記事)  1行で書くことできますか?
□投稿者/ Wan 付き人(69回)-(2022/07/11(Mon) 15:10:51)
  • アイコン環境/言語:[VisualBasic2019 Windows10 Basic Framework4.7.2] 
    分類:[.NET] 

    Dim DV = New DataView(Ds.Tables("既存テーブル"))
    DataGridView1.DataSource = DV
    DV.RowFilter = "年齢 > 40"
    と、3行で書いているものを
    DataGridView1.DataSource = (New DataView(Ds.Tables("既存テーブル")).RowFilter = "年齢 > 40")
    のように、1行で書くことできますか?
    

違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■35099 / ResNo.1)  Re[1]: 1行で書くことできますか?
□投稿者/ 魔界の仮面弁士 大御所(1433回)-(2022/07/11(Mon) 16:04:13)
  • アイコンNo35098に返信(Wanさんの記事)
    > 1行で書くことできますか?

    こういうことで良いのかな。

    DataGridView1.DataSource = New DataView(ds.Tables("既存テーブル"), "年齢 > 40", "", DataViewRowState.CurrentRows)
違反を報告
引用返信
■35100 / ResNo.2)  Re[2]: 1行で書くことできますか?
□投稿者/ 魔界の仮面弁士 大御所(1435回)-(2022/07/11(Mon) 16:05:42)
  • アイコンNo35099に追記(魔界の仮面弁士の記事)
    > こういうことで良いのかな。

    もしくは
    = New DataView(ds.Tables("既存テーブル")) With {.RowFilter = "年齢 > 40"}
違反を報告
引用返信
■35101 / ResNo.3)  Re[3]: 1行で書くことできますか?
□投稿者/ Wan 付き人(70回)-(2022/07/11(Mon) 16:16:26)
  • アイコン魔界の仮面弁士様
    いつもお世話になっております。

    必死になって、()を色々付け替えて無駄な、時間を費やしていました。
    本当に、視野が狭くなっていました。
    指摘されると、はっ!と思うものでした。

    有難うございました。

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

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35093 / 親記事)  vb.netで7zの圧縮・解凍をしたい。
□投稿者/ かい 一般人(1回)-(2022/07/01(Fri) 10:08:11)
  • アイコン環境/言語:[VB.NET] 
    分類:[.NET] 

    vb.netプロジェクトに7zでファイル圧縮、解凍する機能を追加したいと思っております。
    7-ZIP32.DLLを使いたいと思ったのですがC#でのサンプルしか見つけられません。
    DotNetZipのように使えるものはあるのでしょうか?
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35094 / ResNo.1)  Re[1]: vb.netで7zの圧縮・解凍をしたい。
□投稿者/ KOZ 一般人(1回)-(2022/07/01(Fri) 15:20:48)
  • アイコンNo35093に返信(かいさんの記事)
    > 7-ZIP32.DLLを使いたいと思ったのですがC#でのサンプルしか見つけられません。

    C# のサンプルがあるなら
    https://converter.telerik.com/
    で VB.NET に変換してみてはいかがでしょう
違反を報告
引用返信
■35096 / ResNo.2)  Re[1]: vb.netで7zの圧縮・解凍をしたい。
□投稿者/ kiku 一般人(1回)-(2022/07/06(Wed) 16:31:39)
  • アイコンNo35093に返信(かいさんの記事)
    > vb.netプロジェクトに7zでファイル圧縮、解凍する機能を追加したいと思っております。
    > 7-ZIP32.DLLを使いたいと思ったのですがC#でのサンプルしか見つけられません。
    > DotNetZipのように使えるものはあるのでしょうか?

    だいぶ古い記事ですが、下記が参考になりそう。
    https://www.petitmonte.com/bbs/answers?question_id=28055
違反を報告
引用返信

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



■記事リスト / ▲上のスレッド
■35088 / 親記事)  CommandBuilderによって作られるCommandTextの内容
□投稿者/ Wan 付き人(66回)-(2022/06/28(Tue) 12:10:57)
  • アイコン環境/言語:[VisualBasic2019 Windows10 Basic Framework4.7.2] 
    分類:[.NET] 

    VisualStudio2019で、データベースの使用を勉強しています。
    Accessに接続して、OleDbCommandBuilderを実行したところ、コメントのようなCommandTextを取得することができました。
    UPDATE文、DELETE文のCommandTextの中の(? = 1 AND 苗字 IS NULL)の意味を教えて頂けませんか?
    「苗字 IS NULL」は、レコードの苗字列の値がDbNullの場合はTrueを返すという事は理解していますが、「? = 1」の意味が解りません。
    
    詳しい方、宜しくお願い致します。
    
    (Accessのテーブル構成)
    インスタンス名	Access2010
    データベース名	データベース勉強用DB
    論理テーブル名	Test
    物理テーブル名	INSERT文.accdb
    
    列定義
    No	論理名	物理名	データ型	Null許容	主キー
    1	ID	ID	長整数(8,0)	No	    Yes
    2	苗字	苗字	テキスト型(10)	No	
    3	名前	名前	テキスト型(10)	No	
    4	年齢	年齢	十進数(18)	No	
    
    Dim oledb As String = "Microsoft.ACE.OLEDB.16.0;"
    Dim acfile As String = "D:\データベース勉強用DB\INSERT文.accdb"
    Dim Cn As New OleDb.OleDbConnection($"Provider={oledb} Data Source={acfile}")
    Dim Da As New OleDbDataAdapter("SELECT * FROM 既存テーブル", Cn)
    Dim Ds As New DataSet
    Da.Fill(Ds, "Test")
    Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(Da)
    Dim INS_Cmd = builder.GetInsertCommand()
    Dim UPD_Cmd = builder.GetUpdateCommand()
    Dim DEL_Cmd = builder.GetDeleteCommand
    
    以下のCommandTextが設定されます。
    'INS_ Cmd.CommandText : INSERT INTO 既存テーブル (苗字, 名前, 年齢) VALUES (?, ?, ?)
    
    'UPD_ Cmd.CommandText :UPDATE 既存テーブル SET 苗字 = ?, 名前 = ?, 年齢 = ? 
    WHERE ((ID = ?) AND 
    ((? = 1 AND 苗字 IS NULL) OR (苗字 = ?)) AND 
    ((? = 1 AND 名前 IS NULL) OR (名前 = ?)) AND 
    ((? = 1 AND 年齢 IS NULL) OR (年齢 = ?)))
    
    ' DEL_Cmd.CommandText:DELETE FROM 既存テーブル 
    WHERE ((ID = ?) AND 
    ((? = 1 AND 苗字 IS NULL) OR (苗字 = ?)) AND 
    ((? = 1 AND 名前 IS NULL) OR (名前 = ?)) AND 
    ((? = 1 AND 年齢 IS NULL) OR (年齢 = ?)))
    
    

違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■35089 / ResNo.1)  Re[1]: CommandBuilderによって作られるCommandTextの内容
□投稿者/ 魔界の仮面弁士 大御所(1430回)-(2022/06/28(Tue) 14:16:04)
  • アイコンNo35088に返信(Wanさんの記事)
    > UPDATE文、DELETE文のCommandTextの中の(? = 1 AND 苗字 IS NULL)の意味を教えて頂けませんか?

    データベース側では、名前や型を明示したパラメーターをサポートしているのですが、
    OleDbConnection オブジェクトからだと、無名パラメーターしか使えないんですよね…。
    ACEDAO 経由で呼ぶ場合は名前付きにできるのですが。
    https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/parameters-declaration-microsoft-access-sql


    > 「苗字 IS NULL」は、レコードの苗字列の値がDbNullの場合はTrueを返すという事は理解していますが、「? = 1」の意味が解りません。

    空文字列と NULL を区別するための措置です。

    たとえば
     WHERE (? = 1 AND 苗字 IS NULL) OR (苗字 = ?)
    という部分を
     WHERE ([引数1] = 1 AND 苗字 IS NULL) OR (苗字 = [引数2])
    のように読み替えてみます。

    そのうえで、VB 側からは
     Dim 引数1 As Integer, 引数2 As String
     If NULLをセットしたい場合 Then
      引数1 = 1
      引数2 = Nothing '未使用
     Else
      引数1 = 0
      引数2 = TextBox1.Text
     End If
    のような引数が渡されるイメージです。
違反を報告
引用返信
■35090 / ResNo.2)  Re[2]: CommandBuilderによって作られるCommandTextの内容
□投稿者/ Wan 付き人(67回)-(2022/06/28(Tue) 20:14:25)
  • アイコン
    魔界の仮面弁士様
    いつも丁寧がご指導ありがとうございます。
    
    折角教えて頂いたのですが、私の理解力が追いつきません。
    CommandBuilderで、CommandTextを取得した時にに設定されるParameterのプロパティは次のようになっています。
    DeleteCommanndのみ記載
    Paramete
    Name	DbType	OleDbType	SourceColumn	Direction	SourceVersion	Value
    p1	Int32{11}	Integer{3}	ID	Input{1}	Original{256}	Nothing
    p2	String(16)	VarWChar{202}	苗字	Input{1}	Original{256}	Nothing
    p3	String(16)	VarWChar{202}	苗字	Input{1}	Original{256}	Nothing
    p4	String(16)	VarWChar{202}	名前	Input{1}	Original{256}	Nothing
    p5	String(16)	VarWChar{202}	名前	Input{1}	Original{256}	Nothing
    p6	Decimal(7)	Numerid{113}	年齢	Input{1}	Original{256}	Nothing
    p7	Decimal(7)	Numerid{113}	年齢	Input{1}	Original{256}	Nothing
    
    これを見ると、引数1と引数2は同じ値になり、しかも、苗字と名前に関してはString型と1の比較を行っていることになります。
    Dim Str1 As String = "山田"
    If Str1 = 1 Then
     〜省略〜
    End If
    とすると: 'String "山田" から型 'Double' への変換は無効です。'
    となります。
    SQL文では、文字列と数値が比較できるのでしょうか?
    お手を煩わせます。

違反を報告
引用返信
■35091 / ResNo.3)  Re[1]: CommandBuilderによって作られるCommandTextの内容
□投稿者/ 魔界の仮面弁士 大御所(1431回)-(2022/06/28(Tue) 20:51:37)
  • アイコン
    No35088に返信(Wanさんの記事)
    > 'UPD_ Cmd.CommandText :UPDATE 既存テーブル SET 苗字 = ?, 名前 = ?, 年齢 = ? 
    > WHERE ((ID = ?) AND 
    > ((? = 1 AND 苗字 IS NULL) OR (苗字 = ?)) AND 
    > ((? = 1 AND 名前 IS NULL) OR (名前 = ?)) AND 
    > ((? = 1 AND 年齢 IS NULL) OR (年齢 = ?)))
    
    No35089 の機能は、SourceColumnNullMapping プロパティによって制御されています。
    
    Dim sb As New System.Text.StringBuilder()
    sb.AppendLine($"UpdateCommand のパラメータ数={UPD_Cmd.Parameters.Count}")
    For Each p As OleDbParameter In UPD_Cmd.Parameters
        sb.Append($"{p.ParameterName,-4}{vbTab}")
        sb.Append($"{p.SourceVersion,-8}{vbTab}")
        sb.Append($"{If(p.SourceColumnNullMapping, "T", "F")}{vbTab}")
        sb.Append($"{p.OleDbType,-8}{vbTab}")
        sb.AppendLine($"{p.SourceColumn}")
    Next
    Debug.WriteLine(sb.ToString())
    
    上記を実行すると、このような表が得られます。
    p1,p5,p6 の違いに着目してみてください。
    
    ================================================
    UpdateCommand のパラメータ数=10
    p1    Current    F   VarWChar  苗字
    p2    Current    F   VarWChar  名前
    p3    Current    F   Numeric   年齢
    p4    Original   F   Integer   ID
    p5    Original   T   Integer   苗字
    p6    Original   F   VarWChar  苗字
    p7    Original   T   Integer   名前
    p8    Original   F   VarWChar  名前
    p9    Original   T   Integer   年齢
    p10   Original   F   Numeric   年齢
    ================================================
    
    Original は SELECT した時点の元の値を意味し、
    Current は、これから反映させたい編集後の値です。
    
    「p5 と p6」「p7 と p8」「p9 と p10」では、
    SourceColumn は同じですが、
    SourceColumnNullMapping が異なっていますよね。これが
     (? = 1 AND {SourceColumn} IS NULL) OR ({SourceColumn} = ?)
    の正体となります。
    
    
    --- 以下蛇足 ---
    > インスタンス名	Access2010
    Access 2010 世代のプロバイダー名は、本来は
    "Microsoft.ACE.OLEDB.12.0" ですね。もちろん
    "Microsoft.ACE.OLEDB.16.0" からでもアクセス可能ですが。
    
    
    > Dim oledb As String = "Microsoft.ACE.OLEDB.16.0;"
    oledb という変数名を付けて後で、それと同名の
    > Dim Cn As New OleDb.OleDbConnection(…
    な OleDb 名前空間を記述されていますね。
    名前が被って分かりにくくなりませんか?
    
    それ以外の
    > Dim Da As New OleDbDataAdapter(…
    > Dim builder As OleDbCommandBuilder = …
    では、OleDb. が無い状態にそろえてあるのに対し、
    oledb 変数名が必要なところだけが意図的に
    OleDb. 付きの表記なので、ちょっと混乱しそうです。
    もちろん、文法的には問題ないのですけれども。
    
    
    > Dim Cn As New OleDb.OleDbConnection($"Provider={oledb} Data Source={acfile}")
    プロバイダー名にセミコロンを入れるのは不自然ですね。
     Dim oledb As String = "Microsoft.ACE.OLEDB.16.0;"
     $"Provider={oledb} Data Source={acfile}"
    よりは
     Dim oledb As String = "Microsoft.ACE.OLEDB.16.0"
     $"Provider={oledb};Data Source={acfile}"
    の方が好ましいですよ。他のパラメーターもセミコロン区切りなので。
    
    実際のところ、接続文字列は
     Dim csb As New OleDbConnectionStringBuilder()
     csb.Provider = "Microsoft.ACE.OLEDB.16.0"
     csb.DataSource = "D:\データベース勉強用DB\INSERT文.accdb"
     Dim Cn As New OleDbConnection(csb.ConnectionString)
    のようにして組み立てることもできるのですが、この際に
     csb.Provider = "Microsoft.ACE.OLEDB.16.0;"
    としてしまうと、正しく接続できなくなります。
    
    
    > Dim Da As New OleDbDataAdapter("SELECT * FROM 既存テーブル", Cn)
    [既存テーブル] なのですね。冒頭の記述から [Test] かと誤解してました。
    
    > (Accessのテーブル構成)
    > インスタンス名	Access2010
    > データベース名	データベース勉強用DB
    > 論理テーブル名	Test
    > 物理テーブル名	INSERT文.accdb

違反を報告
引用返信
■35092 / ResNo.4)  Re[2]: CommandBuilderによって作られるCommandTextの内容
□投稿者/ 魔界の仮面弁士 大御所(1432回)-(2022/06/28(Tue) 21:11:34)
  • アイコン
    No35091に追記(魔界の仮面弁士の記事)
    > No35089 の機能は、SourceColumnNullMapping プロパティによって制御されています。
    
    おぉ。追加説明のコードを書いているうちに、
    ピンポイントでその点についての追加質問が投稿されていた…!
    
    
    SQL における「列名 = 値」という記述について考えてみます。
    
    SET などの『代入処理』の場合は、
    値が null/非null いずれでも、「列名 = 値」と書けます。
    
    しかし、WHERE などの『比較処理』の場合は、
    「列名 = NULL」では TRUE 判定されないため、
    「列名 = 非NULL値」と「列名 IS NULL」を使い分けねばなりません。
    そのための仕組みです。
    
    
    ついでなので、DELETE と INSERT のケースも載せておきます。
    
    DeleteCommand のパラメータ数=7
    p1      Original    F   Integer     ID
    p2      Original    T   Integer     苗字
    p3      Original    F   VarWChar    苗字
    p4      Original    T   Integer     名前
    p5      Original    F   VarWChar    名前
    p6      Original    T   Integer     年齢
    p7      Original    F   Numeric     年齢
    
    
    InsertCommand のパラメータ数=3
    p1  	Current 	F	VarWChar	苗字
    p2  	Current 	F	VarWChar	名前
    p3  	Current 	F	Numeric 	年齢
    
    
    DataTable 内のデータは、DataRowVersion によってバージョン管理されており、
    SELECT 直後の値(Original)と
    編集結果を考慮した現在値(Current)の 2 種類を持ちます。
    ※ DataRow の RowState プロパティも参照
    
    
    Original なパラメーターは、WHERE 句のために使われます。
    INSERT の場合は WHERE が無いので、Current のみです。
    
    逆に DELETE の場合は、現在値が存在しないため Current がなく
    Original だけになります。
    
    そして UPDATE の場合は、SET 句用の Current と
    WHERE 句用の Original の両方があるというわけです。

違反を報告
引用返信
■35097 / ResNo.5)  Re[3]: CommandBuilderによって作られるCommandTextの内容
□投稿者/ Wan 付き人(68回)-(2022/07/07(Thu) 09:46:35)
  • アイコン魔界の仮面弁士さま
    お礼が大変遅くなりすみません。
    下記の部分が理解できずに、色々勉強していました。

    > 「苗字 IS NULL」は、レコードの苗字列の値がDbNullの場合はTrueを返すという事は理解していますが、「? = 1」の意味が解りません。
    空文字列と NULL を区別するための措置です。

    取り合えず、データベースの列がNull許容型で、且つ、データがNullの場合Trueとすると理解してこの質問のFixとして、勉強を進める過程で、再度、質問するかもしれませんが、その時は宜しくお願い致します。

    丁寧に、コード迄書いていただいて有難うございました。

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

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






Mode/  Pass/


- Child Tree -