Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

Net Framework4.8 Advenced Services 共有ファイルが開けない 解決済み

トラブルシューティング タグの編集...

投稿者 hori   (社会人)   投稿日時 2019/9/14 12:45:32
お世話になります。

表題の件、Windows Server 1012 でドメインを立ててファイル共有をしていますが
新しく買った Win10 pro のPCで、VS2015 のVBで書いた自作アプリから
サーバー内のアクセスデータベースにアクセスできません。

コントロールパネルのシステムにドメイン名は表示されていますし
エキスプローラでサーバーを開いてファイルの貼り付けや削除はできます。

現状、他のPCで正常に動いているので、アプリの問題とは思われません。

サーバーのデータを、Cドライブにコピーしてアプリのアクセス先を
Cドライブにしてやると正常に動きますし・・・。


前のPCとの違いは、Framework のバージョンだけだと思うのですが
それが原因と考えられるのでしょうか?

情報をご存知の方居られましたらご教示お願いいたします。


また、それを確かめるために、4.8 をアンインストールして、4.6 に差し替えてみたいのですが
4.8 のアンインストールの方法が解かりません。(4.6の追加は不可でした)
前記の情報が無いようでしたら、4.8 が原因か確かめてみたいので、
4.8 のアンインストールの方法をご存知の方居られましたらご教示お願いいたします。


投稿者 るきお   (社会人)   投稿日時 2019/9/14 17:26:07
プログラムからAccessのデータベースへのアクセスはどのように記述しているのでしょうか?

>サーバー内のアクセスデータベースにアクセスできません。
何かエラーメッセージなど表示されますか?

投稿者 るきお   (社会人)   投稿日時 2019/9/14 17:31:02
.NET Frameworkをアンインストールするにはコントロールパネルのプログラムと機能から普通のソフトウェアと同じようにアンインストールします。
ただし、最近のWindows(Windows 8以上?)では普通のやり方ではアンインストールできないようです。

.NET Frameworkのアンインストールを検討する前に他の要因を探したほうが良いように思います。

また、違うバージョンの.NET Frameworkで試してみたい場合は、別のパソコンや仮想環境を使用するのが楽です。私はいくつかの仮想環境を使っています。

投稿者 hori   (社会人)   投稿日時 2019/9/15 01:22:46
いつもお世話になります。

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

        Dim Cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & 格納庫 & "暗証番号.accdb")
        Dim SQLCm As OleDbCommand = Cn.CreateCommand
        Dim Adapter As New OleDbDataAdapter(SQLCm)
        Dim Table As New DataTable

        Dim sql As String

        sql = "SELECT * FROM TBL暗証番号"
        sql &= " ORDER BY 暗証番号"

        SQLCm.CommandText = sql

        Try
            Adapter.Fill(Table)
        Catch ex As Exception
 
        End Try

        Return Table

 
        Table.Dispose()
        Adapter.Dispose()
        SQLCm.Dispose()
        Cn.Dispose()
  
========================================

アクセス部分のコードはこんな感じで、変数の「格納庫」の値を
 \\SERVER\TEST\ とか C:\TEST\ とかにしています。

特別エラーの表示はされませんが、返ってきた Table の Rows.Count が
NET Framework 4.8 でサーバーにアクセスしたときは「0」になります。
4.8 でCドライブにアクセスしたとき、4.6 ではどちらも正常な値が返ってきます。

ドメインの設定がおかしいのが原因という事はあり得るでしょうか?
ちなみに、エキスプローラーでファイルの読み書きはできています。


投稿者 るきお   (社会人)   投稿日時 2019/9/15 11:45:15
Accessに詳しくないので具体的に切り分けられませんが、下記のような調査をすると状況が見えてくるかもしれません。

・FROMのテーブル名を存在しないテーブルにして実行するとどうなるでしょう?

・Accessは詳しくないのですが、テーブルなしで実行できるようなSQLはありませんか?
そのSQLが正しい結果を返すかどうかで、データベースへのアクセス自体がうまくいっているかどうかはわかると思います。

たとえば、SQL Serverでは SELECT @@Version を実行するとSQL Serverのバージョン情報をSELECTの結果として取得できます。このような簡単にお試しできるものがあればよいのですが。

・Visual Studioのサーバーエクスプローラーでデータ接続からそのAccessに接続して中身が見えるでしょうか?

・この件、試してみたのは配置1・2・3であっていますか?配置4だとどうなるでしょうか?
PC1 = .NET Framework 4.6 のパソコン
PC2 = .NET Framework 4.8 のパソコン


配置1
accdbファイルをサーバーに配置、プログラムをPC1で実行 →TableのRows.Countに想定した件数が入る。

配置2
accdbファイルをサーバーに配置、プログラムをPC2で実行 →TableのRows.Countが0になる。


配置3
accdbファイルをPC1に配置、プログラムをPC1で実行 → TableのRows.Countに想定した件数が入る。

配置4
accdbファイルをPC2に配置、プログラムをPC2で実行 → ???



感触としては接続自体できないのであればエラーになっているはずです。
しかし、horiさんのプログラムはTryでエラーを握りつぶしているのと、格納庫の値がプログラムで示されていないこと、それから、Table の Rows.Count が0であることを確認した手段が不明であることから情報不足に感じます。

うまくうごかないコードを載せていただく際には必要な情報が含まれるようにまとめていただくのがよく、何が必要の判断は難しいので、うまくうごかない小さなプログラムを作ってそれ全体を載せていただくのがベストです。これを現象が再現できる最小限のコードと呼びます。
たとえば、格納庫の値など公開したくないのであれば、公開しても差支えがないものに変更したり、Rows.Countをデバッグで確認しているのであればプログラム内でIf文で分岐するようにして示していただくなどすると、いろいろある可能性の中で関係のないものを早い段階でつぶせるので意味があります。

※それでもどうしても公開したくない部分を伏せざるを得ない場合もありますが。

このような再現コードを作る過程で自分自身で原因に気が付くことも良くあることです。

投稿者 hori   (社会人)   投稿日時 2019/9/15 23:58:47
るきおさま。今日は朝から外出で先刻帰宅し、先に書いたコードの、try 部分を外してやってみました。

そうすると、4.8 の方で『Microsoft.ACE.OLEDB.12.0 プロバイダーはローカルのコンピューターに登録されていません。』のエラーが出ました。

原因はこれのようですが、4.8 では名前が変わったと云う事でしょうか?。

投稿者 hori   (社会人)   投稿日時 2019/9/16 00:02:21
追伸。

しかし、それだとすると、データをCドライブに置くとエラーにならないのはおかしいですよね。

投稿者 hori   (社会人)   投稿日時 2019/9/16 01:08:56
るきおさま。エラーが出たので喜び勇んでしまい、ご質問にお答えするのを忘れ失礼いたしました。

アクセスの SQL : 僕がるきおさま以上に詳しいはずはないです。

サーバーエクスプローラー : PC2にはまだVSをインストールしてないので不明です。

一番のネックは、VS2019 では扱えるデータベースの数が1つになったと聞いたことですが
僕の前回の質問の通り、PC1が突然動かなくなったときのための予備にPC2を用意したので
VS2019のせいで2015が動かないなんてことになっては困るので
VS2019をもう少し調べてからと思っているのですが、どうやって調べるのかが悩みどころです。 


次の点 : 配置2以外は正常に動いています。配置2も rows.count を

        Dim n As Integer = 0

        Try
            n = Table.Rows.Count
        Catch ex As Exception
 
        End Try

の、n の値で見てましたので Table が Null状態 でもエラーにはならず[0]としていました。


後で考えれば、つまらないことが原因かもしれぬ話にお気をかけていただきありがとうございます。

投稿者 hori   (社会人)   投稿日時 2019/9/16 13:10:22
その後、フォームにボタンを1つ貼り付け、以下のようなコードでやってみました。

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

Imports System.Data.OleDb

Public Class Form1


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim Cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & "\\SERVER\TEST\暗証番号.accdb")
        Dim SQLCm As OleDbCommand = Cn.CreateCommand
        Dim Adapter As New OleDbDataAdapter(SQLCm)
        Dim Table As New DataTable

        Dim sql As String = "SELECT * FROM TBL暗証番号"

        SQLCm.CommandText = sql


        Adapter.Fill(Table)

        Dim row As DataRow = Table.Rows(0)

        Table.Dispose()
        Adapter.Dispose()
        SQLCm.Dispose()
        Cn.Dispose()

        MsgBox(row(1))

    End Sub

End Class

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

なんと、PC2でも正常に、row(1) の値が表示されました。

これから、扱うデータベースを2つにした場合をやってみます。

投稿者 hori   (社会人)   投稿日時 2019/9/16 13:30:40
先のコードの、メッセージボックスの下に TEST() を入れ


    Private Sub TEST()


        Dim Cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & "\\SERVER\TEST\暗証番号2.accdb")
        Dim SQLCm As OleDbCommand = Cn.CreateCommand
        Dim Adapter As New OleDbDataAdapter(SQLCm)
        Dim Table As New DataTable

        Dim sql As String = "SELECT * FROM TBL暗証番号"

        SQLCm.CommandText = sql


        Adapter.Fill(Table)

        Dim row As DataRow = Table.Rows(1)

        Table.Dispose()
        Adapter.Dispose()
        SQLCm.Dispose()
        Cn.Dispose()

        MsgBox(row(1))


    End Sub

を追加してやってみました。

正常に作動しました。データベースの数が問題ではないようです。


投稿者 hori   (社会人)   投稿日時 2019/9/16 14:43:37
ご迷惑をおかけいたしました。原因がわかりました。

実は、配置4を調べたプログラムがサーバー接続用の亜流だったので、どこが違うか調べてみたら、エラーの出たプログラムは、『対象のフレームワーク』が [NET Framework 4] でした。 なので、とりあえず配置4を調べたプログラムと同じ [NET Framework 4.5.2] にしてみたらサーバー用も正常に作動いたしました。

そういえば、Windows.Forms.DialogResult の Windows.Forms を削除した記憶があります。

分ってみれば「それだけのことか」なのですが.....

まぁ、4.6 までは動いていたものが、4.8 では動かないこともあると云う事で勉強になりました。