连接字符串未正确初始化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操作,但那是另一回事。
感谢您的耐心等待。
似乎一个SqlConnection对象实例化,只适用于单个连接,即使关闭。通过使用相同的连接字符串创建第二个SqlConnection对象,并将其传递给第二个函数,它成功了。