上面的代码太乱了,看不清,整理一下,如下:
private void xpButton_login_Click(object sender, System.EventArgs e)
{
    //logging....
    string ls_username="";
    string ls_passwd="";
    SqlConnection sqlconn = new SqlConnection();
    SqlCommand sqlcmd = new SqlCommand();
    //读配置文件得到服务器名称,数据库等信息
    GetPrivateProfileString("database","server","",Base.MainForm.gs_server,255,
    Base.MainForm.gs_inipath);
    GetPrivateProfileString("database","userid","",Base.MainForm.gs_logid,255,
    Base.MainForm.gs_inipath);
    GetPrivateProfileString("database","userid","",Base.MainForm.gs_logpass,255,
    Base.MainForm.gs_inipath);
    GetPrivateProfileString"database","database","",Base.MainForm.gs_database,255,
    Base.MainForm.gs_inipath);
    Base.MainForm.gs_connectstring = "Server="+Base.MainForm.gs_server+";"
    +"User ID="+Base.MainForm.gs_logid+";"+
    "database="+Base.MainForm.gs_database+";"+"Connect Timeout=30";
    sqlconn.ConnectionString=Base.MainForm.gs_connectstring;
    try
   {
sqlconn.Open();
   }
   catch(SqlException err){
         string errorMessages = "";
for (int i=0;i<err.Errors.Count;i++)
{
     errorMessages += "Index #" + i + "\n" + "Message: " + err.Errors[i].Message + "\n" + "LineNumber: " + err.Errors[i].LineNumber + "\n" + "Source: " + err.Errors[i].Source + "\n" + "Procedure: " + err.Errors[i].Procedure + "\n";
         }
MessageBox.Show(errorMessages,"提示信息",
                         MessageBoxButtons.OK,MessageBoxIcon.Stop);
return;
    }    sqlcmd.CommandText="Select username,passwd from sys_users where  
                        userid='"+UserId.Text+"'";
    sqlcmd.CommandTimeout=15;
    sqlcmd.CommandType=CommandType.Text;
    sqlcmd.Connection=sqlconn;
    SqlDataReader sqldr ;
    sqldr = sqlcmd.ExecuteReader();
    try
    {
if(sqldr.HasRows)
{
sqldr.Read();
if(!sqldr.IsDBNull(0))
    ls_username = sqldr.GetString(0);
else
    ls_username="";
if(!sqldr.IsDBNull(1))
    ls_passwd = sqldr.GetString(1);
else
    ls_passwd="";
           Base.MainForm.gs_username=ls_username;
Base.MainForm.gs_userid=UserId.Text;
}
else
{
MessageBox.Show("没有数据!");
}
sqldr.Close();
sqlconn.Close();
    }
    catch(SqlException err)
   {
string errorMessages = "";
for (int i=0;i<err.Errors.Count;i++)
{
    errorMessages += "Index #" + i + "\n" + "Message: " + err.Errors[i].Message + "\n" + "LineNumber: " + err.Errors[i].LineNumber + "\n" + "Source: " + err.Errors[i].Source + "\n" + "Procedure: " + err.Errors[i].Procedure + "\n";
}
sqldr.Close();
sqlconn.Close();
MessageBox.Show(errorMessages,"提示信息",
                         MessageBoxButtons.OK,MessageBoxIcon.Stop);
return;
    }
}

解决方案 »

  1.   

    摘于MSDNClose 方法回滚任何挂起的事务。然后,它将连接释放到连接池,或者在连接池被禁用的情况下关闭连接。应用程序可以多次调用 Close。不会生成任何异常。默认情况下,连接池是可用的,也就是说数据库并没有真正的关闭连接,只不过将连接暂存了,打开数据库是费时间和资源的,这样做是为了节省时间和资源。
      

  2.   

    try
        {
    if(sqldr.HasRows)
    {
    sqldr.Read();
    if(!sqldr.IsDBNull(0))
        ls_username = sqldr.GetString(0);
    else
        ls_username="";
    if(!sqldr.IsDBNull(1))
        ls_passwd = sqldr.GetString(1);
    else
        ls_passwd="";
               Base.MainForm.gs_username=ls_username;
    Base.MainForm.gs_userid=UserId.Text;
    }
    else
    {
    MessageBox.Show("没有数据!");
    }
        }
    catch(SqlException err)
       {
    string errorMessages = "";
    for (int i=0;i<err.Errors.Count;i++)
    {
        errorMessages += "Index #" + i + "\n" + "Message: " + err.Errors[i].Message + "\n" + "LineNumber: " + err.Errors[i].LineNumber + "\n" + "Source: " + err.Errors[i].Source + "\n" + "Procedure: " + err.Errors[i].Procedure + "\n";
    }
    MessageBox.Show(errorMessages,"提示信息",
                             MessageBoxButtons.OK,MessageBoxIcon.Stop);
    return;
        }finally
    {
    sqldr.Close();
    sqlconn.Close();}
      

  3.   

    试了CMIC(大象) 的方法,连接还是没有断开。对了,我的login窗口包括打开这个login窗口的mdi窗口(从dll中的mainform中继承)多是从自己写的dll中调用。不知道有没有影响。
      

  4.   

    整个程序结构是这样的,有一个base.dll库,用来放Mainform(用做其他模块的Mdi窗口继承),base.dll放了一些公用的窗体,如:loginfrm,changepassfrm,aboutfrm等,在模块中加入dll的引用,然后在模块中从base.dll的Mainform派生一个Mainfrm作为模块的Mdi窗体,这样可以达到模块界面的一致性。不知道这些回不回影响我的模块中的一些数据库操作。请指教~~~