2009-08-21 61 views
1

使用的OleDbConnection.Open()甚至聯繫SQL服務器

"Provider=SQLOLEDB;Data Source=localhost;User ID=foo;password=bar;Database=CodeLists;Pooling=true;Min Pool Size=20;Max Pool Size=30;" 

我得到以下堆棧跟蹤

System.Data連接字符串之前拋出一個「沒有錯誤消息可用」錯誤.OleDb.OleDbException:否提供 錯誤消息,結果代碼: -2147024770(0x8007007E)。在System.Data.OleDb.OleDbServicesWrapper.GetDataSource在 System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString 構造,OleDbConnection的連接)
(OleDbConnectionString 構造,DataSourceWrapper & datasrcWrapper)在 System.Data.OleDb。 OleDbConnectionFactory.CreateConnection(DbConnectionOptions 選項,對象poolGroupProviderInfo, 池類DBConnectionPool,的DbConnection owningObject)在在 System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(的DbConnection owningConnection, DbConnectionPoolGroup poolGroup)System.Data.ProviderBase.DbConnectionFactory.GetConnection(的DbConnection owningConnection)在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(的DbConnection outerConnection,DbConnectionFactory connectionFactory的)在 System.Data.OleDb.OleDbConnection.Open()

即使我將服務器URL從本地主機更改爲無效的hkfjhuidhf,我也會得到此錯誤,所以我認爲這是服務器上與OleDb連接/設置和/或MDAC有關的問題。

服務器是運行最新Service Pack的Windows Server 2003,MDAC是2.8 SP2。

我正在使用的代碼是:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void run_Click(object sender, EventArgs e) 
    { 
     output.Text = string.Empty; 
     try 
     { 
      OleDbConnection connection; 
      try 
      { 
       connection = new OleDbConnection(conString.Text); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Error creating connection"); 
       put(ex.ToString()); 
       return; 
      } 

      OleDbCommand command; 
      try 
      { 
       command = connection.CreateCommand(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Error creating command"); 
       put(ex.ToString()); 
       return; 
      } 

      command.CommandType = CommandType.Text; 
      command.CommandText = "select top 10 * from " + table.Text; 

      if (connection.State != ConnectionState.Open) 
       connection.Open(); 

      OleDbDataReader reader; 

      try 
      { 
       reader = command.ExecuteReader(); 

       if (reader.HasRows) 
       { 
        string @out = string.Empty; 
        while (reader.Read()) 
        { 
         for (int i = 0; i < reader.FieldCount; i++) 
         { 
          @out += reader[i] + ", "; 
         } 
        } 
        put(@out); 
       } 
       reader.Close(); 
      } 
      catch (Exception ex) 
      { 
       put(ex.ToString()); 
      } 
      finally 
      { 
       connection.Close(); 
      } 
     } 
     catch (Exception ex) 
     { 
      put(ex.ToString()); 
     } 

    } 

    private void put(string message) 
    { 
     output.Text += message+Environment.NewLine; 
    } 
} 

,並在connection.Open()

沒有人有任何想法,這屬於過?我已經從inf文件中重新安裝了MDAC,但是我已經閱讀了一些關於.Net代碼的文章,其中討論了關於MDAC 2.8的SP2。

任何和所有的輸入是非常值得歡迎的。

+0

您使用SQL Server Express嗎? – James 2009-08-21 10:45:23

回答

1

聽起來像一個或多個OLEDB組件丟失或損壞。

當我遇到類似的問題時,我發現重新安裝MDAC不起作用 - 第一次安裝會阻止後續重新安裝修復缺失的引用/文件。

我最終通過使用RegMon找到了失敗的註冊表調用,然後將調用失敗的密鑰與工作機器進行比較來修復它。這會給你一個指向缺少DLL的指針。在我開始工作之前,我最終手動重新註冊並編輯了5或6個DLL的註冊表項。

這也許值得在serverfault上詢問。

+0

好建議重新註冊 - 我會給它一個 – 2009-08-21 12:01:17

+0

這是非常接近 - filemon確定COMSVCS.dll註冊在一個位置,該DLL不再存在。在那裏複製文件使其工作。 沒有人知道它被刪除的原因,但我們現在都在運行 - 謝謝你的回覆! – 2009-08-21 14:31:51

0

如果您連接到SQL你應該使用的SqlClient:

var conn = new System.Data.SqlClient.SqlConnection(); 
conn.ConnectionString = connectionString; 
conn.Open(); 

正如已經建議,嘗試用 「的MyServer \ SQLExpress」 的形式代替您的數據源PARAM。該錯誤可能會發生,因爲它找不到SQL實例。

+0

不幸的是,這不是一個選項 - 由於Access文件的鎖定問題,我們從使用MDB文件轉移到SQL服務器上託管數據庫。此代碼已發貨並且在我們的99%的客戶中運行良好,只是其中一個出現錯誤。我已經編寫了上述代碼來驗證問題,但是我需要修復服務器上的基礎問題而不是修復代碼。 – 2009-08-21 11:03:02