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) |



■記事リスト / ▼下のスレッド
■34372 / 親記事)  ラムダ式の勉強中
□投稿者/ VBはじめました 一般人(17回)-(2019/11/07(Thu) 10:24:48)
  • アイコン環境/言語:[VisualStudio2017 VB.net] 
    分類:[.NET] 

    ラムダ式の勉強をはじめました(下記のコードに対する質問)
    (質問1)
    コメントの@とAをDelegateで書くと、@−DとA−Dの形になると
    思いますが、あってますか?(動作は確認したのでなんとか同じ動きになります)
    もっと、適切な書き方があれば教えてください。

    (質問2)
    コメントの@を1行で書くと、@-1行になるとおもいますが、
    Aを1行で書くことはできない。であってますか?
    https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/procedures/lambda-expressions
    を見ると、ラムダ式は、ステートメントに含める必要があると記載されているので
    1行で書けないと考えたのですが、あってますか?

    Public Class TestClass
    Sub Test()
    Dim increment1 = Function(x) x + 1 '@
    Console.WriteLine(increment1(1))

    Console.WriteLine((Function(num As Integer) num + 1)(1)) '@-1行

    Dim writeline1 = Sub(x) Console.WriteLine(x) 'A
    writeline1("Hello")

    '@をDelegateで書いたもの
    Dim increment As New DelegateTest_TestClass
    Dim d1 As TestDelegateF = AddressOf increment.Method1 '@-D

    Console.WriteLine(d1(1))
    Dim d3 As SampleDelegateS = AddressOf increment.Method3 'A-D
    d3("Hello")
    End Sub
    End Class
    Public Delegate Function TestDelegateF(x As Integer) As Integer
    Public Delegate Sub TestDelegateS(x As String)

    Public Class DelegateTest_TestClass
    Public Function Method1(x As Integer) As Integer
    Return x + 1
    End Function
    Public Sub Method3(x As String)
    Console.WriteLine(x)

    End Sub
    End Class
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34373 / ResNo.1)  Re[1]: ラムダ式の勉強中
□投稿者/ 魔界の仮面弁士 大御所(1253回)-(2019/11/07(Thu) 14:11:35)
  • アイコンNo34372に返信(VBはじめましたさんの記事)
    > ラムダ式の勉強をはじめました(下記のコードに対する質問)
    投稿モードが「通常モード」の場合、HTML の特性上
    連続した空白が一つにまとめられ、行頭空白は失われます。

    コード内のインデントを残す場合は、投稿時に
    「図表モード」を選択してください。


    > コメントの@とAをDelegateで書くと、@−DとA−Dの形になると
    > 思いますが、あってますか?(動作は確認したのでなんとか同じ動きになります)

    いいえ。x のデータ型が明示されていないので、@のコードは
    Option Strict On モードではコンパイルエラーになりますし、
    Option Strict Off では、x が As Object としてコンパイルされます。

    そのため、@に相当するデリゲートの引数と戻り値は
      (x As Integer) As Integer
    ではなく
      (x As Object) As Object
    です。


    > もっと、適切な書き方があれば教えてください。

    @で、引数と戻り値が Integer であることを明示するために、
    下記のように書くことができます。

    Dim increment1 = Function(x As Integer) x + 1
    Dim increment1 As TestDelegateF = Function(x As Integer) x + 1
    Dim increment1 As TestDelegateF = Function(x) x + 1
    Dim increment1 As Func(Of Integer, Integer) = Function(x) x + 1



    > Dim d3 As SampleDelegateS = AddressOf increment.Method3 'A-D
    > Public Delegate Sub TestDelegateS(x As String)

    SampleDelegateS というのは
    TestDelegateS の誤記でしょうか。


    提示されたコードでは、クラスのインスタンスメソッドを割り当てていますが、
    Module 内のメソッドや Shared なメソッドを割り当てることもできます。

    Dim method As Action = AddressOf Console.WriteLine


    またイベントハンドラと同様、一つのデリゲートに複数のメソッドを割り当てることもできます。

    Sub Main()
      Dim method = DirectCast(System.Delegate.Combine(
        New System.Action(Sub() System.Console.WriteLine("ABC")),
        New System.Action(AddressOf System.Console.WriteLine),
        New System.Action(Sub() System.Console.WriteLine("XYZ")),
        New System.Action(AddressOf Now.ToString),
        New System.Action(Sub() MsgBox("マルチキャストデリゲート"))),
        System.Action)
      method()
    End Sub


    > (質問2)
    > コメントの@を1行で書くと、@-1行になるとおもいますが、
    > Aを1行で書くことはできない。であってますか?

    Aを単行とするなら、このように書けます。

    Call (Sub(x) Console.WriteLine(x))("Hello")
違反を報告
引用返信
■34374 / ResNo.2)  Re[2]: ラムダ式の勉強中
□投稿者/ VBはじめました 一般人(18回)-(2019/11/07(Thu) 18:27:55)
  • アイコン魔界の仮面弁士さん

    いつも、丁寧に有難う御座います。
    色々、ググって整理したつもりが、スカスカでした。
    VBAで、型を意識する癖がついていないので、苦労しています。

    Call文なんて、言われてみれば、納得できるのですが、思いつきもしませんでした。
    何度も、熟読してものにしたいと考えます。

    本当に、ご丁寧に有難う御座います。

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

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34345 / 親記事)  WebClientで、短期間にDownloadStringAsyncを実行したい
□投稿者/ VBはじめました 一般人(10回)-(2019/10/29(Tue) 11:48:38)
  • アイコン環境/言語:[VB.net] 
    分類:[.NET] 

    Webから、Htmlデータをダウンロードするプログラムを作ろうとしています。
    どうしても、Completedする前に、別のページのダウンロードを始める(その場合、ダウンロード中のデータは破棄してよい)必要があります。

    DownloadStringAsyncの前にCancelAsyncを実行すれば可能かと思ったのですが、
    System.NotSupportedException: 'WebClient は同時 I/O 操作をサポートしません。'とエラーが発生します。

    但し、キャンセル場合もあります。(不安定)
    どのようにすれば、確実にキャンセルできるのでしょうか?
    詳しい方いらっしゃいまいたら教えてください。
    サンプルのコードは下記になります。(フォームにボタン一つ貼り付けている)
    3回に一回ぐらいは成功する

    Imports System.Net
    Imports System.Text

    Public Class Form1
    Dim myUri As Uri = New Uri("https://www.yahoo.co.jp/")
    Dim HtmlData As String
    WithEvents myWebClient As New WebClient
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    myWebClient.Encoding = Encoding.UTF8
    myWebClient.DownloadStringAsync(myUri)
    myWebClient.CancelAsync()
    myWebClient.DownloadStringAsync(myUri) ←ここでエラー発生!
    End Sub
    Private Sub myWebClient_DownloadStringCompleted(sender As Object, e As DownloadStringCompletedEventArgs) Handles myWebClient.DownloadStringCompleted
    If e.Error Is Nothing Then
    HtmlData = CStr(e.Result)
    MsgBox(HtmlData.Substring(0, 1000))
    ElseIf e.Cancelled Then
    MsgBox("キャンセルボタンが押されました。")
    End If
    End Sub
    End Class


違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34370 / ResNo.1)  Re[1]: WebClientで、短期間にDownloadStringAsyncを実行したい
□投稿者/ shu 大御所(489回)-(2019/11/07(Thu) 08:49:19)
  • アイコンNo34345に返信(VBはじめましたさんの記事)

    WebClientのインスタンスを別に作るのでは
    うまくいきませんでしょうか?
違反を報告
引用返信
■34371 / ResNo.2)  Re[2]: WebClientで、短期間にDownloadStringAsyncを実行したい
□投稿者/ VBはじめました 一般人(16回)-(2019/11/07(Thu) 10:14:24)
  • アイコンshuさん お返事有難う御座います

    IsBusyで状態を確認してmyWebClient.CancelAsync()を
    実行していましがた。どうしても、ロストするので、
    shuさんのおっしゃる通り、コストがかかっても
    インスタンスを新しく作ることにします。

    有難うございました。
解決み!
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34365 / 親記事)  vb.net+SQLiteで複数データベースファイルへのトランザクション方法
□投稿者/ アルファアンドベータ 一般人(1回)-(2019/11/05(Tue) 22:45:15)
  • アイコン環境/言語:[VB.NET(Framework 4.6.1)] 
    分類:[.NET] 

    VB.netとSQLiteでテキストから読み込んだデータを
    複数のデータベースファイルへ(今回は2つのファイル)
    D:\test\NameTime.sqlite3
    D:\test\NameCount.sqlite3

    トランザクション処理を実施したいのですが、Commit段階で
    「the Connecion was closed and re-opened....」と
    エラーがはかれてしまいます。(実際にはinsertできている状態)
    ロールバックもわざと実施しましたがロールバックできません。

    私の書き方が悪いためトランザクションが機能していないようです。

    複数のデータベースファイルへの
    トランザクションの張り方を教えていただきたく
    こちらへ書き込みました
    よろしくお願い致します。

    開発環境
    =====================================
    IDE:VisualStdio Express 2017
    フレームワーク:NET Framework 4.6.1
    データベース:SQLite 3 NuGetパッケージ使用
           (System.Data.SQLite.Core v1.0.112)
    PC:Windows10 Pro 64bit

    本来の仕様
    @あるフォルダ内のtxtファイルからデータ読み込み
     (更新日時順にソートし読み込み)
    Aデータベース登録(トランザクションコミット前状態)
    B登録後バックアップフォルダにtxt移動
    C移動が完了したらコミット
    Dコミットが成功したら終了 
     失敗ならバックアップフォルダから戻し次のループで読み込む
    =====================================


    mainフォーム
    =====================================
    Private Sub データ登録()

    Dim strSQLite As New strSQLiteClass
    Dim SQLiteCN As New System.Data.SQLite.SQLiteConnection
    Dim tran As System.Data.SQLite.SQLiteTransaction = Nothing
    Dim Names As String
    Dim Times As String
    Dim Counts As Long
    Dim SQLiteOutFolder As String

    'DB保存先
    SQLiteOutFolder = "D:\test"

    '接続設定
    SQLiteCN.ConnectionString = "Version=3;Data Source=" & strDBFilePath & ";New=False;Compress=True;"

    'SQLiteコネクションオープン
        'これがないと.BeginTransactionでエラー
    SQLiteCN.Open()
    SQLiteCN.Close()

    tran = SQLiteCN.BeginTransaction()
    Try

          '本来であればフォルダ内のtxtファイルを
          'ループさせながら取得登録します。
    Names = "Aさん"
    Times = "00:01:20.01"
    Counts = 10


    If strSQLite.NameTime登録(SQLiteCN, Names, Times, SQLiteOutFolder) = True Then
    Else
    GoTo ErrEnd
    End If

    If strSQLite.NameCount登録(SQLiteCN, Names, Counts, SQLiteOutFolder) = True Then
    Else
    GoTo ErrEnd
    End If

    tran.Commit()


    ErrEnd:
    '正常終了しない、ErrEndの場合はロールバック
    tran.Rollback()


    Catch ex As Exception
    tran.Rollback()

    Finally
    '破棄
    tran.Dispose()
    SQLiteCN.Dispose()


    End Try


    End Sub

    =====================================



    実際に書き込むclass
    =====================================
    Public Class strSQLiteClass
    Friend Function NameTime登録(ByRef SQLiteCN As System.Data.SQLite.SQLiteConnection, ByVal Names As String, ByVal Times As String, ByVal SQLiteOutFolder As String) As Boolean


    Dim strDBFilePath As String = SQLiteOutFolder & "\NameTime.sqlite3"
    'データベースファイルの確認
    If System.IO.File.Exists(strDBFilePath) = True Then
    Else
    '存在しない
    MessageBox.Show("データベース接続エラー", "データベースが存在しません", MessageBoxButtons.OK, MessageBoxIcon.Error)
    NameTime登録 = False
    Exit Function
    End
    End If


    '接続設定
    SQLiteCN.ConnectionString = "Version=3;Data Source=" & strDBFilePath & ";New=False;Compress=True;"
    'SQLiteコネクションオープン
    SQLiteCN.Open()
    Try
    Dim SQLiteCommand As System.Data.SQLite.SQLiteCommand
    'SQLコマンド設定
    SQLiteCommand = SQLiteCN.CreateCommand
    Try


    '登録
    SQLiteCommand.CommandText = "INSERT INTO [T_NameTime] " &
    "(" &
    "Name, " &
    "Time" &
    ") " &
    "VALUES(" &
    "'" & Names & "', " &
    "'" & Times & "'" &
    ") "
    SQLiteCommand.ExecuteNonQuery()
    NameTime登録 = True

    Catch ex2 As Exception
    MessageBox.Show(ex2.Message)
    NameTime登録 = False

    Finally
    '破棄
    SQLiteCommand.Dispose()

    End Try

    Catch ex As Exception
    MessageBox.Show(ex.Message)
    NameTime登録 = False

    Finally
    'クローズ
    SQLiteCN.Close()
    End Try


    End Function

    Friend Function NameCount登録(ByRef SQLiteCN As System.Data.SQLite.SQLiteConnection, ByVal Names As String, ByVal Counts As Long, ByVal SQLiteOutFolder As String) As Boolean


    Dim strDBFilePath As String = SQLiteOutFolder & "\NameTime.sqlite3"
    'データベースファイルの確認
    If System.IO.File.Exists(strDBFilePath) = True Then
    Else
    '存在しない
    MessageBox.Show("データベース接続エラー", "データベースが存在しません", MessageBoxButtons.OK, MessageBoxIcon.Error)
    NameCount登録 = False
    Exit Function
    End
    End If


    '接続設定
    SQLiteCN.ConnectionString = "Version=3;Data Source=" & strDBFilePath & ";New=False;Compress=True;"
    'SQLiteコネクションオープン
    SQLiteCN.Open()
    Try
    Dim SQLiteCommand As System.Data.SQLite.SQLiteCommand
    'SQLコマンド設定
    SQLiteCommand = SQLiteCN.CreateCommand
    Try


    '登録
    SQLiteCommand.CommandText = "INSERT INTO [T_NameTime] " &
    "(" &
    "Name, " &
    "Count" &
    ") " &
    "VALUES(" &
    "'" & Names & "', " &
    Counts &
    ") "
    SQLiteCommand.ExecuteNonQuery()
    NameCount登録 = True

    Catch ex2 As Exception
    MessageBox.Show(ex2.Message)
    NameCount登録 = False

    Finally
    '破棄
    SQLiteCommand.Dispose()

    End Try

    Catch ex As Exception
    MessageBox.Show(ex.Message)
    NameCount登録 = False

    Finally
    'クローズ
    SQLiteCN.Close()
    End Try


    End Function
    End Class
    =====================================
違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■34366 / ResNo.1)  Re[1]: vb.net+SQLiteで複数データベースファイルへのトランザクション方法
□投稿者/ Hongliang 大御所(569回)-(2019/11/06(Wed) 09:36:00)
  • アイコン
    冗長でインデントもないコードは読む気がしないですが。
    
    とりあえず、複数のDBファイルにまたがったトランザクションのサンプルを記載しておきます。
    // ベタで書いたのでコンパイルが通るかどうか、ちゃんと動くかまでは確認してません。
    ポイントは、
    ・接続は片方のDBファイルに対して行う。もう片方のDBファイルはATTACH DATABASEで接続に参加させる。
     メイン側はmain.を、ATTACHした側はATTACH時のASで付けたエイリアスを、テーブル名の前につける。
    ・トランザクションはOpenしたコネクションに依存するので、Commitする前にコネクションをCloseしたりしない。
     INSERTを複数の呼び出しに分けるならコネクションはその間ずっとキープする必要がある。
     (もちろんトランザクションも)
    本筋以外では
    ・パラメータは&で文字列結合したりしないで、Parameters.AddWithValueなどでパラメータとして追加する。
    
    Class MultiFileDB
        Implements IDisposable
    
        Private m_DbFilePath1 As String = "..."
        Private m_DbFilePath2 As String = "..."
        Private m_Connection As SQLiteConnection
        Private m_Transaction As SQLiteTransaction
    
        Public Sub New()
            m_Connection = New SQLiteConnection("Data Source=" & m_DbFilePath1)
            m_Connection.Open()
            Using comm As New SQLiteCommand("ATTACH DATABASE @file AS sub", m_Connection)
                comm.Parameters.AddWithValue("@file", m_DbFilePath2)
                comm.ExecuteNonQuery()
            End Using
            m_Transaction = conn.BeginTransaction()
        End Sub
    
        Public Sub InsertToDB1(ByVal name As String, ByVal time As String)
            Using comm As New SQLiteCommand("INSERT INTO main.T_NameTime VALUES (@name, @time)", _
                                            m_Connection, m_Transaction)
                comm.Parameters.AddWithValue("@name", name)
                comm.Parameters.AddWithValue("@time", time)
                comm.ExecuteNonQuery()
            End Using
        End Sub
    
        Public Sub InsertToDB2(ByVal name As String, ByVal time As String)
            Using comm As New SQLiteCommand("INSERT INTO sub.T_NameTime VALUES (@name, @time)", _
                                            m_Connection, m_Transaction)
                comm.Parameters.AddWithValue("@name", name)
                comm.Parameters.AddWithValue("@time", time)
                comm.ExecuteNonQuery()
            End Using
        End Sub
    
        Public Sub Dispose() Implements IDisposable.Dispose
            m_Transaction.Commit()
            m_Connection.Close()
        End Sub
    End Class

違反を報告
引用返信
■34367 / ResNo.2)  Re[2]: vb.net+SQLiteで複数データベースファイルへのトランザクション方法
□投稿者/ アルファアンドベータ 一般人(2回)-(2019/11/06(Wed) 20:29:46)
  • アイコンご回答頂き有りがとうございます
    今回例題の2個にした私が悪いのですが
    7個のデータベースがある場合は
    どうATTACH DATABASEすればよろしいでしょうか?

    またパラメータでの受け渡しを初めて知り勉強になります。
    ありがとうございます。
    パラメータ受け渡しですが
    下記のパラメータは
    comm.Parameters.AddWithValue("@name", name)

    こちらとどちらがいいのでしょうか?
    comm.Parameters.Add("@name", DbType.String).Value = name ;
    タイプ指定の方が速いですか?
違反を報告
引用返信
■34368 / ResNo.3)  Re[3]: vb.net+SQLiteで複数データベースファイルへのトランザクション方法
□投稿者/ Hongliang 大御所(570回)-(2019/11/06(Wed) 20:49:40)
  • アイコン> 7個のデータベースがある場合は
    > どうATTACH DATABASEすればよろしいでしょうか?
    順次ATTACHを実施していけばいいのでは…?
    何が分からないのか分からないです。

    > どちらがいいのでしょうか?
    > comm.Parameters.AddWithValue("@name", name)
    > comm.Parameters.Add("@name", DbType.String).Value = name ;
    どちらでも構いませんしそんなに差はないと思います。
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34359 / 親記事)  Newの使い方間違ってますか?
□投稿者/ VBはじめました 一般人(13回)-(2019/11/05(Tue) 13:47:26)
  • アイコン環境/言語:[VisualStudio2017 VB.net] 
    分類:[.NET] 

    フォームのインスタンスを作る方法として次の4つの方法がある(それ以上あるかも?)とします。
    Dim Frm1 As Form
    Frm1 = New Form 'Sub Form.New()
    Dim Frm2 As Form = New Form 'Sub Form.New()
    Dim Frm3 = New Form 'Sub Form.New()
    Dim Frm4 As New Form 'Sub Form.New()

    一方、Integer型の配列のインスタンスを作る方法として、対比させると
    次のようになると思います。
    Dim Int41 As Integer()
    Int41 = New Integer() {1, 2, 3, 4, 5} 'Integer()
    Dim Int42() As Integer = New Integer() {1, 2, 3, 4, 5} 'Integer()
    Dim Int43 = New Integer() {1, 2, 3, 4, 5} 'Integer()
    Dim Int44 As New Integer() 'Sub Integer.New()

    フォームの場合、Newキーワードのところにカーソルを持っていくと
    各行のコメントが表示されます。
    Int44だけ、違った表示がされ、配列になりません。
    なぜですか?
    詳しい方いらっしゃいましたら教えて頂けませんでしょうか?
    宜しくお願いいたします。
違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■34360 / ResNo.1)  Re[1]: Newの使い方間違ってますか?
□投稿者/ 魔界の仮面弁士 大御所(1250回)-(2019/11/05(Tue) 14:16:30)
  • アイコンNo34359に返信(VBはじめましたさんの記事)
    > Dim Frm4 As New Form 'Sub Form.New()
    これは
     Dim Frm4 As New Form()
    の省略形です。

    メソッドやコンストラクタの呼び出し時には、
    引数を指定するための丸括弧が必要とされますが、
    引数が 0 個の場合に限り、丸括弧を省略できます。


    > Dim Int42() As Integer = New Integer() {1, 2, 3, 4, 5} 'Integer()
    こちらの括弧は引数指定のためのものではなく、配列宣言を意味します。

    > Dim Int41 As Integer()
    > Int41 = New Integer() {1, 2, 3, 4, 5} 'Integer()
    この丸括弧も、配列宣言のためのものですね。
    Int42 と同様、宣言部と配列初期化子を組み合わせて
     Dim Int41 As Integer() = New Integer() {1, 2, 3, 4, 5}
    とも書けます。


    > Dim Int43 = New Integer() {1, 2, 3, 4, 5} 'Integer()
    > Dim Int44 As New Integer() 'Sub Integer.New()
    前者の丸括弧は「配列」のためのものです。※配列初期化子
    後者の丸括弧は「引数」のためのものです。※構造体の既定のコンストラクタ

    先の Form 宣言と対応する形で並べれば、
     Dim Frm4 As New Form() 'Form クラスの引数0個のコンストラクタ呼出
     Dim Int44 As New Integer() 'Integer 構造体の既定のコンストラクタ呼出
    となります。どちらも引数指定です。


    引数 0 個の場合、丸括弧を省略できますので、
     'Dim Int44 As New Integer()
     Dim Int44 As New Integer
    とするのは OK ですが、配列宣言の括弧を省略すると意味が変わってくるため
    Int41〜Int43 については丸括弧が必須です。


    Dim Int44 As New Integer()
       ↓
    Dim Int44 As Integer = New Integer()
       ↓
    Dim Int44 As Integer = 0
違反を報告
引用返信
■34361 / ResNo.2)  Re[1]: Newの使い方間違ってますか?
□投稿者/ 魔界の仮面弁士 大御所(1251回)-(2019/11/05(Tue) 14:25:15)
  • アイコン2019/11/05(Tue) 14:33:59 編集(投稿者)

    No34359に返信(VBはじめましたさんの記事)
    > Int41 = New Integer() {1, 2, 3, 4, 5} 'Integer()
    > Dim Int42() As Integer = New Integer() {1, 2, 3, 4, 5} 'Integer()

    配列のインデックスを明示することもできますね。(各要素はゼロになる)
     Dim Int46(4) As Integer
     Dim Int47(0 To 4) As Integer
     Dim Int48(0 To -1) As Integer
     Dim Int49(-1) As Integer


    コンストラクタ引数の丸括弧やメソッド引数の丸括弧は省略できますが、
    代入式の右辺にある配列初期化子については、
    丸括弧や波括弧を省略することが出来ません。


    ' これらの括弧は省略できない
    Int46 = New Integer(4) {}
    Int46 = New Integer(4) {1, 2, 3, 4, 5}
    Int46 = New Integer(0 To 4) {}
    Int46 = New Integer(0 To 4) {1, 2, 3, 4, 5}
    Int49 = New Integer(0 To -1) {}
    Int49 = New Integer(-1) {}
    Int49 = New Integer() {}


    そして
     Dim Int43 = New Integer() {1, 2, 3, 4, 5}

     Dim Int43 As New Integer() {1, 2, 3, 4, 5}
    と記述できない理由は、『New Integer()』の時点で、
    配列ではなく「コンストラクタの指定」と見做されるためです。

    最近のバージョンでは、型推論が利用できるため、
     Dim Int43 = {1, 2, 3, 4, 5}
    と書いたとしても、Integer 型の一次元配列としてコンパイルされますね。



    また、
     Dim Int42() As Integer = New Integer()

     Dim Int42() As New Integer()
    と書けない理由は、New の丸括弧と配列の丸括弧が同居すると、
    意味が曖昧になるという理由によって禁止されているためです。
違反を報告
引用返信
■34362 / ResNo.3)  Re[2]: Newの使い方間違ってますか?
□投稿者/ VBはじめました 一般人(14回)-(2019/11/05(Tue) 16:07:22)
  • アイコン魔界の仮面弁士さん いつも有難う御座います。

    質問の答えとしては、
     Dim Int42() As New Integer()
    と書けない理由は、New の丸括弧と配列の丸括弧が同居すると、
    意味が曖昧になるという理由によって禁止されているためです。
    だけで、済むところを、凄い労力をかけて懇切丁寧に、記載して頂き、ありがとうございます。理解できていなかったものばかりでとても勉強になります。

    無駄にしないように、何度も、熟読して理解していきたいと思います。

    重ね重ね、有難う御座いました。


違反を報告
引用返信
■34363 / ResNo.4)  解決済み押し忘れ
□投稿者/ VBはじめました 一般人(15回)-(2019/11/05(Tue) 16:08:14)
  • アイコン有難うございました
解決み!
違反を報告
引用返信

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



■記事リスト / ▲上のスレッド
■34349 / 親記事)  ジェネリック型インターフェースを使った変数を扱いたい
□投稿者/ アフロ 一般人(1回)-(2019/11/01(Fri) 11:51:54)
  • アイコン環境/言語:[C# VisualStudio2012] 
    分類:[.NET] 

    ジェネリック型指定したインターフェースを扱っていて、行き詰ってしまいました。

    public interface IRoutine
    {
      // 基本の機能
    }

    public interface IRoutine<TParent> : IRoutine
    where T : IRoutine
    {
      // 親を設定する
      T Parent { get; set; }
    }

    ClassA : IRoutine<ClassA>
    {
    }

    ClassB : IRoutine<ClassB>
    {
    }

    としたとき、
    var routines = new IRoutine<T>[] {ClassA, ClassB}; // ※
    foreach(var routine in routines)
    {
      routine.Parent = 〇〇;
    }

    のように、ClassAとClassBを同じコレクションに入れて反復処理をしたいのですが、※の部分でうまく行きません。
    このような場合、変数の型指定はどのようにしてやれば良いのでしょうか?
    よろしくお願いします。

違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■34351 / ResNo.1)  Re[1]: ジェネリック型インターフェースを使った変数を扱いたい
□投稿者/ 魔界の仮面弁士 大御所(1246回)-(2019/11/01(Fri) 16:13:16)
  • アイコンNo34349に返信(アフロさんの記事)
    > public interface IRoutine<TParent> : IRoutine
    >     where T : IRoutine
    > {
    >   // 親を設定する
    >   T Parent { get; set; }
    > }

    このインターフェイスは、<T> を持つジェネリック クラスの
    子階層で定義されているということでしょうか?
    それともこれは誤記で、実際は T = TParent なのでしょうか?


    > ClassA : IRoutine<ClassA>
    これは「class ClassA : IRoutine<ClassA>」のことでしょうか?


    > var routines = new IRoutine<T>[] {ClassA, ClassB}; // ※

    元ソースが文法的に不正確である点はさておき、
     var t0 = typeof(IRoutine);
     var t1 = typeof(IRoutine<>);
     var t2 = typeof(IRoutine<ClassA>);
     var t3 = typeof(ClassA);
    において、
     t0.IsAssignableFrom(*) は、t0〜t3 いずれに対しても true
     t1.IsAssignableFrom(*) は、t1 自身以外はすべて false
     t2.IsAssignableFrom(*) は、t0〜t1 は false、t2 自身と t3 は true
     t3.IsAssignableFrom(*) は、t3 自身以外はすべて false
    という関係性を持ちます。


    ゆえに今回の型定義の場合、書くとしても
     var routines = new IRoutine[] { new ClassA(), new ClassB() };
     foreach (dynamic routine in routines)
     {
       routine.Parent = afro;
     }
    とするしかないでしょう。


    ただしこの場合、公開された
     class ClassA : IRoutine<ClassA>
     {
       public ClassA Parent { set; get; }
     }
    のような実装が対象であり、明示実装された
     class ClassA : IRoutine<ClassA>
     {
       ClassA IRoutine<ClassA>.Parent { set; get; }
     }
    なクラスに対しては使えません。
違反を報告
引用返信
■34352 / ResNo.2)  Re[2]: ジェネリック型インターフェースを使った変数を扱いたい
□投稿者/ アフロ 一般人(2回)-(2019/11/01(Fri) 17:47:28)
  • アイコン魔界の仮面弁士さん
    ご回答ありがとうございます。

    >>public interface IRoutine<TParent> : IRoutine
    >>    where T : IRoutine
    すみません。TはTParentの誤りです。

    >>ClassA : IRoutine<ClassA>
    > これは「class ClassA : IRoutine<ClassA>」のことでしょうか?
    仰る通り、class ClassA : IRoutine<ClassA>のつもりでした…

    dynamicという宣言の仕方を知らなかったので、そんな方法があったかと驚きました。
    是非取り入れてみたいと思います。
    助かりました。

    しかし、インターフェースは反復処理で力を発揮するものと思っていましたが
    ジェネリックにするとそうでもないのですかね… 今更な嘆きですが…

解決み!
違反を報告
引用返信
■34353 / ResNo.3)  Re[3]: ジェネリック型インターフェースを使った変数を扱いたい
□投稿者/ 魔界の仮面弁士 大御所(1247回)-(2019/11/01(Fri) 18:37:58)
  • アイコン2019/11/03(Sun) 15:28:57 編集(投稿者)

    No34352に返信(アフロさんの記事)
    > dynamicという宣言の仕方を知らなかったので、そんな方法があったかと驚きました。

    ジェネリックはコンパイル時点で型が確定していますが、
    dynamic の場合は実行時に動的に判定されます。

    そのため、ジェネリックに比べるとパフォーマンスは幾許か落ちますし、
    スペルミスや型の取り違いなどがあった場合も、
    コンパイル時点では検出されません。御注意ください。


    > しかし、インターフェースは反復処理で力を発揮するものと思っていましたが
    > ジェネリックにするとそうでもないのですかね…

    No34349 にあるような型定義だと使えませんが、ジェネリックの指定如何によっては
    共変性・反変性によって対処できることはありそうです。
    https://ufcpp.net/study/csharp/sp4_variance.html

    また、将来的には共変戻り値を使えるようになるかもしれません。
    ただし仮に実装されたとしても、.NET Framework では利用できず、
    .NET 5 あるいは .NET 6 以降になりそうです。
    https://ufcpp.net/blog/2019/10/pickuproslyn1004/



    > 今更な嘆きですが…
    今回の型パラメータ T が指し示す型は、
     interface IRoutine<T> : IRoutine where T : IRoutine
     {
      T Parent { get; set; }
     }
    と定義されています。

    なので、Parent プロパティが取り扱うインスタンスは、「少なくとも IRoutine 型を持つ」ことは間違いありません。

    その上で、実際のインスタンスについては、型定義が
     「class ClassA : IRoutine<ClassA>」
     「class ClassB : IRoutine<ClassB>」
    となっています。

    ClassA と ClassB は互いの継承関係を持ちません。
    両者の共通点は、「ジェネリックではない IRoutine インターフェイスを持つこと」だけです。

    この共通している IRoutine 型を使うことで、少なくとも
     『foreach (IRoutine routine in routines)』
    と書くことはできるでしょう。

    しかし IRoutine に Parent プロパティは無いので、
    このループ変数では、Parent に代入できません。

    型の確定した Parent を持つのは IRoutine ではなく、
    IRoutine<ClassA> や IRoutine<ClassB> 、
    あるいは ClassA や ClassB 型といった固有の型だけです。

    両者に共通した型が存在していない以上、このままでは
    ループ処理させることができないというわけです。
    (先述したように、dynamic やリフレクションを用いて、
    コンパイル時点ではなく実行時に解決させることならば可能)


    逆に言えば、これはつまり ClassA と ClassB の両方に対して
    「Parent プロパティを持つ共通の型」を継承もしくは実装しておくことで、
    foreach による取りまとめが可能になることを意味します。


    たとえば、こういう書き方をすることはできるでしょう。

    // 下記 2 つの定義はそのまま
    public interface IRoutine { /* 基本となる各種メンバー定義 */ }
    public interface IRoutine<T> : IRoutine where T : IRoutine
    {
      // Parent プロパティだけを定義
      T Parent { get; set; }
    }

    // 「Parent プロパティを持つ共通の型」を新たに定義
    abstract class RoutineBase : IRoutine<IRoutine>
    {
      // abstract または virtaual で定義
      public abstract IRoutine Parent { get; set; }
    }

    // 少なくとも「共通の型」を持つように実装する
    class ClassC : RoutineBase { … }
    class ClassD : RoutineBase, IRoutine<ClassD> { … }

    ***************

    var routines = new RoutineBase[] { new ClassC(), new ClassD() };
    foreach (RoutineBase routine in routines)
    {
      routine.Parent = IRoutine型の何か;
    }

    ===================

    上記では、「共通の型」として抽象クラスを設けていますが、
    もちろんインターフェイスのままでも OK です。


    // 「Parent プロパティを持つ共通の型」の定義
    interface IParent : IRoutine<IRoutine> { }


    // 少なくとも「共通の型」を持つように実装する
    class ClassE : IParent {
     public IRoutine Parent { get; set; }
    }
    class ClassF : IParent, IRoutine<ClassF> { … }

    ***************
    var routines = new IParent[] { new ClassE(), new ClassF() };
    foreach (IParent routine in routines)
    {
      routine.Parent = IRoutine型の何か;
    }


    あるいは、そもそも IRoutine<T> を廃止してしまい、上記 IParent を
     interface IParent : IRoutine
     {
       IRoutine Parent { get; set; }
     }
    にしてしまうという手もあります。
解決み!
違反を報告
引用返信

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






Mode/  Pass/


- Child Tree -

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