使用命令提示符或超链接而不是Windows资源管理器打开c#表单时OleDbConnection出现问题

时间:2014-07-30 18:08:57

标签: c# winforms oledb shortcut

我有一个c#程序,它在表单加载时执行以下操作:

  1. 为与程序
  2. 相同的文件夹中的数据库创建OleDbConnection
  3. 获取计算机名称
  4. 获取用户名
  5. 使用从数据库中获取的数据填写表单上的一些文本框字段
  6. 当我在visual studio express 2013中使用Windows资源管理器,快捷方式或调试打开表单时,它可以毫无问题地完成所有这些操作。尝试使用命令提示符或超链接打开它时,未建立数据库连接,但不显示任何错误消息。由于围绕oledb命令的try-catch语句,文本框字段填充了“未找到”。相同的try-catch语句应该将ex.message打印到文本文件中,但这也不会发生。如前所述,通过在Windows资源管理器中运行程序从调试模式运行或通过在Windows资源管理器中打开程序运行程序,这一切都运行完美,所以我不知道如何调试它。

    2个问题 - 在从命令提示符或快捷方式启动程序时,打开c#表单是否存在已知问题,这些表单试图在表单加载时与访问数据库建立OleDb连接?如果是这样,有没有解决方法?鉴于它在vs中的调试模式下运行正常,并且我的catch语句似乎在没有错误消息的情况下提前终止,是否还有其他方法可以调试并找出问题发生的确切位置?

    我遗漏了一些不相关的代码行,以缩短代码。

    private void Form1_Load(object sender, EventArgs e)
    {
        userData = onLoad.loadDb(out userNotFound);
        ComputerName = onLoad.getComputer();
    
        // Session Notification
        WTSRegisterSessionNotification(this.Handle, NotifyForThisSession);
    
        // Initialize Hooks
        initialize_Hooks();
    
        if (userData.Count < 4)
        {
            for(int i = 0; i<4; i++) { userData.Add("Not Found"); }
        }
        // globals:
        FullID = userData[0];
        ID = userData[2];
        firstName = userData[1];
        lastName = userData[0];
        nanid = userData[3];
        fullName = firstName + " " + lastName;
    
        // Fill in Form
        label1.Text = fullName;
        label2.Text = ID;
        label3.Text = nanid;
    }
    public class onLoad
    {
        public static string getUser() // returns Environment.UserName
        public static string getComputer() // returns System.Environment.MachineName;
        public static List<string> loadDb(out bool userNotFound)
        {
            List<string> rList = new List<string>();
            string strAccessConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=db.mdb";
            string strAccessSelect = "SELECT (//select statement which works fine when I open the program in explorer or vs debug)
            DataSet myDataSet = new DataSet();
            OleDbConnection myAccessConn = null;
            try
            {
                myAccessConn = new OleDbConnection(strAccessConn);
            }
            catch(Exception ex)
            {
                for(int i = 0; i<4; i++) { rList.Add("Not Found"); }
                error_handler.error_logger(ex.Message);
                userNotFound = true;
                return rList;
            }
            try
            {
                OleDbCommand myAccessCommand = new OleDbCommand(strAccessSelect, myAccessConn);
                OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(myAccessCommand);
                myAccessConn.Open();
                myDataAdapter.Fill(myDataSet,"table1");
            }
            catch (Exception ex)
            {
                error_handler.error_logger(ex.Message);
                userNotFound = true;
                for(int i = 0; i<4; i++) { rList.Add("Not Found"); }
                return rList;
            }
            finally
            {
                  myAccessConn.Close();
            }
            try
            {
                DataRowCollection dra = myDataSet.Tables[0].Rows;
                foreach (DataRow dr in dra)
                {
                    code that conditions the data, works fine when running the program
                }
            }
            catch(Exception ex)
            {
                string returnString = ex.Message;
                error_handler.error_logger(ex.Message);
                userNotFound = true;
                for(int i = 0; i<4; i++) { rList.Add("Not Found"); }
                return rList;
            }
            return rList;
    
        }
    }
    class error_handler
    {
        public static string filename = "error.txt";
        public static void error_logger(string error_message)
        {
            error_message = onLoad.getUser() + "\t" + DateTime.Now.ToString("MM/dd/yy hh:mm:ss") + "\t" + onLoad.getComputer() + "\t" + "Error: " + error_message; 
            if (!File.Exists(filename))
            //writes error_message to a new text file or appends if it already exists. works fine when running from windows explorer or vs debug
        }
    }
    

1 个答案:

答案 0 :(得分:1)

我敢打赌,快捷方式会在工作目录中作为参数传递。 File.Exists()的文档指出,当使用相对路径时,相对路径信息被解释为相对于当前工作目录。

您可以使用Directory.GetCurrentDirectory()功能确定路径是否设置正确。

如果您正在使用您知道将在相对于应用程序的路径中的文件,那么我将使用应用程序的路径或至少设置Environment.CurrentDirectory =应用程序的路径。

另请查看快捷方式设置的Environment.GetCommandLineArgs()[0].