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

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

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

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

SQL Server

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

Access

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

Q&A

解決済

2回答

25013閲覧

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

tapion40

総合スコア8

VBA

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

SQL Server

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

Access

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

0グッド

2クリップ

投稿2017/12/10 15:06

初めて投稿致します。
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でなんとか実現したいと存じます。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

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

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

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

投稿2017/12/11 07:10

ExcelVBAer

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tapion40

2017/12/11 13:57

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

2017/12/12 00:33

原因は全く分かりませんが、 自分のツールと違う点を挙げてみますので、 ご参考になれば幸いです。 ・SQLOLEDB(半角スペース無し) ・設定の最後にも[;]を付けている (ここだと、"Initial Catalog=YYY;") 後学の為に教えて頂きたいのですが、 「Initial Catalog」は何の設定でしょうか?
tapion40

2017/12/12 14:02

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

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 06:32

編集2017/12/12 01:38
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tapion40

2017/12/11 14: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
tapion40

2017/12/20 13: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年近く前の記憶がふとよみがえり、そういうことかと冷や汗でございます。  この程度の設定なら、数名程度しか使用しないので、設定は大した作業になりませんので、充分です。速度もリンクテーブルですが、最初のログイン時の接続が遅いくらいで、他は支障がありませんでした。    ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問