2009-08-21 2 views
1

Использование строки соединения изOleDbConnection.Open() бросает «сообщение об ошибке доступных» сообщение об ошибке, прежде чем даже связаться с SQL Server

"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 (OleDbConnectionString Возведения, DataSourceWrapper & datasrcWrapper) в System.Data.OleDb.OleDbConnectionInternal..ctor (OleDbConnectionString конструк, подключение OleDbConnection)
на 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-адрес сервера с localhost на hkfjhuidhf, что является недопустимым, поэтому я предполагаю, что это проблема на сервере в отношении соединения/установки OleDb и/или MDAC.

Сервер - это 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()

Кто-нибудь есть какие-нибудь идеи? Я переустановил MDAC из файла inf, однако я прочитал несколько статей, на которых был указан SP2 MDAC 2.8 в отношении кода .Net.

Любой вход очень приветствуется.

+0

Вы используете SQL Server Express? – James

ответ

1

Похоже, что один или несколько компонентов OLEDB отсутствуют или сломаны.

Когда у меня была аналогичная проблема, я обнаружил, что переустановка MDAC не сработала - что-то, что первая установка предотвратила последующие переустановки от исправления недостающих ссылок/файлов.

Я закончил тем, что исправил его, используя RegMon, чтобы найти неисправные вызовы реестра, а затем сравнить ключи, по которым вызовы не удались на рабочем компьютере. Это даст вам указатель на отсутствующую DLL. Я закончил вручную перерегистрацию и редактирование записей в реестре для 5 или 6 DLL, прежде чем я заработал.

Возможно, стоит также запросить у сервера ошибку.

+0

Хорошее предложение re regmon - я дам ему –

+0

Это было довольно близко - filemon определил, что COMSVCS.dll был зарегистрирован в месте, где dll больше не присутствует. Копирование файла там заставило его работать. Никто не имеет понятия, почему он был удален, но мы все работаем сейчас - спасибо за все ваши ответы! –

0

При подключении к SQL вы должны использовать SqlClient:

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

Как уже отмечалось, попробуйте заменить источник данных параметров с "MyServer \ SQLExpress". Ошибка может возникнуть из-за того, что он не может найти экземпляр SQL.

+0

К сожалению, это не вариант, мы перешли от использования файлов MDB к размещению БД на сервере SQL из-за проблем с блокировкой с файлами доступа. Этот код отправлен и работает отлично на 99% наших клиентов, только один из них сообщает об ошибке. Я написал приведенный выше код, чтобы проверить проблему, однако мне нужно исправить основную проблему на сервере, а не исправлять код. –

 Смежные вопросы

  • Нет связанных вопросов^_^