none
インストール可能な ISAM ドライバが見つかりませんでした。が実行時出力される。 RRS feed

  • 質問

  • いつも、参考にさせていただいております。市販のテキスト(基礎からのASO.NET p506)の.NETデータプロバイダーの例題をコピーし、実行したところ「インストール可能なISAMドライバがみつかりません」のメッセージが出力されてしまいます。Webで調べてみたのですが、解決方法がわかりません。ご教示お願いします。

    動作環境:Windos7 Ultimate、.net4.0,IIS7.0,ACCES2007,Visual Basic

    実行時のソースは下記のようです

    web.config

    <?xml version="1.0"?>

    <!--
      ASP.NET アプリケーションを構成する方法の詳細については、
      http://go.microsoft.com/fwlink/?LinkId=169433 を参照してください
      -->

    <configuration>
        <appSettings >
            <add key="Connection_Class_key" value="System.Data.OleDb"/>
            <add key ="Connection_String_key" value="Access_NorthWindConnectionString"/>
        </appSettings>
        <connectionStrings>
            <add name ="Access_NorthWindConnectionString" connectionString ="Provider=Microsoft.ACE.OLEDB.12.0;DataSource=C:\Users\naohiro\Documents\ノースウィンド 2007.accdb;"
                 providerName="System.data.OleDb"/>
        </connectionStrings>
        <system.web>
            <compilation debug="true" strict="false" explicit="true" targetFramework="4.0" />
        </system.web>

    </configuration>

    VBソース

    Imports System.Configuration
    Imports System.Data.Common
    Partial Class byProviderFactory
        Inherits System.Web.UI.Page

        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            If Not IsPostBack Then
                Dim Connection_Class_key As String = ConfigurationManager.AppSettings("Connection_Class_key").ToString()
                Dim Connection_String_key As String = ConfigurationManager.AppSettings("Connection_String_key").ToString()
                Dim factory As DbProviderFactory = DbProviderFactories.GetFactory(Connection_Class_key)
                Dim con As DbConnection = factory.CreateConnection()
                con.ConnectionString = ConfigurationManager.ConnectionStrings(Connection_String_key).ToString()
                Dim cmd As DbCommand = con.CreateCommand()
                cmd.CommandText = "Select 区分コード,区分名,説明 FROM 商品区分"
                Dim dr As DbDataReader
                con.Open()
                dr = cmd.ExecuteReader()
                GridView1.DataSource = dr
                GridView1.DataBind()
                dr.Close()
                con.Close()
            End If
        End Sub
    End Class

    以上

     


    わかばマーク
    2011年11月6日 14:30

回答

  • > ConfigurationManager.ConnectionStrings(Connection_String_key).ToString()

    のところは以下のようにするのが普通だと思いますが・・・
     
    WebConfigurationManager.ConnectionStrings(Connection_String_key).ConnectionString

    でも、中身が正しいかどうかはともかく、文字列自体は期待通り取得
    できているようですね。


    似たようなコードで検証してみましたが、問題は再現できませんでした。何
    が問題なのか今ある情報だけでは分かりません。

    参考に、検証に使ったコードをアップしておきますので、何が違うか見てく
    ださい。

    検証に使った Northwind 2007.accdb は以下のサイトからダウンロードして、
    アプリケーションルート直下の App_Data フォルダにコピーしました。

    Microsoft Access 2007 Forms, Reports, and Queries
    Links to Example Files
    http://www.mcfedries.com/Access2007Forms/examples.asp


    web.config の接続文字列(ウィザードで自動生成)

     

    <add name="Northwind2007" 
      connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=&quot;|DataDirectory|\Northwind 2007.accdb&quot;"
      providerName="System.Data.OleDb" />
    

    ,aspx ページ

     

     

    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Web.Configuration" %>
    <%@ Import Namespace="System.Data.Common" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    
        protected void Page_Load(object sender, EventArgs e)
        {
            string connString = 
                WebConfigurationManager.ConnectionStrings["Northwind2007"].ConnectionString;
            DbProviderFactory factory = 
                DbProviderFactories.GetFactory("System.Data.OleDb");
            DbConnection connection = factory.CreateConnection();
            connection.ConnectionString = connString;
            DbCommand command = connection.CreateCommand();
            command.CommandText = 
                "SELECT [ID], [Last Name], [First Name], [Job Title] FROM [Employees]";
            connection.Open();
            try
            {
                DbDataReader reader = command.ExecuteReader();
                GridView1.DataSource = reader;
                GridView1.DataBind();
                reader.Close();
            }
            finally
            {
                connection.Close();
            }            
        }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server">
            </asp:GridView>
        </div>
        </form>
    </body>
    </html>
    
    

     

     



    • 編集済み SurferOnWww 2011年11月7日 22:13 誤記訂正 App_Code --> App_Data
    • 回答としてマーク TasCal 2011年11月9日 14:54
    2011年11月7日 15:53

すべての返信

  • > ConfigurationManager.ConnectionStrings(Connection_String_key).ToString()

    ↑ これで接続文字列が正しく取得できているのでしょうか? 何か足りないようです
    が。

    方法 : Web.config ファイルから接続文字列を読み取る
    http://msdn.microsoft.com/ja-jp/library/ms178411.aspx

     

    2011年11月7日 12:14
  • 返答をいただきありがとうございます。

    下記のようにデバッグしてみました。接続文字列は正しくとれているように思いますが。

     con.ConnectionString = ConfigurationManager.ConnectionStrings(Connection_String_key).ToString()
                If Not (con.ConnectionString = Nothing) Then
                    Console.WriteLine("Northwind connection string = {0}", con.ConnectionString)→ "Provider=Microsoft.ACE.OLEDB.12.0;DataSource=C:\Users\naohiro\Documents\ノースウィンド 2007.accdb;" 
                Else
                    Console.WriteLine("No Northwind connection string")
                End If

    宜しくお願いします


    わかばマーク
    2011年11月7日 14:02
  • > ConfigurationManager.ConnectionStrings(Connection_String_key).ToString()

    のところは以下のようにするのが普通だと思いますが・・・
     
    WebConfigurationManager.ConnectionStrings(Connection_String_key).ConnectionString

    でも、中身が正しいかどうかはともかく、文字列自体は期待通り取得
    できているようですね。


    似たようなコードで検証してみましたが、問題は再現できませんでした。何
    が問題なのか今ある情報だけでは分かりません。

    参考に、検証に使ったコードをアップしておきますので、何が違うか見てく
    ださい。

    検証に使った Northwind 2007.accdb は以下のサイトからダウンロードして、
    アプリケーションルート直下の App_Data フォルダにコピーしました。

    Microsoft Access 2007 Forms, Reports, and Queries
    Links to Example Files
    http://www.mcfedries.com/Access2007Forms/examples.asp


    web.config の接続文字列(ウィザードで自動生成)

     

    <add name="Northwind2007" 
      connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=&quot;|DataDirectory|\Northwind 2007.accdb&quot;"
      providerName="System.Data.OleDb" />
    

    ,aspx ページ

     

     

    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Web.Configuration" %>
    <%@ Import Namespace="System.Data.Common" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    
        protected void Page_Load(object sender, EventArgs e)
        {
            string connString = 
                WebConfigurationManager.ConnectionStrings["Northwind2007"].ConnectionString;
            DbProviderFactory factory = 
                DbProviderFactories.GetFactory("System.Data.OleDb");
            DbConnection connection = factory.CreateConnection();
            connection.ConnectionString = connString;
            DbCommand command = connection.CreateCommand();
            command.CommandText = 
                "SELECT [ID], [Last Name], [First Name], [Job Title] FROM [Employees]";
            connection.Open();
            try
            {
                DbDataReader reader = command.ExecuteReader();
                GridView1.DataSource = reader;
                GridView1.DataBind();
                reader.Close();
            }
            finally
            {
                connection.Close();
            }            
        }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server">
            </asp:GridView>
        </div>
        </form>
    </body>
    </html>
    
    

     

     



    • 編集済み SurferOnWww 2011年11月7日 22:13 誤記訂正 App_Code --> App_Data
    • 回答としてマーク TasCal 2011年11月9日 14:54
    2011年11月7日 15:53
  • 「インストール可能な ISAM ドライバが見つかりませんでした。」というエラー
    になる問題が再現できました。

    質問者さんのアップした接続文字列をよ~く見てみれば DataSource となってお
    り Data と Source の間に半角スペースがありません。それが原因のようです。

    半角スペースを入れて Data Source としたら解決するのではないですか。試し
    てみてください。

     

    2011年11月9日 14:59
  • SuferOnWwwさん

    ご回答いただきありがとうございます。また解決例までご教示いただきありがとうございます。

    DBをApp_Dataにコピーし、Web.configを修正したら正しく動きました。そのあと、サーバエクスプローラの「接続の追加」を行い、プロパティの接続文字列とわたくしのソースの接続文字列を比較したところ、

    Data SouceとすべきところをDataSouceとしてあり、これが原因でした。実に初歩的な誤りでした。接続文字列の相違であれば「インスタンス・・・」のエラーが出ると思っていたのですが「ISAMドライバー・・・」のエラーが出たため遠回りしてしまいました。

    SuferOnWwwさんのご指摘は大変参考になりました。ありがとうございました。


    わかばマーク
    2011年11月9日 15:03