OleDbConnection.Open()在联系SQL Server之前抛出“无错误消息可用”错误

时间:2009-08-21 10:37:47

标签: c# sql odbc oledb mdac

使用

的连接字符串
"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)   constr,DataSourceWrapper&   datasrcWrapper)at   System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString   constr,OleDbConnection连接)
  在   System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions   options,Object poolGroupProviderInfo,   DbConnectionPool池,DbConnection   拥有对象)   System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(的DbConnection   owningConnection,   DbConnectionPoolGroup poolGroup)at   System.Data.ProviderBase.DbConnectionFactory.GetConnection(的DbConnection   拥有连接)   System.Data.ProviderBase.DbConnectionClosed.OpenConnection(的DbConnection   outerConnection,DbConnectionFactory   connectionFactory)at   System.Data.OleDb.OleDbConnection.Open()

即使我将服务器URL从localhost更改为无效的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;
    }
}

这会在连接时出现。打开()

有没有人有任何想法?我从inf文件重新安装了MDAC,但是我已经阅读了一些关于.Net代码的MDAC 2.8 SP2的文章。

非常欢迎任何和所有的意见。

2 个答案:

答案 0 :(得分:1)

听起来有一个或多个OLEDB组件丢失或损坏。

当我遇到类似的问题时,我发现重新安装MDAC不起作用 - 第一次安装确实阻止了后续重新安装修复丢失的引用/文件。

我最后通过使用RegMon找到失败的注册表调用,然后将调用失败的键与工作机器进行比较来修复它。这将为您提供指向缺少的DLL的指针。在我开始工作之前,我最终手动重新注册和编辑5或6个DLL的注册表项。

也许值得在serverfault上询问。

答案 1 :(得分:0)

如果要连接到SQL,则应使用SqlClient:

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

如前所述,尝试使用“MyServer \ SQLExpress”替换您的数据源参数。可能发生错误,因为它无法找到SQL实例。