我有一个c#程序,它在表单加载时执行以下操作:
当我在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
}
}
答案 0 :(得分:1)
我敢打赌,快捷方式会在工作目录中作为参数传递。 File.Exists()的文档指出,当使用相对路径时,相对路径信息被解释为相对于当前工作目录。
您可以使用Directory.GetCurrentDirectory()功能确定路径是否设置正确。
如果您正在使用您知道将在相对于应用程序的路径中的文件,那么我将使用应用程序的路径或至少设置Environment.CurrentDirectory
=应用程序的路径。
另请查看快捷方式设置的Environment.GetCommandLineArgs()[0].
。