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

时间:2015-06-04 23:25:36

标签: c# sql-server

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

以下是有效的代码:

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属性尚未初始化。第241行的ProgramName.ClassName.populateClientHistoryDict(SqlConnection conn)等。(我在第二个函数中调用conn.Open()的行。

另外作为参考,我有另一个函数,我连接到db以查看它是否存在。它适用于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,只有两次。似乎没必要。虽然我将通过表格尽快对两个表格进行CRUD操作,但这是另一回事。

感谢您的耐心等待。

1 个答案:

答案 0 :(得分:0)

似乎一个SqlConnection对象实例化,只对单个连接有好处,即使关闭也是如此。通过使用相同的连接字符串创建第二个SqlConnection对象,并将其传递给第二个函数,它可以工作。