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

本文关键字:问题 资源管理器 Windows OleDbConnection 命令提示符 超链接 表单 | 更新日期: 2023-09-27 18:15:36

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

  1. 在与程序
  2. 相同的文件夹中创建一个OleDbConnection到数据库获取计算机名
  3. 获取用户名
  4. 用从数据库
  5. 获得的数据填充表单上的一些文本框字段

当我使用Windows资源管理器、快捷方式或在visual studio express 2013中调试打开表单时,它会完成所有这些操作,没有任何问题。当尝试使用命令提示符或超链接打开数据库时,没有建立数据库连接,但没有出现错误消息。由于我在oledb命令周围的try-catch语句,文本框字段填充了"未找到"。同样的try-catch语句应该将ex.message打印到一个文本文件中,但这也没有发生。如前所述,当在vs中从调试模式运行或在Windows资源管理器中打开程序运行时,这一切都运行得完美无缺,所以我不确定如何调试这个

2个问题-当从命令提示符或快捷方式启动程序时,在窗体加载时打开c#窗体试图与access数据库建立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
    }
}

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

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

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

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

还可以看看Environment.GetCommandLineArgs()[0].,这可能是由快捷键设置的