none
VB.NET2003とSQLServerについて RRS feed

  • 質問

  • 初めましてBeginnerPRGと申します。長文になってしまいましたが、宜しくお願い致します。

    この度業務で利用するために、VB.NETの勉強を 始める事となりました。現在、社の方針としてVBはVB.NET2003を使用することになっており、VB.NET2003を使用しての開発環境を整えることになりました。

    私のPRG担当はSQLServerを利用したDBプログラミングです。SQLServerは無償版のSQLServer2005ExpressEditionを採用しています。

    現在は上記の開発環境を整えるべく、Microsoftの技術情報や本サイト及びその他サイトなどを調べ勉強しているのですが、次の問題にぶつかり、作業が滞り困っております。

     

    【構築したい開発環境】

    以下環境下でプログラミングを行うことで決定しています。

    VB.NET 2003                                    ・・・.NET Framework 1.1

    SQLServer2005ExpressEdition        ・・・.NET Framework 2.0



    【現在のPCにインストールした手順】

    ①VB.NET 2003のインストールを実施。この時.NET Framework1.1がインストールされたようです。

    ②次にNET Framework2.0をインストールしました。

    ③最後にSQLServer2005ExpressEditionをインストール。

     

    【質問①】

    VB.NET2003(.NET FrameWork1.1)とSQLServer2005ExpressEdition(.NET Framework2.0)の組み合わせで開発しても問題ないのでしょうか?それぞれ.NET Fremeworkのバージョンが異なるので運用時に問題がでるかもしれないと考えています。

    いろいろ調べてるのですがSQLServer2005ExpressEditionはVisualStudio2005と組み合わせた方がよいという技術情報しか見つけられませんでした。ご教授(可能であればこれら開発環境の組み合わせの技術情報が掲載されているサイト)をお願いします。

     

    【質問②】

    ◆バックアッププログラムの作成

    現在、VB.NET2003とSQLServer2005ExpressEditionの組み合わせ環境下で(試験的に)SQLServerのバックアップをプログラムから実行する処理を作成しています。

    ◆SQLServerの設定

    SQLServer2005ExpressEditionの互換レベルは2005にしています。

    ◆行ったこと

    このプログラミングにはSQLServerをバックアップするためのクラスライブラリ(?)の参照設定が必要ということでしたので、以下のDLLを参照しました。

    C:\Program Files\Microsoft SQL Server\80\Tools\Binn\SQLDMO.DLL

    しかしよくよく考えると互換レベルが2005になっているので、本来であれば2005のクラスライブラリ(DLL)を参照するのが正しいと思い、参照設定の変更しようと考えました。

    調べてみると以下の2005のクラスライブラリの登録が必要ということでしたので手順通りに追加を試みましたが、エラーが表示され、追加できません。

    ①Microsoft.SqlServer.Smo.DLL
    ②Microsoft.SqlServer.ConnectionInfo.DLL
    ③Microsoft.SqlServer.SqlEnum.DLL
    ④Microsoft.SqlServer.SmoEnum.DLL

    エラーは「'C:\Program Files Microsoft SQL Server\90\SDK\Assmblies\Micsoft.SqlServer.Smo.dll'への参照を追加できませんでした。これは有効なアセンブリまたはCOMコンポーネントではありません。拡張子が'dll'を持つアセンブリまたはCOMコンポーネントのみ参照することができます。ファイルがアクセス可能で、有効なアセンブリまたはCOMコンポーネントであることを確認してください。」と表示されました。他の②③④を参照追加しても同様のエラーが表示されます。

    ◆質問概要

    SQLServer2005の互換レベルが2005の時、SQLDMO.DLLの参照ではなく、Microsoft.SqlServer.Smo.DLL(他3ファイル)を参照しなければならないのでしょうか?

    またはそうであれば、上記のエラーはなぜ発生するのでしょうか?

     

    以上、質問①または②の回答のどちらでも構いませんのでご教授いただけると幸いです。どうぞ宜しくお願い致します。

     

     

     

     

    2009年2月2日 4:41

回答

  • BeginnerPRG の発言:

    【質問①】

    VB.NET2003(.NET FrameWork1.1)とSQLServer2005ExpressEdition(.NET Framework2.0)の組み合わせで開発しても問題ないのでしょうか?それぞれ.NET Fremeworkのバージョンが異なるので運用時に問題がでるかもしれないと考えています。

     SQL Server 2005とVB.NET 2005と相性が良いというのはADO.NETがらみでの事だと思われます。
     VB.NET 2003(.NET Framework 1.1)でSQL Serverにアクセスする場合、ADOを使ってアクセスすると思われるので特に問題はないです。

     また心配されている、運用時における.NET Frameworkのバージョンの混在ですが、必要な情報が実行ファイルに情報として記述されているので、これも問題はありません。(問題があるとすれば、必要なバージョンの.NET Frameworkがインストールされていない場合)

     SQL Server 2005 Express Editionで.NET Framework 2.0がインストールされた理由ですが、SQL Server 2005からSQLCLR等、SQL Server側で.NET Framework 2.0の機能を使用するため必要なためインストールされます。

     まあ、可能であるのであれば(サポート期間や技術情報の数などで)VB.NET 2005やVB.NET 2008で開発するのがベターだと思いますけど。


    BeginnerPRG の発言:

    【質問②】

    ◆バックアッププログラムの作成

    現在、VB.NET2003とSQLServer2005ExpressEditionの組み合わせ環境下で(試験的に)SQLServerのバックアップをプログラムから実行する処理を作成しています。

    ◆SQLServerの設定

    SQLServer2005ExpressEditionの互換レベルは2005にしています。

    ◆行ったこと

    このプログラミングにはSQLServerをバックアップするためのクラスライブラリ(?)の参照設定が必要ということでしたので、以下のDLLを参照しました。

    C:\Program Files\Microsoft SQL Server\80\Tools\Binn\SQLDMO.DLL

    しかしよくよく考えると互換レベルが2005になっているので、本来であれば2005のクラスライブラリ(DLL)を参照するのが正しいと思い、参照設定の変更しようと考えました。

    調べてみると以下の2005のクラスライブラリの登録が必要ということでしたので手順通りに追加を試みましたが、エラーが表示され、追加できません。

    ①Microsoft.SqlServer.Smo.DLL
    ②Microsoft.SqlServer.ConnectionInfo.DLL
    ③Microsoft.SqlServer.SqlEnum.DLL
    ④Microsoft.SqlServer.SmoEnum.DLL

    エラーは「'C:\Program Files Microsoft SQL Server\90\SDK\Assmblies\Micsoft.SqlServer.Smo.dll'への参照を追加できませんでした。これは有効なアセンブリまたはCOMコンポーネントではありません。拡張子が'dll'を持つアセンブリまたはCOMコンポーネントのみ参照することができます。ファイルがアクセス可能で、有効なアセンブリまたはCOMコンポーネントであることを確認してください。」と表示されました。他の②③④を参照追加しても同様のエラーが表示されます。

    ◆質問概要

    SQLServer2005の互換レベルが2005の時、SQLDMO.DLLの参照ではなく、Microsoft.SqlServer.Smo.DLL(他3ファイル)を参照しなければならないのでしょうか?

    またはそうであれば、上記のエラーはなぜ発生するのでしょうか?

     (2)の方ですがADOのExecuteメソッドでSQL ServerのBACKUP DATABASEコマンドを実行すれば良いような気がします。
     この場合は、ADOのみで操作するため、SQLDMOを使用する必要はありません。
    ※テーブルの内容をCSV等でエクスポートするなら別ですが、どのようにバックアップを行うのかわかりませんので。

     こんな回答でよかったでしょうか?
    • 回答としてマーク BeginnerPRG 2009年2月12日 0:43
    2009年2月3日 9:25
  • やっとWindows XP + SQL Server 2005 Express Edition + Visual Studio 2003の環境ができました。
    (遅くなって済みません)

    Transact-SQLのコマンドを実行するだけなら、以下のコードで実現できます。
    (画面は、フォームにボタンを一つ貼り付けただけの画面です)
    Imports System.Data  
    Imports System.Data.SqlClient  
     
    Public Class Form1  
        Inherits System.Windows.Forms.Form  
     
     
        Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click  
     
            Try 
                Dim conn As New SqlConnection  
                conn.ConnectionString = "Data Source=.\SQLEXPRESS;database=Northwind;Integrated Security=SSPI" 
                conn.Open()  
     
                Dim cmd As New SqlCommand("BACKUP DATABASE Northwind TO DISK='C:\TEMP\Northwind.bak'")  
                cmd.Connection = conn  
                cmd.ExecuteNonQuery()  
     
                conn.Close()  
            Catch ex As Exception  
                Debug.WriteLine(ex.StackTrace)  
            End Try 
        End Sub 
    End Class 

     簡単に説明しますと、SqlConnectionでデータベースと接続し、SqlCommandに実行するコマンド(BACKUP DATABASE)を指定してインスタンスを生成します。
     今回はバックアップなので結果を取得する必要はありませんのでExecuteNonQuery()でバックアップを行います。

     個人的にはSQLDMOはあまり使わない方がいいと思います。
    (SQL Serverのバージョンの違いで動かなくなるような。未確認ですが)

     以上、参考になりましたでしょうか?
    • 回答としてマーク BeginnerPRG 2009年2月12日 0:43
    2009年2月10日 14:15
  •  確認したいことがあるのですが、どのようなBACKUPを望んでいるのでしょうか?
    例えば、
     ・SQL ServerでのBACKUP DATABASEコマンドによるバックアップ。
     ・各テーブルをCSV等にエクスポートして、それを圧縮。
     ・その他。
    が考えられますが、おそらくは(1)~(5)のDLLは参照設定を行う必要はありません。

    あと、「C:\Program Files\Microsoft SQL Server\80\Tools\Binn\SQLDMO.DLL」を参照設定しようとしているようですが、同じコンピュータにSQL Server 2000(もしくはMSDE)がインストールされていませんか?
    SQLDMOは、(互換性レベルを変更しても)使用するSQL Serverと同一バージョンのものを使用しないとエラーになります。
    ※"80"はSQL Server 2000です。

    ちなみにですが、手元の環境はVisual Studio 2005/2008でSQL Server 2008なので環境が違いますが、(1)~(5)を参照設定しても、特にエラーは発生しませんでした。

    もしアレでしたら、仮想環境にVisual Studio 2003をインストールして、BACKUPのサンプルを作成してみます。
    (環境を作る必要があるので、少し時間をください)

    ついでといってはなんですが、「300 秒でズバリ !!」 & 「10 行でズバリ !!」にADO.NETに関する資料が乗っているので参考にしてはどうでしょうか?
    http://www.microsoft.com/japan/msdn/thisweek/wednesday/
    • 回答としてマーク BeginnerPRG 2009年2月12日 0:43
    2009年2月4日 17:54

すべての返信

  • BeginnerPRG の発言:

    【質問①】

    VB.NET2003(.NET FrameWork1.1)とSQLServer2005ExpressEdition(.NET Framework2.0)の組み合わせで開発しても問題ないのでしょうか?それぞれ.NET Fremeworkのバージョンが異なるので運用時に問題がでるかもしれないと考えています。

     SQL Server 2005とVB.NET 2005と相性が良いというのはADO.NETがらみでの事だと思われます。
     VB.NET 2003(.NET Framework 1.1)でSQL Serverにアクセスする場合、ADOを使ってアクセスすると思われるので特に問題はないです。

     また心配されている、運用時における.NET Frameworkのバージョンの混在ですが、必要な情報が実行ファイルに情報として記述されているので、これも問題はありません。(問題があるとすれば、必要なバージョンの.NET Frameworkがインストールされていない場合)

     SQL Server 2005 Express Editionで.NET Framework 2.0がインストールされた理由ですが、SQL Server 2005からSQLCLR等、SQL Server側で.NET Framework 2.0の機能を使用するため必要なためインストールされます。

     まあ、可能であるのであれば(サポート期間や技術情報の数などで)VB.NET 2005やVB.NET 2008で開発するのがベターだと思いますけど。


    BeginnerPRG の発言:

    【質問②】

    ◆バックアッププログラムの作成

    現在、VB.NET2003とSQLServer2005ExpressEditionの組み合わせ環境下で(試験的に)SQLServerのバックアップをプログラムから実行する処理を作成しています。

    ◆SQLServerの設定

    SQLServer2005ExpressEditionの互換レベルは2005にしています。

    ◆行ったこと

    このプログラミングにはSQLServerをバックアップするためのクラスライブラリ(?)の参照設定が必要ということでしたので、以下のDLLを参照しました。

    C:\Program Files\Microsoft SQL Server\80\Tools\Binn\SQLDMO.DLL

    しかしよくよく考えると互換レベルが2005になっているので、本来であれば2005のクラスライブラリ(DLL)を参照するのが正しいと思い、参照設定の変更しようと考えました。

    調べてみると以下の2005のクラスライブラリの登録が必要ということでしたので手順通りに追加を試みましたが、エラーが表示され、追加できません。

    ①Microsoft.SqlServer.Smo.DLL
    ②Microsoft.SqlServer.ConnectionInfo.DLL
    ③Microsoft.SqlServer.SqlEnum.DLL
    ④Microsoft.SqlServer.SmoEnum.DLL

    エラーは「'C:\Program Files Microsoft SQL Server\90\SDK\Assmblies\Micsoft.SqlServer.Smo.dll'への参照を追加できませんでした。これは有効なアセンブリまたはCOMコンポーネントではありません。拡張子が'dll'を持つアセンブリまたはCOMコンポーネントのみ参照することができます。ファイルがアクセス可能で、有効なアセンブリまたはCOMコンポーネントであることを確認してください。」と表示されました。他の②③④を参照追加しても同様のエラーが表示されます。

    ◆質問概要

    SQLServer2005の互換レベルが2005の時、SQLDMO.DLLの参照ではなく、Microsoft.SqlServer.Smo.DLL(他3ファイル)を参照しなければならないのでしょうか?

    またはそうであれば、上記のエラーはなぜ発生するのでしょうか?

     (2)の方ですがADOのExecuteメソッドでSQL ServerのBACKUP DATABASEコマンドを実行すれば良いような気がします。
     この場合は、ADOのみで操作するため、SQLDMOを使用する必要はありません。
    ※テーブルの内容をCSV等でエクスポートするなら別ですが、どのようにバックアップを行うのかわかりませんので。

     こんな回答でよかったでしょうか?
    • 回答としてマーク BeginnerPRG 2009年2月12日 0:43
    2009年2月3日 9:25
  • CatTail様(及び他の皆様方)

    ご投稿ありがとうございます。

    ご指導の内容について調べていたため返信が遅れました。申し訳ありません。

     SQL Server 2005とVB.NET 2005と相性が良いというのはADO.NETがらみでの事だと思われます。
     VB.NET 2003(.NET Framework 1.1)でSQL Serverにアクセスする場合、ADOを使ってアクセスすると思われるので特に問題はないです。

    実は今回のプログラミングは既存のプログラムの改良作業です。SQLServerについても初心者であるため、ADOとADO.NETの違いについては全くの無知です。前担当にも聞きましたが分からないそうです。このため、いろいろ調べながらプログラムを見ているのですが、未だプログラミングがADOかADO.NETなのか分かっておりません。もう少し調べてみます。ただ、渡された参考書がADO.NETによるプログラミングの本であるため、ADO.NETでプログラミングしていると思われます。

    どちらにせよ、以下のご回答で.NET Frameworkのバージョンの混在は問題ないと言うことですから、VB.NET2003とSQLServer2005ExpressEdition(ADO.NET)であっても問題ないと理解しました。

     

     また心配されている、運用時における.NET Frameworkのバージョンの混在ですが、必要な情報が実行ファイルに情報として記述されているので、これも問題はありません。(問題があ
    るとすれば、必要なバージョンの.NET Frameworkがインストールされていない場合)
     SQL Server 2005 Express Editionで.NET Framework 2.0がインストールされた理由ですが、SQL Server 2005からSQLCLR等、SQL Server側で.NET Framework 2.0の機能を使用するため必要なためインストールされます。

    実行ファイル(.EXE)が利用する.NET Frameworkのバージョン(今回の例では1.1)は、実行ファイル内に記述されており、実行時にアプリケーションは自身の記述情報である.NET Frameworkのバージョンを調べ(又はWindowsが調べてくれて).NET Framework1.1が利用(適用)される。これに対し、SQLServerは自身がSQLCLR等を内包しており、.NET Frameworkのバージョンも管理されていて、SQLの処理(実行時)には.NET Framework2.0が利用される?と理解しました。

    以上の点から.NET Frameworkのバージョンの混在は問題ないと言うことで理解しました。

    ちなみに、今回の.NET Frameworkの混在を調べる事になったのは、今までは開発環境のPCで動作していたため、あまり問題視していませんでしたが、他のPCへインストールする事になったため、調べております。

      

      まあ、可能であるのであれば(サポート期間や技術情報の数などで)VB.NET 2005やVB.NET 2008で開発するのがベターだと思いますけど。

     私もそう思うのですが、諸事情により今回の開発だけはVB.NET2003を利用しなければなりません。次回のプログラミングからはVB.NET2005、2008(2010?)を利用したいと思っています。

      

     (2)の方ですがADOのExecuteメソッドでSQL ServerのBACKUP DATABASEコマンドを実行すれば良いような気がします。
     この場合は、ADOのみで操作するため、SQLDMOを使用する必要はありません。
    ※テーブルの内容をCSV等でエクスポートするなら別ですが、どのようにバックアップを行うのかわかりませんので。

    先の通り、ADOとADO.NETの違いを調べ、ADOでのプログラミングであればご指導の内容を調査し、対応したいと考えています。

     

    以上の理解で間違いないかご指導いただけないでしょうか?



     

    2009年2月4日 5:36
  • CatTail様(及び他の皆様方)

    ADO.NETプログラミング書を見たところ、ADO.NETプログラミングの特徴?としては.NET データプロバイダ(コネクションとデータアダプタ)とデータセットを利用することがわかりました。ADOプログラミングではどちらのコンポーネントも利用できない事もわかりました。(多分ですが?)

    この事をふまえて、現行プログラムを見ていくと、コネクションとデータアダプタ及びデータセットが利用されていましたので、ADO.NETを採用したプログラムであることが分かりました。

    このため再度質問いたします。(2009年2月2日投稿分より抜粋)
    【質問概要】
    SQLServerで管理しているデータベースの中から、指定したデータベースのバックアップを行うプログラムをVB.NET2003で作成したい。

    ◆開発環境

    VB.NET2003とSQLServer2005ExpressEdition

    ◆SQLServerの設定

    SQLServer2005ExpressEditionの互換レベルは2005にしています。

    ◆行ったこと

    このプログラミングにはSQLServerをバックアップするためのクラスライブラリ(?)の参照設定が必要ということでしたので、以下のDLLを参照しました。

    C:\Program Files\Microsoft SQL Server\80\Tools\Binn\SQLDMO.DLL

    しかしよくよく考えると互換レベルが2005になっているので、本来であれば2005のクラスライブラリ(DLL)を参照するのが正しいと思い、参照設定の変更しようと考えました。

    調べてみると以下の2005のクラスライブラリの登録が必要ということでしたので手順通りに追加を試みましたが、エラーが表示され、追加できません。

    ①Microsoft.SqlServer.Smo.DLL
    ②Microsoft.SqlServer.ConnectionInfo.DLL
    ③Microsoft.SqlServer.SqlEnum.DLL
    ④Microsoft.SqlServer.SmoEnum.DLL

    エラーは「'C:\Program Files Microsoft SQL Server\90\SDK\Assmblies\Micsoft.SqlServer.Smo.dll'への参照を追加できませんでした。これは有効なアセンブリまたはCOMコンポーネントではありません。拡張子が'dll'を持つアセンブリまたはCOMコンポーネントのみ参照することができます。ファイルがアクセス可能で、有効なアセンブリまたはCOMコンポーネントであることを確認してください。」と表示されました。他の②③④を参照追加しても同様のエラーが表示されます。

    ◆質問

    SQLServer2005の互換レベルが2005の時、SQLDMO.DLLの参照ではなく、Microsoft.SqlServer.Smo.DLL(他3ファイル)を参照しなければならないのでしょうか?

    またはそうであれば、上記のエラーはなぜ発生するのでしょうか?

     

    以上、ご指導のほど宜しくお願い致します。

     
    2009年2月4日 9:21
  •  確認したいことがあるのですが、どのようなBACKUPを望んでいるのでしょうか?
    例えば、
     ・SQL ServerでのBACKUP DATABASEコマンドによるバックアップ。
     ・各テーブルをCSV等にエクスポートして、それを圧縮。
     ・その他。
    が考えられますが、おそらくは(1)~(5)のDLLは参照設定を行う必要はありません。

    あと、「C:\Program Files\Microsoft SQL Server\80\Tools\Binn\SQLDMO.DLL」を参照設定しようとしているようですが、同じコンピュータにSQL Server 2000(もしくはMSDE)がインストールされていませんか?
    SQLDMOは、(互換性レベルを変更しても)使用するSQL Serverと同一バージョンのものを使用しないとエラーになります。
    ※"80"はSQL Server 2000です。

    ちなみにですが、手元の環境はVisual Studio 2005/2008でSQL Server 2008なので環境が違いますが、(1)~(5)を参照設定しても、特にエラーは発生しませんでした。

    もしアレでしたら、仮想環境にVisual Studio 2003をインストールして、BACKUPのサンプルを作成してみます。
    (環境を作る必要があるので、少し時間をください)

    ついでといってはなんですが、「300 秒でズバリ !!」 & 「10 行でズバリ !!」にADO.NETに関する資料が乗っているので参考にしてはどうでしょうか?
    http://www.microsoft.com/japan/msdn/thisweek/wednesday/
    • 回答としてマーク BeginnerPRG 2009年2月12日 0:43
    2009年2月4日 17:54
  • CalTail様

    ご回答ありがとうござました。
    CatTail の発言:

     確認したいことがあるのですが、どのようなBACKUPを望んでいるのでしょうか?
    例えば、
     ・SQL ServerでのBACKUP DATABASEコマンドによるバックアップ。
     ・各テーブルをCSV等にエクスポートして、それを圧縮。
     ・その他。
    が考えられますが、おそらくは(1)~(5)のDLLは参照設定を行う必要はありません。

    の事だと思いますが。データベースに格納されてるテーブルとビューをバックアップし、必要に応じてテーブルとビューをレストア(復元)します。このため、「BAKUP DATABASEコマンドによるバックアップ」が良いと考えています。ちなみに(1)~(5)とありますが、①~④のDLLは参照設定を行う必要なないと理解してよいでしょうか?

    CatTail の発言:

    あと、「C:\Program Files\Microsoft SQL Server\80\Tools\Binn\SQLDMO.DLL」を参照設定しようとしているようですが、同じコンピュータにSQL Server 2000(もしくはMSDE)がインストールされていませんか?
    SQLDMOは、(互換性レベルを変更しても)使用するSQL Serverと同一バージョンのものを使用しないとエラーになります。
    ※"80"はSQL Server 2000です。

    今回の開発環境はOSから新規にインストールしなおして構築しました。この時SQLServer2000及びMSDEをインストールした記憶はないのですが...明日、念のため、再度環境を構築しなおしてみます。

    ちなみにですが、手元の環境はVisual Studio 2005/2008でSQL Server 2008なので環境が違いますが、(1)~(5)を参照設定しても、特にエラーは発生しませんでした。
    もしアレでしたら、仮想環境にVisual Studio 2003をインストールして、BACKUPのサンプルを作成してみます。
    (環境を作る必要があるので、少し時間をください)

    お時間が許されるのであれば、甘えてもよいでしょうか...

    ついでといってはなんですが、「300 秒でズバリ !!」 & 「10 行でズバリ !!」にADO.NETに関する資料が乗っているので参考にしてはどうでしょうか?
    http://www.microsoft.com/japan/msdn/thisweek/wednesday/

    情報ありがとうございます。参考にしてみます。


    以上、よろしくお願い致します。








    2009年2月5日 13:02
  • CatTal様(他の皆様方)

    【お礼】

    ご指導頂きました「300 秒でズバリ !!」 & 「10 行でズバリ !!」拝見しました。私のような初心者でも概念の理解はできました。ここで理解した基礎をもとに、適当な参考書を買い、今勉強しています。ありがとうございました。

     

    【質問】

    SQL Server 2005 Express Editionを再度インストールしてみました。手順としては、次の通りです。

    (1)プログラムの追加と削除で確認しましたが、MSDEについては登録されていませんでした。

    (2)プログラムの追加と削除で「Microsoft SQL ~」と名の付いているものを全て削除しました。

    (3)Program Fileds\Microsoft SQL Serverフォルダを削除しました。

    (4)SQL Server 2005 Express Edition with Advanced Servicesをインストールしました。

    確認したところやはり「80」フォルダは作成され、C:\Program Files\Microsoft SQL Server\80\Tools\Binn\SQLDMO.DLLが存在しています。疑問に思いデータベースの互換レベルを確認したところ、SQL2000(80)になっておりました。話しを聞いてみると前任者がSQL2000とったデータベースのバックアップを復元した時に、互換レベルが変わったようです。

    このため、バックアップの方法としてはSQLDMO.DLLを利用する方法で良いと考え、以下のプログラムを組み、動作確認しています。一応バックアップは取れているようですが(トランザクションログは取れてないようですが...)、スペース文字を含んだフォルダを指定すると、エラーが発生してバックアップが正常に取れません。何かお分かりになるでしょうか?

     Private Sub btnBuckUp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuckUp.Click
            Dim objServer As New SQLDMO.SQLServer
            Dim BackupObj As New SQLDMO.Backup
            Dim strPath   As String

            Try
                With SaveFileDialog1
                    .OverwritePrompt = True
                    .Filter = "バックアップファイル(*.bak)|*.bak"

                    '-----ダイアログ表示-----
                    If .ShowDialog = DialogResult.OK Then
                        '保存先のパス
                        strPath = .InitialDirectory & "\" & .FileName
                        'システムとの接続を確立する
                        objServer.LoginSecure = True
                        objServer.Connect(SystemInformation.ComputerName() & "\SQLEXPRESS", "sa", "password")
                        BackupObj.Database = "Test"
                        BackupObj.Files = Mid(strPath, 2)
                        '既存上書き
                        BackupObj.Initialize = False
                        BackupObj.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database
                        'バックアップを実行する
                        BackupObj.SQLBackup(objServer)
                        MessageBox.Show("バックアップが正常に終了しました。", "バックアップ完了", _
                                        MessageBoxButtons.OK, MessageBoxIcon.Information)
                    End If
                End With
            Catch ex As Exception
                MessageBox.Show(ex.Message, "バックアップエラー", MessageBoxButtons.OK, MessageBoxIcon.Hand)
                Exit Sub
            End Try
        End Sub

     

    ご教示いただければ幸いです。以上、宜しくお願い致します。

     

    2009年2月9日 11:02
  • やっとWindows XP + SQL Server 2005 Express Edition + Visual Studio 2003の環境ができました。
    (遅くなって済みません)

    Transact-SQLのコマンドを実行するだけなら、以下のコードで実現できます。
    (画面は、フォームにボタンを一つ貼り付けただけの画面です)
    Imports System.Data  
    Imports System.Data.SqlClient  
     
    Public Class Form1  
        Inherits System.Windows.Forms.Form  
     
     
        Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click  
     
            Try 
                Dim conn As New SqlConnection  
                conn.ConnectionString = "Data Source=.\SQLEXPRESS;database=Northwind;Integrated Security=SSPI" 
                conn.Open()  
     
                Dim cmd As New SqlCommand("BACKUP DATABASE Northwind TO DISK='C:\TEMP\Northwind.bak'")  
                cmd.Connection = conn  
                cmd.ExecuteNonQuery()  
     
                conn.Close()  
            Catch ex As Exception  
                Debug.WriteLine(ex.StackTrace)  
            End Try 
        End Sub 
    End Class 

     簡単に説明しますと、SqlConnectionでデータベースと接続し、SqlCommandに実行するコマンド(BACKUP DATABASE)を指定してインスタンスを生成します。
     今回はバックアップなので結果を取得する必要はありませんのでExecuteNonQuery()でバックアップを行います。

     個人的にはSQLDMOはあまり使わない方がいいと思います。
    (SQL Serverのバージョンの違いで動かなくなるような。未確認ですが)

     以上、参考になりましたでしょうか?
    • 回答としてマーク BeginnerPRG 2009年2月12日 0:43
    2009年2月10日 14:15
  • CatTail様

    おはようございます。誠にお忙しい中、ありがとうございました。感謝しております。

    ものすごく参考になりました。バージョンの問題については考えておりませんでした。確かにシステムの性質上バージョンアップは必要不可欠であるため、その時の事を考えれば、SQLDMO.DLLの利用は避ける事にしました。

    大変申し訳ありません。作業の都合上、ご教示頂いたソースの動作点検はどうしても本日行う事ができません。明日行ってみます。
    この方法であればスペースを含んだフォルダ指定の問題もクリアされる(?)かもしれないとも考えております。

    結果はまた報告しますので、今暫くお待ちください。

    以上、宜しくお願い致します。
    2009年2月12日 0:38
  • CatTail様

    お教え頂いたソースで実行したところ、問題なくバックアップがとれました。
    確認のため、ManagementStudioExpressでデータベースの復元を実行したところ成功しました。
    ありがとうございます。

    一応RESTOREについてもテストを行ってみましたが、以下ソースコードでRESTOREに失敗します。
    何かお分かりになりますでしょうか?


    Imports System.Data     
    Imports System.Data.SqlClient     
        
    Public Class Form1     
        Inherits System.Windows.Forms.Form     
        
        
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click     
        
            Try    
                Dim conn As New SqlConnection     
                conn.ConnectionString = "Data Source=.\SQLEXPRESS;database=Northwind;Integrated Security=SSPI"    
                conn.Open()     
        
                Dim cmd As New SqlCommand("RESTORE DATABASE Northwind FROM DISK='C:\TEMP\Northwind.bak' WITH REPLACE")     
                cmd.Connection = conn     
                cmd.ExecuteNonQuery()     
        
                conn.Close()     
            Catch ex As Exception     
                Debug.WriteLine(ex.StackTrace)     
            End Try    
        End Sub    
    End Class    
     

    以上、宜しくお願いいたします。
    2009年2月13日 4:00
  • CatTail様

    RESTOREしたデータを検証するための点検システムを作成していたたため、報告が遅れました。お詫びいたします。
    結論から言いますと、BACKUP及びRESTOREに成功しました。

    先に報告したRESTOREのエラーですが、ご指導いただきましたプログラムコードを分析したところ、「Integrated Security=SSPI」がWindows認証であることに気づきました。現在SQL認証を採用しているため、この部分を「Integrated Security=false;User ID=<ユーザID>;Password=<パスワード>」に変更したところ、RESTOREが行えました。

    他にも1点Timeoutエラーが発生したので、
                cmd.CommandTimeout = 300
                cmd.Connection = conn
                cmd.ExecuteNonQuery()
    のようにTimeout時間を300秒に設定したところ、回避できました。


    CatTail様には貴重なお時間を頂き、感謝しております。以上、ありがとうございました。
    2009年2月17日 9:37