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

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

記事リスト ( )内の数字はレス数
Nomal参照dllへの文字列引数をutf8で渡したい。(13) | NomalFILE.COPYでIOExceptionエラーが出る(11) | Nomalリストを別フォームに渡す方法(9) | Nomal例外発生した場合に変数をcatchに渡したい(9) | NomalCode128でバーコードが読み取れない(8) | Nomalモードレスフォーム Warning IDE0067を回避したい(7) | NomalIE11では表示されるが、.netのWebBrowserでは、表示されないHPを表示する方法(7) | Nomal数字だけで構成されてるCSVフィールドが自動的に数値として解釈される(7) | NomalフォームコントロールへのDataBindingsでプロパティが相互反映されない(7) | Nomal起動ディスプレイの指定方法について(6) | NomalListBoxにデータが表示されない(6) | Nomal文字列を8bit に戻してから UTF-8 に変換する方法(6) | NomalSQLServerテーブル内容をDataGridViewに表示するコードについて(6) | Nomal文字列構造体のListのソート(6) | NomalWebBrowser Controlを使って、任意の値を取得(5) | Nomalこんな演算子初めて見ました。(5) | NomalRichTextBoxで入力文字の自動折り返しを止めたい(5) | NomalあるWindows10PCでビルドしたEXEがW8.1以下で実行エラー(5) | Nomalポルトガル語の登録(5) | Nomaloo4oのAddTableをADOに移行したい(5) | NomalDeclare宣言するdllと参照追加をするdllの区別(4) | NomalVS2017で作成されたDLLをVS2005で作成されたAPで使用する方法(4) | Nomalフォルダ内の全ての容量を取得したい(4) | Nomal共変性と反変性ってこういうこと?(4) | Nomalプロセスからウインドウを取得(4) | NomalNewの使い方間違ってますか?(4) | Nomalユーザーコントロール内のテキストボックスのmodifiedプロパティ(4) | NomalJOIN操作の構文エラー(4) | Nomal動的にプロパティや変数の値の取得(4) | NomalVB6 ほかのアプリケーションを起動し そのアプリケーションは終了させる方法(4) | Nomalスクロールバーが出た時に高さを変えたい(4) | NomalDatagridViewの行高さ変更について(4) | NomalLINQのメソッド構文の書き方(3) | Nomalvb.net+SQLiteで複数データベースファイルへのトランザクション方法(3) | Nomalジェネリック型インターフェースを使った変数を扱いたい(3) | NomalProcess.WaitForExitで正常に動作しない?(3) | NomalPictureBox.Locationのキャンセル(3) | NomalCatch時のex.StackTraceの情報(3) | NomalVisualStudioでマクロ(3) | NomalOracleDataAccess を参照したプログラムでデバッグモードが機能しなくなる(3) | NomalVisualStudioでExcelのVSTO開発(3) | NomalVB.NETでCSVを読み込む際にSQL文を使いたい(3) | NomalDrawImage でメモリ不足エラー(3) | NomalVb.netからAccessへの接続について(3) | Nomal令和の日付への対応(3) | NomalHTTP 417エラーを発生させるためのIIS設定はどうすればよいか(3) | NomalDrawString前のFillRectangle有無により文字の太さが違う理由について教えて下さい(3) | NomalPIctureBox同士を論理合成したい(3) | Nomalデータセット定義ファイルからDataTable(3) | Nomalネットの画像の複数枚を重ね合わせたい(3) | NomalDataGridViewで検索をかける方法(3) | NomalDataGridViewの選択時の色を透明にしたい(3) | NomalWebBrowserでWebページからのメッセージ(3) | NomalASP.NETから呼ばれているかどうか判定する方法(3) | NomalCA2213の警告が消えません(3) | NomalC# 現在のコンテキスト内にxxxという文字は存在しませんと出ます(3) | NomalTaskクラスを.NET Framework 2.0で実現させる方法(2) | NomalWebBrowser Control foreachで値が消える(2) | NomalEditボックスに簡体字をセットする方法(2) | NomalWebClientが上手く動かない(2) | Nomalフォーム外のカーソルの変更(2) | Nomalラムダ式の勉強中(2) | NomalRichTextBoxで入力文字の自動折り返しを止めたい(2) | NomalC#をVBに変換(2) | NomalWebClientで、短期間にDownloadStringAsyncを実行したい(2) | NomalマウスのないOSでマウスカーソルの表示(2) | NomalToolStripMenuItemにShortcutKeysを指定した際の、元のコントロールを取得する方法(2) | NomalMouseEventArgsのカレント座標(2) | Nomalリッチテキストボックスでの字間の調整(2) | NomalVC++ → VB.Netに変換時に文法エラー(2) | NomalSQL-Server Compact 4.0が表示されない(2) | Nomalバーコードの数字を非表示にしたい(2) | Nomal自作したアプリの発行元を明記したい(2) | NomalSystem.Threading.Thread.Sleep()と変数(2) | NomalDataGridView 行の背景色の設定(2) | NomalDatagridviewのクリア(2) | NomalnumericUpDwonコントロールのvalue(2) | NomalVisual Studio DataTableの値のアクセスの仕方(2) | NomalDataTableの構造が同じか調べるメソッド(2) | NomalRejectChangesについて(2) | NomalPC機種によってスタートアップ画面が中央から左上にずれる、Fontがおかしくなる。(2) | Nomalタスクスケジュール登録時の例外メッセージ(2) | Nomal管理者モードでクリック(2) | NomalVB2017でのインストーラ作成時のエラーについて(2) | NomalMicrosoft Azure OCRのサンプルコード実行時エラー(2) | Nomalデータバインド時のDataGridViewのカスタムソート(2) | NomalObject型からDecimalへの変換(2) | Nomal擬似言語をVBのプログラミングに変換(2) | Nomalユーザーコントロールのプロパティが保存されない(2) | NomalWindows10(1803)からGetHostEntryでipv4が取得出来ない場合がある(2) | Nomal自分自身を呼び出すのはOKですか(1) | NomalList型でエラーが起きてしまい・・・(1) | NomalLINQの拡張メソッドの定義(1) | NomalWebRequest でメモリが解放されない(1) | NomalFunction プロシージャからの文字選択(1) | NomalRDP接続でのネットワーク帯域制限(0) | Nomal必須コンポーネントの一覧に追加したい(0) | NomalApp.configのMy.Application.Log設定で使用できない属性が出る(0) | Nomalvb2010を使用したmicrosoft Wordの任意の行の削除(0) | NomalWinFormsでWindows10のカメラアプリと連携したい(0) |



■記事リスト / ▼下のスレッド
■34393 / 親記事)  こんな演算子初めて見ました。
□投稿者/ VBはじめました 一般人(22回)-(2019/11/25(Mon) 16:06:55)
  • アイコン環境/言語:[VisualStudio2017 VB.net] 
    分類:[.NET] 

    左外部結合の実行に載っていた次のコードに対しての質問です。
    https://docs.microsoft.com/ja-jp/dotnet/csharp/linq/perform-left-outer-joins
    
    (質問1)
    コメント@のKeyは、必要でしょうか?削除しても、同じ動作をしますが、動作を明示するためにわざわざつけた方がよいという意味でしょうか?
    
    (質問2)
    コメントAにある二項演算子で使われているものですが、VBに、こんな演算子ってありましたけ?subpet?.Name
    ビルドすると問題なく動作します。
    
    注:このコードは、C#→VBの変換をWebで行ったものを整理したものです。
    
    詳しい方いらっしゃいましたら、教えて頂けないでしょうか?
    
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim magnus As Person =
                New Person With {.FirstName = "Magnus", .LastName = "Hedlund"}
            Dim terry As Person =
                New Person With {.FirstName = "Terry", .LastName = "Adams"}
            Dim charlotte As Person =
                New Person With {.FirstName = "Charlotte", .LastName = "Weiss"}
            Dim arlene As Person =
                New Person With {.FirstName = "Arlene", .LastName = "Huff"}
    
            Dim barley As Pet =
                New Pet With {.Name = "Barley", .Owner =
                    terry}
            Dim boots As Pet =
                New Pet With {.Name = "Boots", .Owner =
                    terry}
            Dim whiskers As Pet =
                New Pet With {.Name = "Whiskers", .Owner =
                    charlotte}
            Dim bluemoon As Pet =
                New Pet With {.Name = "Blue Moon", .Owner =
                    terry}
            Dim daisy As Pet =
                New Pet With {.Name = "Daisy", .Owner =
                    magnus}
    
            Dim people2 As List(Of Person) =
                New List(Of Person) From {
                    magnus,
                    terry,
                    charlotte,
                    arlene}
            Dim pets2 As List(Of Pet) =
                New List(Of Pet) From {
                    barley,
                    boots,
                    whiskers,
                    bluemoon,
                    daisy}
    
            Dim query = From person In people2
                        Group Join pet In pets2
                            On person Equals pet.Owner
                            Into gj = Group
                        From subpet In gj.DefaultIfEmpty()
                        Select New With {
                            person.FirstName,
                           Key .PetName = '@
                            If(subpet?.Name, String.Empty)} 'A
    
            For Each v In query
                Console.WriteLine($"{v.FirstName & ":"}{v.PetName}")
            Next
            'OutPut:
            'Magnus: daisy
            'Terry:  barley
            'Terry:  boots
            'Terry:  Blue Moon
            'Charlotte: whiskers
            'Arlene:
        End Sub
    
        Class Person
            Public Property FirstName As String
            Public Property LastName As String
        End Class
    
        Class Pet
            Public Property Name As String
            Public Property Owner As Person
        End Class
    
    End Class
    

違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■34394 / ResNo.1)  Re[1]: こんな演算子初めて見ました。
□投稿者/ 魔界の仮面弁士 大御所(1261回)-(2019/11/25(Mon) 16:30:19)
  • アイコンNo34393に返信(VBはじめましたさんの記事)
    > (質問1)
    > コメント@のKeyは、必要でしょうか?
    > Key .PetName = '@

    匿名型における Key の役割は、前回の回答 No34387 で述べております。



    > 削除しても、同じ動作をしますが、

    For Each で列挙して、v.PetName を出力していますが、
    Key が付いている場合は、PetName が ReadOnly となり、
    Key が付いていない場合は Writable となります。
    (ちなみに C# の匿名型は、常に readonly です)


    また、Key メンバーは匿名型同士の比較処理においても使われます。
    https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/objects-and-classes/anonymous-types?WT.mc_id=DT-MVP-8907


    > (質問2)
    > コメントAにある二項演算子で使われているものですが、VBに、こんな演算子ってありましたけ?subpet?.Name

    二項演算子 `If` は、Visual Basic 2008 (VB8.0)からサポートされました。
    Null 条件演算子 `?.` は、Visual Basic 2015 (VB14.0) からのサポートです。

    https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/null-conditional-operators?WT.mc_id=DT-MVP-8907
違反を報告
引用返信
■34395 / ResNo.2)  Re[1]: こんな演算子初めて見ました。
□投稿者/ 魔界の仮面弁士 大御所(1262回)-(2019/11/25(Mon) 21:39:07)
  • アイコンNo34393に返信(VBはじめましたさんの記事)
    > 動作を明示するためにわざわざつけた方がよいという意味でしょうか?
    言語仕様の観点で言えば、C# の匿名型を Visual Basic での実装へと
    「直訳」した場合には、すべてのプロパティに対して Key が付与されます。

    一方、機械的に翻訳するのではなく、コードの意図を読み取った上で
    「意訳」する場合には、Key を付与すべきかどうかを個別に判断してください。


    その項目が比較用のキーとして使いたい場合には Key を付与し、
    編集可能な項目として利用したい場合には Key は付けずに記述します。
    (どちらでも無い場合、Key を付与するかどうかは任意です)


    参考までに、Key の有無によって動作が変化するような
    VB のサンプルを挙げておきます。
    https://karuakun.wordpress.com/2014/01/10/


    > 左外部結合の実行に載っていた次のコードに対しての質問です。
    > https://docs.microsoft.com/ja-jp/dotnet/csharp/linq/perform-left-outer-joins
    > 注:このコードは、C#→VBの変換をWebで行ったものを整理したものです。

    VB の匿名型と C# の匿名型は仕様が異なるので、変換ツールによって
    解釈の違いが生じるのは致し方無いところですね。


    [FirstName も PetName も Key なしで変換されるツール]
     https://codeconverter.icsharpcode.net/

    [FirstName は Key なし、PetName は Key ありに変換されるツール]
     http://converter.telerik.com/



    > VBに、こんな演算子ってありましたけ?
    参考までに:

    【Visual Basic の新機能】※VB2015(14.0)〜VB2019(16.0)
    https://docs.microsoft.com/ja-jp/dotnet/visual-basic/getting-started/whats-new?WT.mc_id=DT-MVP-8907
違反を報告
引用返信
■34396 / ResNo.3)  Re[2]: こんな演算子初めて見ました。
□投稿者/ VBはじめました 一般人(23回)-(2019/11/26(Tue) 09:49:51)
  • アイコン魔界の仮面弁士さん
    いつもお世話になっております。

    Keyについては、前回教えて頂いたことを踏まえて、ワザワザつける必要があるのか?付けることがマナーなのか?と疑問に感じたのと、LINQでGroup句を使用すると勝手に名前に[Key]って使われるので、また別の意味があるのかな?って思って質問させて頂きました。添付ファイル参照

    Null条件演算子については、手元の資料「独習 VisualBasic2010」でも調べて、ネットでもググって引っかからなかったので、質問させて頂きました。
    演算子って基礎事項と思っていたので、増えるという発想が無かったです。
    VBAからVisualBasic2005に移行する時は、一通り入門書を読んだのですが、知っていると思い込んでいる部分は、斜め読みをしていました。
    今回、Null条件演算子について教えて頂いたので、キーワードを変えてググってみると、色々追加されていることを知りました。(また、勉強の範囲が増える・・・)

    ヨチヨチですが、進めていますので、今後ともよろしくお願い致します。
    早く「意訳」できるようになりたい。

314×331 => 237×250
イメージ
1574729391.png
/9KB
違反を報告
引用返信
■34397 / ResNo.4)  Re[3]: こんな演算子初めて見ました。
□投稿者/ VBはじめました 一般人(24回)-(2019/11/26(Tue) 09:50:47)
  • アイコン解決済み
解決み!
違反を報告
引用返信
■34399 / ResNo.5)  Re[3]: こんな演算子初めて見ました。
□投稿者/ 魔界の仮面弁士 大御所(1264回)-(2019/11/26(Tue) 12:20:55)
  • アイコン# 解決済みマークはつけたままにしておきます。

    No34396に返信(VBはじめましたさんの記事)
    > LINQでGroup句を使用すると勝手に名前に[Key]って使われるので、また別の意味があるのかな?

    はい。その Key は Visual Basic の Key キーワードとは異なる意味を持ちます。


    クエリ構文の Group や、拡張メソッド構文の Enumerable.GroupBy メソッドでは
    列挙結果が IGrouping(Of TKey, TElement) 型の要素となるのですが、
    この型が持っている『Key プロパティ』を指していますね。
    https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.igrouping-2.key?WT.mc_id=DT-MVP-8907&view=netframework-4.8


    > 「独習 VisualBasic2010」でも調べて、

    VB2010 当時の書籍をお使いのようですが、その後のバージョンでも
    細かい追加機能等が色々とありますので、幾つか紹介しておきます。
    (C# に比べれば、進化のスピードは緩めですが)

    http://bbs.wankuma.com/search.cgi?no=0&word=No87377&andor=and&logs=all&PAGE=20

    Dim a = 123 + 'VB2015 以降では、このコードで
     456 '変数 a に対して「579」が代入されるが
     'VB2013 以下ではエラーになる

    Dim b = 123 + _ 'VB2019 以降では、このコードで
     456 '変数 a に対して「579」が代入されるが
     'VB2015〜VB2017 ではエラーになる


    --- 以下抜粋 ---

    VB2012 (version 11.0) の新機能
    ・Iterator / Yield キーワードによる反復子の簡易実装をサポート(重要)
    ・Async / Await キーワードによる非同期処理実装をサポート(重要)
    ・メソッドの呼び出し元情報の自動埋め込み(Caller Information)
    https://www.atmarkit.co.jp/fdotnet/special/vs2012review/vs2012review_04.html

    VB2013 (version 12.0) の新機能
    ・Visual Studio の準備機能強化はあるが、言語機能の変更はなし。

    VB2015 (version 14.0) の新機能
    ・メソッド内での #Region〜#End Region の利用を許可(C# は以前からできていた)
    ・VB2005 で追加された IsNot 演算子を、TypeOf 演算子と共に使えるように
    ・NameOf 演算子の追加(リファクタリングや MVC に便利)
    ・文字列中での改行を許可("〜" 内で改行して良い)
    ・文字列補間(既に使用されていた $"〜" 構文)
    ・Null 条件演算子( Return foo?.Property とか Return foo?(idx) とか)
    ・日付型リテラルで #MM-dd-yyyy# 表記だけでなく #yyyy-MM-dd# も許可
    ・LINQ 式の途中などでのコメントをサポート
    https://qiita.com/tadnakam/items/9df14667db41cd81c193

    VB2017 (version 15.0) の新機能
    ・#Disable Warning と #Enable Warning による警告の部分的な抑制
    ・Partial Module および Partial Interface のサポート(VB2005 の Partial Class、VB2010 の Partial Private Sub の延長)
    ・タプル(ValueTuple 型)に対する言語サポート … Dim sample As (Url As String, Title As String)
    ・2 進数リテラルの追加 … Dim value As Byte = &B01101110
    ・数値リテラルの桁区切り記号 … Dim value As Integer = 123_456_789
    ・ByRef 戻り値のサポート … VB で宣言することはできないが、利用することはできる
    ・ReadOnly インターフェイスのプロパティ
    https://qiita.com/yaju/items/2b07b54444707ee9abae


    VB2017 2017年8月更新 (version 15.3) の新機能
    ・名前付きタプルの推論 … Dim sample = (Now, Err)

    VB2017 2017年12月更新 (version 15.5) の新機能
    ・「Private Protected」スコープの追加 … .NET Framework 1.0 当時からあったが、VB や C# ではサポートされていなかった
    ・非末尾名前付き引数のサポート … Array.Copy(sourceArray:=a, destinationArray:=b, 3)
    ・16 進数/2 進数/8 進数の先頭区切り記号 … Dim meat As Integer = &H_DEAD_BEEF

    VB2017 2018年8月更新 (version 15.8) の新機能
    ・浮動小数点数(Double, Single)を整数型に変換する際のパフォーマンスの大幅な向上

    VB2019 (version 16.0) の新機能
    ・明示的な行継続文字(空白+アンダーバー)の後でのコメントを許可
解決み!
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34355 / 親記事)  RichTextBoxで入力文字の自動折り返しを止めたい
□投稿者/ 勉強中 一般人(1回)-(2019/11/04(Mon) 09:26:45)
  • アイコン環境/言語:[Windwos10 64bit / VS2019 C#、.NET Framework 4.7.2] 
    分類:[.NET] 

    RichTextBoxに入力すると、BOXの端まで表示されずに途中で改行されてしまうことを止めたいのですが、方法がわからずご教示願います。


    入力文字入力文字入力文字入力文字入力文字123456|
    78910                     |
                              |

       ↓ こうならず、以下になる。

    入力文字入力文字入力文字入力文字入力文字      |
    12345678910               |
                              |

違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■34356 / ResNo.1)  Re[1]: RichTextBoxで入力文字の自動折り返しを止めたい
□投稿者/ 魔界の仮面弁士 大御所(1248回)-(2019/11/04(Mon) 20:02:30)
  • アイコンNo34355に返信(勉強中さんの記事)
    > RichTextBoxに入力すると、BOXの端まで表示されずに途中で改行されてしまうことを止めたいのですが、方法がわからずご教示願います。

    過去ログの No32155 などはどうでしょう。

    https://dobon.net/vb/bbs/log3-55/32152.html
違反を報告
引用返信
■34358 / ResNo.2)  Re[2]: RichTextBoxで入力文字の自動折り返しを止めたい
□投稿者/ 勉強中&C#初心者 一般人(1回)-(2019/11/04(Mon) 20:50:23)
  • アイコンNo34356に返信(魔界の仮面弁士さんの記事)
    > ■No34355に返信(勉強中さんの記事)
    >>RichTextBoxに入力すると、BOXの端まで表示されずに途中で改行されてしまうことを止めたいのですが、方法がわからずご教示願います。
    >
    > 過去ログの No32155 などはどうでしょう。
    >
    > https://dobon.net/vb/bbs/log3-55/32152.html

    返信ありがとうございます。

    VBでしたので、■34357側のサンプルで試してみましたが、残念ながら効果がありませんでした。
    ※MyEditWordBreakProc は呼び出されていました。

違反を報告
引用返信
■34364 / ResNo.3)  【報告】この投稿はマルチポストです
□投稿者/ (報告) 大御所(271回)-(2019/11/05(Tue) 21:31:32)
  • アイコンこの投稿はマルチポストです。もし元記事の投稿者にマルチポストの心当たりがない場合は、すぐに返信でお知らせください。

    ●マルチポストされている場所
    https://social.msdn.microsoft.com/Forums/ja-JP/8a967562-1283-4483-b20d-71767dbfa5af/12522124831248112486124611247312488125081248312463124731239812?forum=csharpgeneralja

    ----------
    この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのルールについて」をお読みください。

    ●書き込みのルールについて
    https://dobon.net/vb/bbs/index.html
違反を報告
引用返信
■34369 / ResNo.4)  Re[3]: RichTextBoxで入力文字の自動折り返しを止めたい
□投稿者/ 魔界の仮面弁士 大御所(1252回)-(2019/11/06(Wed) 22:28:58)
  • アイコンNo34358に返信(勉強中&C#初心者さんの記事)
    > >>RichTextBoxに入力すると、BOXの端まで表示されずに途中で改行されてしまうことを止めたいのですが、方法がわからずご教示願います。
    >>過去ログの No32155 などはどうでしょう。
    > VBでしたので、■34357側のサンプルで試してみましたが、残念ながら効果がありませんでした。

    それでは No34263 はどうでしょうか?
    ( MsftEdit.DLL ではなく、従来の RichEd20.DLL がロードされるようにする)
違反を報告
引用返信
■34375 / ResNo.5)  Re[4]: RichTextBoxで入力文字の自動折り返しを止めたい
□投稿者/ 勉強中&C#初心者 一般人(2回)-(2019/11/07(Thu) 19:40:45)
  • アイコンありがとうございます、解決致しました。
解決み!
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34240 / 親記事)  あるWindows10PCでビルドしたEXEがW8.1以下で実行エラー
□投稿者/ けい 一般人(22回)-(2019/04/29(Mon) 17:14:29)
  • アイコン環境/言語:[Windows10、VB.NET、.NET Framework4.0] 
    分類:[.NET] 

    お世話になります。

    Windows10、VB.NET2015でEXEを開発しています。
    WindowsXP、Windows7、Windows8.1で使用するため、
    .NET Framework=4.0で開発しています。

    この同じ開発環境PCが2台あります(A、Bとします)。

    AでビルドしたEXEは、運用PCで正常に起動します。

    AでビルドしたソリューションをフォルダごとBに移して、
    コードは何もいじらず、
    BでビルドしたEXEは、運用PCで起動時に原因不明のエラーが出ます。
    「動作を停止しました」「「問題が発生したため終了します。この問題を<Report Destination Name>に報告してください」となります。

    ちなみに、別途新規にBで作成、ビルドしたプロジェクトのEXEは、
    運用PCでも正常に起動します。

    考え得るエラー原因の可能性があれば、
    教えてください。

    どうぞよろしくお願いします。

違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■34242 / ResNo.1)  Re[1]: あるWindows10PCでビルドしたEXEがW8.1以下で実行エラー
□投稿者/ Azulean 大御所(507回)-(2019/04/29(Mon) 19:20:31)
  • アイコン推測が難しいですね。

    No34240に返信(けいさんの記事)
    > BでビルドしたEXEは、運用PCで起動時に原因不明のエラーが出ます。
    > 「動作を停止しました」「「問題が発生したため終了します。この問題を<Report Destination Name>に報告してください」となります。

    Windows のイベントログのアプリケーションのツリーに、問題が起きた時刻近辺でエラーが記録されていませんか?
    複数存在すると思いますので、.NET の例外情報が残されていないかを確認してみてください。
    ヒントになるかもしれません。


    また、フォルダーごとコピーした後、B で「リビルド」した場合はどうなりますか?
違反を報告
引用返信
■34244 / ResNo.2)  Re[2]: あるWindows10PCでビルドしたEXEがW8.1以下で実行エラー
□投稿者/ けい 一般人(24回)-(2019/04/30(Tue) 13:38:18)
  • アイコンNo34242に返信(Azuleanさんの記事)

    ありがとうございます。

    運用PCでのエラー履歴、調べてみます。

    Bでリビルドしても結果は同じでした。
違反を報告
引用返信
■34249 / ResNo.3)  Re[1]: あるWindows10PCでビルドしたEXEがW8.1以下で実行エラー
□投稿者/ 魔界の仮面弁士 大御所(1226回)-(2019/04/30(Tue) 23:58:59)
  • アイコンNo34240に返信(けいさんの記事)
    > ちなみに、別途新規にBで作成、ビルドしたプロジェクトのEXEは、
    > 運用PCでも正常に起動します。

    既存プロジェクト(および、実験用の新規プロジェクト)は、
    どのような内容なのでしょうか?

    コンソールアプリなのか、WinForm なのか WPF なのか WebApp なのか、
    x86/x64/AnyCPU/AnyCPU32bitPreferred の違いとか、
    参照設定に Interop.*.dll の類が含まれているか否か、
    .config や .manifest に追加の設定が書き込まれているのか否か、
    レジストリの AppCompatFlags の設定有無の状況とか。
違反を報告
引用返信
■34253 / ResNo.4)  Re[2]: あるWindows10PCでビルドしたEXEがW8.1以下で実行エラー
□投稿者/ けい 一般人(25回)-(2019/05/03(Fri) 12:54:07)
  • アイコンNo34249に返信(魔界の仮面弁士さんの記事)

    ありがとうございます。

    既存プロジェクト、実験用、
    ともに、Winformです。

    実験用は、FormにButtonを置いただけのものでした。
違反を報告
引用返信
■34254 / ResNo.5)  Re[3]: あるWindows10PCでビルドしたEXEがW8.1以下で実行エラー
□投稿者/ けい 一般人(26回)-(2019/05/03(Fri) 13:01:55)
  • アイコン皆様ありがとうございました。

    解決しました。

    開発環境にインストールされているMicrosoft POS for .NETのバージョンが、

    Aでは1.12、Bでは1.14になっていました。

    AでビルドしたソリューションをBで開いた時、

    参照しているMicrosoft.PointOfServiceのプロパティで、

    特定バージョン=Falseのため、

    バージョンが自動的に1.12から1.14になり、

    これでビルドしてEXEを作成したため、

    これがXP等でエラーの原因になったようです。

    会計レジのラインディスプレイでPOSを使用していました。

    Bに1.12もインストールして、ソリューションを開くと、

    参照バージョンは1.12になり、エラーは解決しました。

    ご助言まことにありがとうございました。
解決み!
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■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]



■記事リスト / ▲上のスレッド
■34042 / 親記事)  oo4oのAddTableをADOに移行したい
□投稿者/ Yoshi 一般人(1回)-(2018/11/26(Mon) 16:40:20)
  • アイコン環境/言語:[VBA] 
    分類:[ASP.NET] 


    業務で使用しているExcelでOfficeの64bitに対応するため、oo4oからADOへの変更作業を行っています。
    Excelを利用しておりVBAで書かれています。

    Oracleのバージョンは11gです。

    AddTableを使いストアドプロシージャで配列として受け渡しをしているようなのですが
    ADOで渡すための方法がわからず、ご教示いただきたいと思っております。

    以下にoo4oで書かれたロジックを記載いたします。
    【VBA(oo4o)】
    OraDB.Parameters.AddTable "inAnimal", ORAPARM_INPUT, ORATYPE_VARCHAR2, Arraysize, 255
    Set inAnimal = OraDB.Parameters("inAnimal")

    'カウンタループ 'l'はカウンタ
    inAnimal(l) = AnimalSet(l)
    'Loop
    ExecuteSQL ("BEGIN PROCEDURE(:inAnimal)End;)

    【PROCEDURE】
    TYPE Array IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
    PROCEDURE (inAnimal IN Array)
    IS...

    少し考えて作ったADOのソースは以下になります。(うまく配列が渡せないため落ちます。)

    Set param = cmd.CreateParameter("inAnimal", adVarChar Or adArray, adParamInput, 255, AnimalSet)

    cmd.Parameters.Append param
    cmd.CommandText = "BEGIN PROCEDURE(:inAnimal); END;"
    cmd.Execute 


    間違っている箇所や方法をご存知の方いらっしゃいましたらよろしくお願いいたします。

違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■34043 / ResNo.1)  Re[1]: oo4oのAddTableをADOに移行したい
□投稿者/ 魔界の仮面弁士 大御所(1170回)-(2018/11/26(Mon) 19:13:41)
  • アイコン2018/11/27(Tue) 11:15:33 編集(投稿者)

    No34042に返信(Yoshiさんの記事)
    > AddTableを使いストアドプロシージャで配列として受け渡しをしているようなのですが
    > ADOで渡すための方法がわからず、ご教示いただきたいと思っております。

    ADODB では対応していないと思います。

    ストアドを変更できるなら、配列パラメータ(Associative Array)を用いず、
    Temporary Table 経由で受け渡す作りに書き換えてみてはいかがでしょう。

    ストアドを変更できない場合は、配列渡しができるよう、
    32bit 版プロセスな VBScript 経由で OO4O を呼び出すか、
    もしくは、ODP.NET 経由で呼び出すようなラッパーライブラリを
    作ることを検討してみるとか。


    > Set param = cmd.CreateParameter("inAnimal", adVarChar Or adArray, adParamInput, 255, AnimalSet)

    Set p = cmd.CreateParameter("inAnimal", 型, adParamInput)
    cmd.Parameters.Append p
    Let p.Value = 値
    cmd.Execute

    の構文で実験してみました。


    (1) 「adVarChar Or adVarArray」「adBSTR Or adArray」
    → cmd.Parameters.Append の時点で ADO エラー: adErrInvalidParamInfo
     
    (2) 「adVariant Or adVarArray」「adVariant」
    → Variant()、Variant を受け付けたが、Execute 時に実行時例外(E_FAIL)を起こす。Err.Description は毎回変化するゴミ文字列なので、ポインタが破壊されている可能性あり。
     
    (3) adIUnknown
    → 渡すべきインターフェイスがわからないのですが、
     少なくとも下記のコードでは、内部エラーでクラッシュしました。
     
    'Dim rec As ADODB.Recordset
    'Set rec = New ADODB.Recordset
    'rec.Fields.Append "F1", adVarChar, 2000, adFldIsNullable
    'rec.Open
    'rec.AddNew Array("F1"), Array("いぬ")
    'rec.AddNew Array("F1"), Array("ねこ")
    'rec.AddNew Array("F1"), Array("かめ")
    'rec.UpdateBatch

    'Dim rec As Scripting.Dictionary
    'rec dic = New Scripting.Dictionary
    'rec(12) = "いち"
    'rec(34) = "に"
    'rec(56) = "さん"

    'Dim rec As VBA.Collection
    'Set rec = New VBA.Collection
    'rec.Add "いち", "12"
    'rec.Add "に", "34"
    'rec.Add "さん", "56"

    'Set p.Value = rec 'VBA エラー: 424 オブジェクトが必要です
    'Let p.Value = rec 'ADO エラー: adErrInvalidArgument
    Dim uk As stdole.IUnknown
    Set uk = rec
    'Set p.Value = uk 'VBA エラー: 424 オブジェクトが必要です
    Let p.Value = uk 'ここまでは実行できた
    cmd.Execute 'ここでクラッシュ
違反を報告
引用返信
■34045 / ResNo.2)  Re[2]: oo4oのAddTableをADOに移行したい
□投稿者/ 魔界の仮面弁士 大御所(1172回)-(2018/11/27(Tue) 11:19:43)
  • アイコン
    No34043に追記(魔界の仮面弁士の記事)
    > 実験してみました。 
    
    参考までに、当方が実験で用いたパッケージを示しておきます。
    
    --CREATE TABLE TEST_TABLE (COL1 VARCHAR2(2000), COL2 NUMBER );
    --/
    CREATE OR REPLACE PACKAGE PKG_SAMPLE
    AS
        TYPE TestArray IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
        PROCEDURE EXAMPLE(inAnimal IN TestArray);
    END PKG_SAMPLE;
    /
    CREATE OR REPLACE PACKAGE BODY PKG_SAMPLE AS
        PROCEDURE EXAMPLE(inAnimal IN TestArray) IS
           IDX BINARY_INTEGER;
           VAL VARCHAR2(2000);
        BEGIN
           IDX := inAnimal.FIRST;
           FOR N IN 1..inAnimal.COUNT LOOP
              VAL := inAnimal(IDX);
              INSERT INTO TEST_TABLE (COL1, COL2) VALUES ( VAL, IDX );
              IDX := inAnimal.NEXT(IDX);
           END LOOP;
        END EXAMPLE;
    END PKG_SAMPLE;
    /
    /* ADO 側
      Dim cmd As ADODB.Command
      Set cmd = New ADODB.Command
      Set cmd.ActiveConnection = cn
      cmd.CommandText = "PKG_SAMPLE.EXAMPLE"
      cmd.CommandType = adCmdStoredProc
    */
    
    
    > Set p = cmd.CreateParameter("inAnimal", 型, adParamInput)
    
    ここの『型』を調べるために、OLE DB でスキーマを取得してみました。
    
    'https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms713623(v%3dvs.85)
    Dim rs1 As ADODB.Recordset
    // 下記は "SELECT * FROM USER_ARGUMENTS" に相当
    Set rs1 = cn.OpenSchema(adSchemaProcedureParameters)
    
    
    OraOLEDB.Oracle の場合は 1 件のみ返却され、
    MSDAORA で取得した場合は 2 件となっていましたが、
    いずれも、、パラメータの型として adIUnknown が得られましたので、
    値として要求されているのは、いわゆる配列(SAFEARRAY) ではなく、
    何らかの配列オブジェクト(COM インターフェイス)が要求されるようです。
    
    以下に結果を記します。
    (Recordset の列数が多いので、行列変換して縦に並べています)
    
    ==========================================================================
    【OraOLEDB.Oracle の場合】… 1 件が該当
    (1/1) --------------------------------------------------------------------
           Procedure_Catalog: (null)
            Procedure_Schema: スキーマ名
              Procedure_Name: "PKG_SAMPLE.EXAMPLE"
              Parameter_Name: "INANIMAL"
            Ordinal_Position: 1
              Parameter_Type: 1 (adParamInput)
        Parameter_HasDefault: (null)
           Parameter_Default: (null)
                 Is_Nullable: -1 (VARIANT_TRUE)
                    DataType: 13 (adIUnknown)
    Character_Maximum_Length: (null)
      Character_Octet_Length: (null)
           Numeric_Precision: (null)
               Numeric_Scale: (null)
                 Description: (null)
                   Type_Name: "PL/SQL TABLE"
             Local_Type_Name: "PL/SQL TABLE"
                    Overload: (null)
    ==========================================================================
    【MSDAORA の場合】… 何故か 2 件が該当
    (1/2) --------------------------------------------------------------------
           Procedure_Catalog: (null)
            Procedure_Schema: スキーマ名
              Procedure_Name: "PKG_SAMPLE.EXAMPLE"
              Parameter_Name: "INANIMAL"
            Ordinal_Position: 1
              Parameter_Type: 1 (adParamInput)
        Parameter_HasDefault: 0 (VARIANT_FALSE)
           Parameter_Default: (null)
                 Is_Nullable: -1 (VARIANT_TRUE)
                    DataType: 13 (adIUnknown)
    Character_Maximum_Length: (null)
      Character_Octet_Length: (null)
           Numeric_Precision: (null)
               Numeric_Scale: (null)
                 Description: (null)
                   Type_Name: "PL/SQL TABLE"
             Local_Type_Name: (null)
                    Overload: (null)
    (2/2) --------------------------------------------------------------------
           Procedure_Catalog: (null)
            Procedure_Schema: スキーマ名
              Procedure_Name: "PKG_SAMPLE.EXAMPLE"
              Parameter_Name: (null)
            Ordinal_Position: 1
              Parameter_Type: 1 (adParamInput)
        Parameter_HasDefault: 0 (VARIANT_FALSE)
           Parameter_Default: (null)
                 Is_Nullable: -1 (VARIANT_TRUE)
                    DataType: 129 (adChar)
    Character_Maximum_Length: 2000
      Character_Octet_Length: 2000
           Numeric_Precision: (null)
               Numeric_Scale: (null)
                 Description: (null)
                   Type_Name: "VARCHAR2"
             Local_Type_Name: (null)
                    Overload: (null)
    ==========================================================================

違反を報告
引用返信
■34046 / ResNo.3)  Re[2]: oo4oのAddTableをADOに移行したい
□投稿者/ Yoshi 一般人(2回)-(2018/11/27(Tue) 16:17:25)
  • アイコン魔界の仮面弁士様
    いろいろとお調べいただきありがとうございます。
    配列で渡すのはできなさそうなんですね。。。

    > ストアドを変更できない場合は、配列渡しができるよう、
    > 32bit 版プロセスな VBScript 経由で OO4O を呼び出すか、
    > もしくは、ODP.NET 経由で呼び出すようなラッパーライブラリを
    > 作ることを検討してみるとか。

    oo4oの配列渡しを使っているプロシージャが5本あり、処理も複雑であり
    ストアドを変更する(変数受け取りなどに変える)と、ほぼ新規に5本
    立ち上げる必要があるためなるべく変更せずに現行処理を使いたいと考えています。

    そうした状況の場合、
    Windows10 64bit
    Excel 64bit で考えると
    どの手法が現実的でしょうか。
    (どういった改修が工数が小さいでしょうか)

    エンジニアとして知識が浅く、稚拙な文章になってしまい申し訳ありません。
    主観で結構ですのでご教示お願いできませんでしょうか。




違反を報告
引用返信
■34047 / ResNo.4)  Re[3]: oo4oのAddTableをADOに移行したい
□投稿者/ 魔界の仮面弁士 大御所(1173回)-(2018/11/27(Tue) 16:52:54)
  • アイコン2018/11/27(Tue) 16:58:09 編集(投稿者)

    No34046に返信(Yoshiさんの記事)
    > ストアドを変更する(変数受け取りなどに変える)と、ほぼ新規に5本

    元のストアドは、必ずしも変更しなくて良いのではないでしょうか。


    VBA 側は、配列オブジェクトとして渡していた部分を、
    作業用テーブルへの AddNew (INSERT 処理)に変更します。

    Oracle 側には、その作業テーブルから、データを配列にして
    元のストアドを呼び出すようなストアドを追加する、という流れ。


    この場合、中継用のストアドが増えるだけで、
    元のストアドはそのまま生かせるんじゃないかと…。


    > Windows10 64bit
    > Excel 64bit で考えると
    > どの手法が現実的でしょうか。

    64bit 版 VBA だと、COM(ActiveX) コンポーネントも 64bit 版が要求されますが、
    ・ADODB + OLEDB は配列オブジェクトを渡せない
    ・ODBC でも渡せない
    ・OO4O は 32bit 版しかない
    と言うことで、64bit 版 VBA だと、正直どうしようも無いと思います。
    VBA ではなく、.NET (あるいは Java とか?)なら対処できそうですが。


    > (どういった改修が工数が小さいでしょうか)

    既定では、64bit OS 上であっても、32bit 版の Office が導入されますよね。
    https://support.office.com/ja-jp/article/2dee7807-8f95-4d0c-b5fe-6c6f49b8d261

    64bit 版で無ければならない強い理由付けが無い限りは、
    Office 64bit をアンインストールして、
    32bit 版 Office と 32bit 版 Oracle Client を入れなおすのも選択肢の一つです。
    そうすれば oo4o を引き続き利用できるので、追加の開発工数が不要になります。

    ただ、64bit 版前提の VBA コードを既に組んでしまっているとなると、
    後掛り作業になってしまうでしょう。


    もし、Office は 64bit のままにしておきたいのであれば、
    配列オブジェクトを渡すために、
     ・「32bit VBScript + OO4O」を Excel VBA から Shell 関数等で呼び出す
     ・「.NET Framework + ODP.NET」を Excel VBA から Shell 関数等で呼び出す
    などの手直しが必要になるかと思います。


    ところで、今回の場合、INDEX BY BINARY_INTEGER が付与されているので、
    結合配列(索引付き表)を使っているのですよね。だとしたら、
    > 'カウンタループ 'l'はカウンタ
    > inAnimal(l) = AnimalSet(l)
    > 'Loop
    というのは、少々不自然な印象を受けました。

    索引付きの場合は連番ではなく、いわゆる Key Value Pair な
    連想配列になるはずで、そうすると VBA 側としては、
    Dictionary などでコレクション管理されているはずでは…?


    なお、先の No34045 のパッケージであれば、

    DECLARE
    inanimal スキーマ名.PKG_SAMPLE.TestArray;
    BEGIN
    inanimal(12) := 'いち';
    inanimal(34) := 'に';
    inanimal(56) := 'さん';
    PKG_SAMPLE.EXAMPLE( inanimal );
    inanimal.DELETE;
    END;

    という動的 SQL 文を作って「cn.Execute SQL」することはできます。

    インジェクション対策や SQL コマンドの長さ制限等を考えると、
    あまり積極的にお奨めできる方法では無いですが…。
違反を報告
引用返信
■34055 / ResNo.5)  Re[4]: oo4oのAddTableをADOに移行したい
□投稿者/ Yoshi 一般人(4回)-(2018/11/30(Fri) 17:12:14)
  • アイコン返信が遅くなり申し訳ありません。
    下記2点のことから方針が決まりました。

    > 64bit 版 VBA だと、COM(ActiveX) コンポーネントも 64bit 版が要求されますが、
    > ・ADODB + OLEDB は配列オブジェクトを渡せない
    > ・ODBC でも渡せない
    > ・OO4O は 32bit 版しかない
    > と言うことで、64bit 版 VBA だと、正直どうしようも無いと思います。

    > 32bit 版 Office と 32bit 版 Oracle Client を入れなおすのも選択肢の一つです。
    > そうすれば oo4o を引き続き利用できるので、追加の開発工数が不要になります。

    32bit 版 Office と 32bit 版 Oracle Client を使うことで回避できるのであれば
    おおきな工数をかけてまでする作業ではないとのことです。
    このことから本件については解決になりました。

    このたびはお世話になりました。
    大変助かりました。ありがとうございます。


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

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






Mode/  Pass/


- Child Tree -