假设我使用正确的凭据调用以下方法:
private bool Connect(string username, string password)
{
string CONNSTRING = "Provider = MSDAORA; Data Source = ISDQA; User ID = {0}; Password = {1};";
OleDbConnection conn = new OleDbConnection();
string strCon = string.Format(CONNSTRING, username, password);
conn.ConnectionString = strCon;
bool isConnected = false;
try
{
conn.Open();
if (conn.State.ToString() == "Open")
isConnected = true;
}//try
catch (Exception ex)
{
lblErr.Text = "Connection error";
}//catch
finally
{
conn.Close();
}//finally
return isConnected;
}
我已经在下面的方法中成功打开了连接:
private bool ValidateUserCode(string usercode)
{
UserAccountDefine def = new UserAccountDefine();
UserAccountService srvc = new UserAccountService();
UserAccountObj obj = new UserAccountObj();
bool returnVal = false;
bool isValid = Connect(def.DB_DUMMY_USERCODE, def.DB_DUMMY_PASSWORD);
if (isValid)
{
obj.SQLQuery = string.Format(def.SQL_LOGIN, usercode.ToLower(), DateTime.Now.ToString("MM/dd/yyy"));
DataTable dt = srvc.Execute(obj, CRUD.READALL);
if (dt.Rows.Count == 1)
{
returnVal = true;
}
}
return returnVal;
}
问题是如何在ValidateUserCode()
方法中确定连接状态?
我怎么能在之后关闭它?
注意:
我在UserAccountDefine();
中明确声明了字符串变量,因此您不必担心这一点。
我已尝试在OleDbConnection conn
内声明新的ValidateUserCode()
,但conn.State
始终返回"Closed"
。
更新
我有一个具有2层安全功能的系统。第一个是应用程序,第二个是数据库。如果用户登录到应用程序,则用户名和密码也用于将他/她登录到数据库。现在,情况是当用户忘记了他/她的密码时,我们无法确定用户的fullname
,email
和contact
(在数据库中维护)。我只知道他的usercode
。要确定联系人详细信息,我必须使用DUMMY_ACCOUNT
打开活动连接。
请注意,我从不在数据库中维护密码。
答案 0 :(得分:1)
我不确定这些信息对您有何帮助。
使用OLEDB连接进行Excel阅读时遇到类似问题。我不知道答案。所以,我刚刚为OleDbConnection添加了一个全局变量,初始化为null。
在我的方法中,我曾经检查过null,如果没有关闭它并再次打开它。
if (con != null)
{
con.Close();
con.Dispose();
}
try
{
con = new OleDbConnection(connectionString);
}
catch (Exception ex)
{
MessageBox.Show("oledbConnection = " + ex.Message);
}
try
{
con.Open();
}
catch (Exception ex)
{
MessageBox.Show("connection open = " + ex.Message + "\n");
}
我可以在此之后继续。你可以尝试,如果它对你有用它的好处!
答案 1 :(得分:1)
首先,您在Close()
块中调用finally
,这意味着在第二种方法的任何一点,连接都将被关闭。此外,即使您不Close()
,因为conn
是Connect()
中的本地变量,当您回到ValidateUserCode()
时,连接垃圾收集已经开始了,当它Dispose()
时,它也会自动关闭。
我建议您将其设为成员,将其作为out参数传递,通过Connect()
方法返回(并返回null
表示失败,或者等等,如果您不这样做像例外)..或重新设计代码。
private OleDbConnection Connect(string username, string password)
{
string CONNSTRING = "Provider = MSDAORA; Data Source = ISDQA; User ID = {0}; Password = {1};";
OleDbConnection conn = new OleDbConnection();
string strCon = string.Format(CONNSTRING, username, password);
conn.ConnectionString = strCon;
try
{
conn.Open();
if (conn.State.ToString() == "Open")
return conn;
}//try
catch (Exception ex)
{
lblErr.Text = "Connection error";
}//catch
finally
{
//you don't want to close it here
//conn.Close();
}//finally
return null;
}
答案 2 :(得分:0)
我不确定我是否正确地回答了这个问题。我的回答是基于你想要打开/检索连接,采取行动,然后关闭/释放连接的前提。
您提供的代码效果不佳。典型的DAO代码类似于这个伪代码,在我的例子中取自我使用的一些样板代码。
public DataSet FetchDataSet(string sql, IDictionary paramHash) {
var cnn = AcquireConnection();
var rtnDS = new DataSet();
try
{
var cmd = cnn.CreateCommand();
cmd.CommandText = sql;
SetParameters(cmd, paramHash);
IDbDataAdapter ida = new DataAdapter { SelectCommand = cmd };
LogSql(sql, paramHash, "FetchDataSet");
ida.Fill(rtnDS);
}
catch (Exception ex)
{
DebugWriteLn("Failed to get a value from the db.", ex);
throw;
}
finally
{
ReleaseConnection(cnn);
}
return rtnDS;
}
请注意,上面的代码严格来说是与数据库通信。没有评估数据是对还是错。您可能有一个DAO是包含上述代码的DAO,它可能会这样做:
public MyItemType FindSomeValue(long Id)
{
const string sql = @"SELECT something from somewhere where id=:id";
var myParams = new Dictionary<string, long> { { "id", Id } };
var ds = FetchDataSet(sql, myParams);
return (from DataRow row in ds.Tables[0].Rows
select new Item
{
Id = Convert.ToInt64(row["ID"], CultureInfo.InvariantCulture),
Name = row["NAME"].ToString()
}).FirstOrDefault();
}
实际上,上面是我多年来使用的DAO实现的伪代码。它使数据访问相对轻松。请注意,这些方法背后有一些真正的代码,如SetParameters(30 - 80行左右),我有一堆其他受保护的方法,如FetchScalar,ExecuteSQL等。