连接字符串未正确初始化VSTO插件

本文关键字:初始化 VSTO 插件 字符串 连接 | 更新日期: 2023-09-27 17:53:22

我有两个访问本地数据库的方法。它们是相同的,除了一个访问一个表,另一个访问另一个表。表是一样的

下面是有效的代码:
public void populateClientDict(SqlConnection conn)
{
            Dictionary<string, string> clientDict = new Dictionary<string, string>();
            try
            {
                using (conn)
                {
                    SqlCommand command = new SqlCommand(
                      @"SELECT ClientDirName, ClientEmailDomain FROM ClientTable;",
                      conn);
                    conn.Open();
                    SqlDataReader reader = command.ExecuteReader();
                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            string clientDir = reader.GetString(0);
                            string clientEmail = reader.GetString(1);
                            clientDict.Add(clientEmail, clientDir);
                        }
                    }
                    else
                    {
                        MessageBox.Show("No rows found in ClientTable", "Rows Not Found", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    reader.Close();
                }
            }
            catch (InvalidOperationException ex)
            {
                MessageBox.Show(String.Format("Exception while accessing ClientTable: {0}", ex), "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (SqlException ex)
            {
                MessageBox.Show(String.Format("Exception while accessing ClientTable: {0}", ex), "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
}
下面是两个函数中conn参数的等价:SqlConnection conn = new SqlConnection(connString);和connString是private string connString = @"Server=.;User Id=cshenkan; Password=$henkan72;Database=ArchiveAddin";

不起作用的代码(直接在第一个函数之后调用):

public void populateClientHistoryDict(SqlConnection conn)
{
            Dictionary<string, string> clientHistoryDict = new Dictionary<string, string>();
            try
            {
                using (conn)
                {
                    SqlCommand command = new SqlCommand(
                      @"SELECT ClientDirName, ClientEmailDomain FROM ClientHistoryTable;",
                      conn);
                    conn.Open();
                    SqlDataReader reader = command.ExecuteReader();
                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            string clientDir = reader.GetString(0);
                            string clientEmail = reader.GetString(1);
                            clientHistoryDict.Add(clientEmail, clientDir);
                        }
                    }
                    else
                    {
                        MessageBox.Show("No rows found in ClientHistoryTable", "Rows Not Found", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    reader.Close();
                }
            }
            catch (InvalidOperationException ex)
            {
                MessageBox.Show(String.Format("Exception while accessing ClientHistoryTable: {0}", ex), "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (SqlException ex)
            {
                MessageBox.Show(String.Format("Exception while accessing ClientHistoryTable: {0}", ex), "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
}

我得到的异常是:
访问ClientHistoryTable: System时出现异常。InvalidOperationException: ConnectionString属性没有被初始化。等等,在ProgramName.ClassName。在第241行上populateClientHistoryDict(SqlConnection conn)。(调用conn.Open()的那一行;在第二个函数中

也供参考,我有另一个函数,我连接到数据库,看看它是否存在。它适用于ClientTable而不是ClientHistoryTable。为什么会这样?它们完全一样。

任何想法?我以前处理过错误,但从来没有当它是为一个表工作,而不是另一个。我不知道为什么我不会得到这个错误在第二次尝试到达一个表,而不是第一次。

感谢编辑:

奇怪的是,如果我把SqlConnection con = new SqlConnection(connString)populateClientHistoryDict()里面它工作。我用populateClientDict()做了同样的事情,它也起作用了,但它已经做到了。如果我将连接传递给这两个函数,但如果我在函数内部实例化连接,为什么它不起作用?一次访问数据库只能使用一个SqlConnection吗?通过在每个函数中添加连接字符串,我违反了DRY,但我无法让它使用以下代码:

SqlConnection conn = new SqlConnection(connString);
if (checkDatabaseExists())
{
    populateClientDict(conn);
    populateClientHistoryDict(conn);
}

第一个函数可以工作,但第二个不行。就像我说的,如果我移除参数并把连接对象放在函数里面它会工作的很好。为什么会这样?关于每次访问一个SqlConnection,我是否正确?如果我添加第二个SqlConnection conn2 = new SqlConnection(connString);,然后将其传递给populateClientHistoryDict(conn2),它再次工作,似乎我对每次使用一个连接对象是正确的。对吗?还是我弄错了?

下面是调用这些函数的工作代码:
SqlConnection conn = new SqlConnection(connString);
SqlConnection conn2 = new SqlConnection(connString);
if (checkDatabaseExists())
{
    populateClientDict(conn);
    populateClientHistoryDict(conn2);
}

似乎我已经回答了我自己的问题,但是反馈仍然会有很大帮助,我仍然会接受任何好的答案,重申我所说的并详细说明一点,或者纠正我所说的并详细说明一点。

我也可以问,这是一个巨大的交易,我不使用应用程序设置xml连接字符串和引用它们与ConfigurationManager?我只连接了一个DB,而且只有两次。似乎是不必要的。虽然我最终将通过Form对两个表执行CRUD操作,但那是另一回事。

感谢您的耐心等待。

连接字符串未正确初始化VSTO插件

似乎一个SqlConnection对象实例化,只适用于单个连接,即使关闭。通过使用相同的连接字符串创建第二个SqlConnection对象,并将其传递给第二个函数,它成功了。