質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.87%

  • VBA

    1555questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • SQL Server

    535questions

    SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

  • Access

    376questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

クライアントPCのAccessからSQL Serverへの接続の方法について

解決済

回答 2

投稿

  • 評価
  • クリップ 2
  • VIEW 1,250

tapion40

score 1

初めて投稿致します。
AccessでフロントとDBとに別分けにして、リンクテーブルでADOで作成したものがあります。
DB部分をSQL-Serverにして、ネットワーク接続を試みておりますが、うまくいきません。調べ方が悪いことはわかるのですが、どのようなキーワードで調べれば良いか検討もつかず、ここに行き着きました。
 
環境ですが、
Windows7 Pro 64bit版に、Access2010とSQL-Server2014 Expressを入れて、ODBC設定やSQL-Serverからのリンクテーブル設定をして、これは稼働成功をしております。こちらのPCには、Access2010の開発ソフトをインストールしてあります。
この環境に対し、同じ社内のネットワーク上にある、Windows7 Pro 32bit版のパソコン(Accessの製品はなく、SQL-Server製品の類も全く無し)に、先ほどのAccess2010のフロント部分をコピーし、2010ランタイムも入れて、稼働させようとしたところ、
 
「実行時エラーが発生したため、このアプリケーションの実行は中断されました。アプリケーションを実行できません。システムはシャットダウンされました。」と表示され、稼働しません。
 
どのようにすればよろしいでしょうか?。

対処した内容は、
・accdbでODBC接続設定をしたものをaccdeに変換して配布
・ODBCの設定は、下記を参考としました
http://itdiary.info/microsoft-office/post-108/
・配布先PCには、Accessの開発環境は無い為、ランタイムをインストール
・配布先PCのAccessには、設定等の追加変更はしてない
・SQL-Serverの設定は、下記を参考としました
https://doublequotation.com/gift/20160217.pdf
・加えて、SQL-Serverへの接続をする為に、トップ画面のフォームロードに、下記コードを追加しました。


SQL-Server 2014 expressを入れた側のPCにおいて、
PC名:AAA
DB名:YYY
saアカウントで、パスはxxxxという具合のものとすると、


 
Dim cnnS As ADODB.Connection
Dim recW As ADODB.Recordset

Set cnnS = New ADODB.Connection
Set recW = New ADODB.Recordset

cnnS.Open "Provider=SQLOLE DB;" & _
"Data Source=AAA\SQLEXPRESS;" & _
"User ID=sa;" & _
"Password=xxxx;" & _
"Initial Catalog=YYY"

当方、元々制御系開発従事者で、DB系の開発は、Accessオンリーの小さな者しか経験ありません。
他のDB製品を使った開発経験はありません。
SQL-Serverのインストール設定も書籍を見よう見まねで今回設定してみました。
中小企業で、今回のは、基幹システムでもないので、常時接続は2・3人程度です。本来ならサーバー機とExpress以外の製品を購入して、となるのでしょうが、そんなお金はありませんし費用対効果がありません。よって、PCでなんとか実現したいと存じます。

よろしくご教授お願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

その端末にODBCデータソースの設定はされていますか?
されている場合は、その端末にODBCドライバーはインストールされていますか?

因みにリンクテーブルは低速だった経験があります。
パススルークエリーにすると高速に動作しました。
※更新系は見直す必要がありますが。

追記

・ODBCの設定は、下記を参考としました
http://itdiary.info/microsoft-office/post-108/

上記を参考にされているということなので、ODBCデータソースの設定を行われているということであれば、
動作させたいPC毎に必要です。

さらにその前提として、接続文字列と合わせて推測すると、「Microsoft OLE DB Provider for SQL Server」のインストールが必要です。
SQL-Server2014 ExpressをインストールされているPCはインストール時に同時にインストールされているものと思われます。

odbcドライバーのインストール位ならバッチで簡単に済ませられるので、odbcドライバー経由の接続の方が良さげな気がします。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/11 23:09

    ありがとうございます。
     「ODBCデータソース」????。
     配布先PCにそれをインストールする必要があるという事でしょうか?。
     私は、開発元で色々な設定を行い、accdeにしたものを配布(配布先には無論Accessのランタイムは必要)すれば、接続してくれるものと認識しておりました。
     そのキーワードで調べてみます。
     
     とりあえず、元々リンクテーブルで作ったので、SQL-Serverでもリンクテーブルで、まずはやってみます。
     記載したとおり、メジャーDBの経験は全く無いに等しいので、わかるところからチャレンジしてみます。
     ちなみに、同一PC内で試した感じでは、遅いとは全く感じなかったです。別PCから低速といっても、地方拠点に配布するわけではなく、自社のそれこそ同じフロア内の同じセグメント内での数台での利用であるので、さほど気にならないと思います。

     パススルークエリーというのが、ネットや本でみても、どのようなものか検討つかず、サーバ側で動いて答えを返すといった事柄を見ると、PL/SQLのようなものなのかな?と感じてしまっております。
     
     質問で書いたコードは、最初のトップ画面に記載したもので、トップ画面んから各画面に遷移するイメージとしております。
     その中で、例えば社員マスタの画面のコード(修正と削除を抜粋)は、下記のように作っており、同一PC内(クライアントが面とDB)では、追加修正削除問題なくできてます。


    Option Compare Database
    Option Explicit

    Dim str_getPara() As String
    Dim str_OyaGamen As String
    Dim str_Mode As String
    Dim str_Code As String

    '
    Private Sub cmd_削除_Click()
    Dim ct As New ADODB.Connection
    Dim str_Sql As String
    Dim i_Umu As Integer

    On Error GoTo Err_cmd_削除_Click

    '選択チェック
    If Trim(txt_社員コード) = "" Or IsNull(txt_社員コード) = True Then

    MsgBox "未選択。", _
    vbExclamation Or vbOKOnly, "エラー cmd_削除_Click"

    Exit Sub
    End If

    '既に使われている場合、拒否
    If F_MasterData_Usu_Check("社員コード", Trim(txt_社員コード), i_Umu) <> 0 Then

    Exit Sub
    Else

    If i_Umu <> 0 Then

    MsgBox "削除しようとしたマスタデータは、既に使われてるので、削除できません。", _
    vbExclamation Or vbOKOnly, "警告"

    Exit Sub
    End If

    End If


    If MsgBox("当データを削除します。いいですか?。", _
    vbInformation Or vbYesNo, "確認") = vbNo Then

    Exit Sub

    End If




    'deleate
    Set ct = Application.CurrentProject.Connection
    ct.BeginTrans




    '*******************************
    ''''' str_Sql = "Delete TM_社員マスタ.社員コード"
    ''''' str_Sql = str_Sql + " FROM TM_社員マスタ"
    ''''' str_Sql = str_Sql + " WHERE (((TM_社員マスタ.社員コード)='" & Trim(txt_社員コード) & "'));"
    '*******************************
    str_Sql = "Delete dbo_TM_社員マスタ.社員コード"
    str_Sql = str_Sql + " FROM dbo_TM_社員マスタ"
    str_Sql = str_Sql + " WHERE (((dbo_TM_社員マスタ.社員コード)='" & Trim(txt_社員コード) & "'));"
    '*******************************





    Debug.Print str_Sql

    ct.Execute str_Sql 'ここでロック開始

    ct.CommitTrans 'ここでロック解除

    ct.Close
    Set ct = Nothing


    Me.Requery
    ''''' Me.Refresh


    Err_cmd_削除_Click:
    If Err.Number <> 0 Then
    ct.RollbackTrans 'ここでロック解除

    ct.Close
    Set ct = Nothing

    MsgBox Err.Description & "(" & Err.Nimber & ")" & vbCrLf & _
    "削除できませんでした。" & vbCrLf & _
    "既にそのデータは削除されたか確認して下さい。" & vbCrLf & _
    "エラーコードとエラーメッセージを控えて下さい。(cmd_削除_Click)", _
    vbCritical Or vbOKOnly, "エラー cmd_削除_Click"

    End If
    End Sub

    '
    Private Sub cmd_修正_Click()
    Dim ct As New ADODB.Connection
    Dim RS As New ADODB.Recordset
    Dim str_filter As String
    Dim str_Sql As String

    Dim varBm As Variant 'バリアント型の変数を指定


    On Error GoTo Err_cmd_修正_Click

    '選択チェック
    If Trim(txt_社員コード) = "" Or IsNull(txt_社員コード) = True Then

    MsgBox "社員コード未入力。", _
    vbExclamation Or vbOKOnly, "エラー cmd_修正_Click"

    Exit Sub
    End If

    If Trim(txt_社員名) = "" Or IsNull(txt_社員名) = True Then

    MsgBox "社員名未入力。", _
    vbExclamation Or vbOKOnly, "エラー cmd_修正_Click"

    Exit Sub
    End If


    '入力チェック
    If Len(txt_社員コード) > 6 Then
    MsgBox "商品コードは6桁で入れてください。", _
    vbExclamation Or vbOKOnly, "エラー cmd_修正_Click"

    Exit Sub
    End If

    If str_Code <> Trim(txt_社員コード) Then
    MsgBox "社員コードは、キー項目なので、修正できません。", _
    vbExclamation Or vbOKOnly, "エラー cmd_修正_Click"

    Exit Sub
    End If



    If Len(txt_社員名) > 50 Then
    MsgBox "社員名は50桁以内で入れてください。", _
    vbExclamation Or vbOKOnly, "エラー cmd_修正_Click"

    Exit Sub
    End If


    If Trim(txt_備考) = "" Or IsNull(txt_備考) = True Then

    Else

    If Len(txt_備考) > 100 Then
    MsgBox "備考は100桁以内で入れてください。", _
    vbExclamation Or vbOKOnly, "エラー cmd_修正_Click"

    Exit Sub
    End If

    End If



    If InStr(Trim(txt_社員コード), "'") <> 0 Then
    MsgBox "シングルコーテーションは使わないでください。", _
    vbExclamation Or vbOKOnly, "エラー cmd_修正_Click"

    Exit Sub
    End If

    If InStr(Trim(txt_社員名), "'") <> 0 Then
    MsgBox "シングルコーテーションは使わないでください。", _
    vbExclamation Or vbOKOnly, "エラー cmd_修正_Click"

    Exit Sub
    End If

    If InStr(Trim(txt_備考), "'") <> 0 Then
    MsgBox "シングルコーテーションは使わないでください。", _
    vbExclamation Or vbOKOnly, "エラー cmd_修正_Click"

    Exit Sub
    End If





    If MsgBox("当マスタを修正します。" & vbCrLf & _
    "名称変更の場合は、使用しているデータも変わってしまいます。" & vbCrLf & _
    "いいですか?。", _
    vbInformation Or vbYesNo, "確認") = vbNo Then

    Exit Sub

    End If



    varBm = Me.Bookmark '現在レコードの情報を入れる



    'Update
    Set ct = Application.CurrentProject.Connection

    '同一名称チェック





    '*******************************
    ''''' RS.Open "TM_社員マスタ", ct, adOpenKeyset, adLockOptimistic
    '*******************************
    RS.Open "dbo_TM_社員マスタ", ct, adOpenKeyset, adLockOptimistic
    '*******************************





    ''''' str_filter = "商品名='" & Trim(txt_商品名) & "' and 備考='" & Trim(txt_備考) & "'"
    str_filter = "社員名='" & Trim(txt_社員名)
    str_filter = str_filter + "' and 備考='" & Trim(txt_備考)
    str_filter = str_filter + "'"

    RS.Filter = str_filter

    If RS.RecordCount <> 0 Then

    '同一名称あり
    RS.Close
    Set RS = Nothing

    ct.Close
    Set ct = Nothing

    MsgBox "既に同じ名称かつ同じ備考内容のデータが存在します。", _
    vbExclamation Or vbOKOnly, "注意"
    Exit Sub
    End If

    RS.Close
    Set RS = Nothing

    ct.BeginTrans





    '*******************************
    '''''' str_Sql = "UPDATE TM_社員マスタ SET "
    '''''' str_Sql = str_Sql + "TM_社員マスタ.社員名 = '" & Trim(txt_社員名) & "'"
    ''''''
    '''''' If Trim(txt_備考) = "" Or IsNull(txt_備考) = True Then
    '''''' str_Sql = str_Sql + ", TM_社員マスタ.備考 = ''"
    '''''' Else
    '''''' str_Sql = str_Sql + ", TM_社員マスタ.備考 = '" & Trim(txt_備考) & "'"
    '''''' End If
    ''''''
    '''''' str_Sql = str_Sql + " WHERE (((TM_社員マスタ.社員コード)='" & Trim(txt_社員コード) & "'));"
    '*******************************
    str_Sql = "UPDATE dbo_TM_社員マスタ SET "
    str_Sql = str_Sql + "dbo_TM_社員マスタ.社員名 = '" & Trim(txt_社員名) & "'"

    If Trim(txt_備考) = "" Or IsNull(txt_備考) = True Then
    str_Sql = str_Sql + ", dbo_TM_社員マスタ.備考 = ''"
    Else
    str_Sql = str_Sql + ", dbo_TM_社員マスタ.備考 = '" & Trim(txt_備考) & "'"
    End If

    str_Sql = str_Sql + " WHERE (((dbo_TM_社員マスタ.社員コード)='" & Trim(txt_社員コード) & "'));"
    '*******************************







    Debug.Print str_Sql

    ct.Execute str_Sql 'ここでロック開始

    ct.CommitTrans 'ここでロック解除

    ct.Close
    Set ct = Nothing


    Me.Requery
    '''' Me.Refresh



    Me.Bookmark = varBm '元のレコードに戻す




    txt_社員コード = ""
    txt_社員名 = ""
    txt_備考 = ""

    Err_cmd_修正_Click:
    If Err.Number <> 0 Then

    RS.Close
    Set RS = Nothing

    ct.RollbackTrans 'ここでロック解除

    ct.Close
    Set ct = Nothing

    MsgBox Err.Description & "(" & Err.Nimber & ")" & vbCrLf & _
    "修正できませんでした。" & vbCrLf & _
    "他の方が同じコードを修正中か、既にそのコードは削除されたか確認して下さい。" & vbCrLf & _
    "エラーコードとエラーメッセージを控えて下さい。(cmd_修正_Click)", _
    vbCritical Or vbOKOnly, "エラー cmd_修正_Click"

    End If
    End Sub

    キャンセル

  • 2017/12/20 22:56

    しばらく別業務に取り掛かっており、先に進める事ができませんでしたが、できましたので、ご報告と致します。
     
     あれから、SQL-ServerとAccessが入ったPCを初期化し、Access開発環境のみとSQL-Serverのみの2台にわけ、AccessVBAの前回記載した、SQL-Serverへの接続コードを削除して、試しました。
     この2台間では、VBA立ち上げ時にSQL-Serverへの接続IDとパスを聞かれる画面が立ち上がるだけで、問題なく稼働。
     そこで、もう1台用意し、Accessのランタイムを入れて、accdeで稼働させたところ、確かに稼働せず。
     
     まず、下記サイトからmsodcsql.msiをインストールし、当初忘れていたODBCの設定を施すことで、1台目と同じように稼働しました。
    https://www.microsoft.com/ja-JP/download/details.aspx?id=36434
     
     誠に申し訳ありません。
     当初ODBCの設定と申されて、ピンとこなかったのですが、20年近く前の記憶がふとよみがえり、そういうことかと冷や汗でございます。
     この程度の設定なら、数名程度しか使用しないので、設定は大した作業になりませんので、充分です。速度もリンクテーブルですが、最初のログイン時の接続が遅いくらいで、他は支障がありませんでした。
     
     ありがとうございます。

    キャンセル

0

まずは問題を切り分けるしかないんじゃないですか?

どこの関数の何の処理で落ちているのか判別するのが先決ですよね?

自分なら、デバッグモード(Public Const DebugMode As Boolean = True/False) を作り、
処理の要所要所で、デバッグモード時にログを出力するようにしておきますね。

環境で起こる障害は、デバッグが面倒なので、
初回で態勢を整えておいた方がベターかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/11 22:57

    ご回答ありがとうございます。
     落ちているのは、ここです。

    cnnS.Open "Provider=SQLOLE DB;" & _
    "Data Source=AAA\SQLEXPRESS;" & _
    "User ID=sa;" & _
    "Password=xxxx;" & _
    "Initial Catalog=YYY"
     
     ですので、エラー内容通り、接続の仕方が間違っているのですが、この書き方がわからないのです。

    キャンセル

  • 2017/12/12 09:33

    原因は全く分かりませんが、
    自分のツールと違う点を挙げてみますので、
    ご参考になれば幸いです。

    ・SQLOLEDB(半角スペース無し)
    ・設定の最後にも[;]を付けている
    (ここだと、"Initial Catalog=YYY;")

    後学の為に教えて頂きたいのですが、
    「Initial Catalog」は何の設定でしょうか?

    キャンセル

  • 2017/12/12 23:02

    再度のご回答ありがとうございます。
     明日明後日は別業務繁忙の為、コーディングは明後日で試してみます。
     
     まずは半角スペース削除、コロンですね。
     この落ちている個所は、書籍を参考にしましたので、Initial Catalogは、作成したDB名を指定するものと理解しております。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.87%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBA

    1555questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • SQL Server

    535questions

    SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

  • Access

    376questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。