使用命令提示符或超链接打开c#表单时OleDbConnection的问题,但不是Windows资源管理器
本文关键字:问题 资源管理器 Windows OleDbConnection 命令提示符 超链接 表单 | 更新日期: 2023-09-27 18:15:36
我有一个c#程序,它在表单加载时执行以下操作:
- 在与程序 相同的文件夹中创建一个OleDbConnection到数据库获取计算机名
- 获取用户名
- 用从数据库 获得的数据填充表单上的一些文本框字段
当我使用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
}
}
我打赌快捷方式在工作目录中作为参数传递。File.Exists()的文档说明,当使用相对路径时,相对路径信息被解释为相对于当前工作目录。
您可以使用Directory.GetCurrentDirectory()函数来确定路径是否设置正确。
如果你正在使用的文件,你知道将在一个路径相对于应用程序,我将使用应用程序的路径或至少设置Environment.CurrentDirectory
=应用程序的路径。
还可以看看Environment.GetCommandLineArgs()[0].
,这可能是由快捷键设置的