当我尝试访问嵌入在MainForm中创建的类中的函数时,我遇到了从Usercontrol抛出nullpointerexception的问题。
它的外观如下:
public MySqlPlannerFunctions sqlPlanner;
public Form1()
{
InitializeComponent();
#region "conString"
MySqlMain sqlMain = new MySqlMain("root", "*******",
"opcnewest", "localhost", "3306");
#endregion
sqlPlanner = new MySqlPlannerFunctions(sqlMain);
}
使用MySqlMain的构造函数,我只需填写我的connectionstring的数据。然后我创建sqlPlanner的实例,并在该构造函数中我抛出我的MySqlMain类,以便我可以直接从sqlPlanner类访问它。希望这是有道理的。
MySqlMain sqlMain;
public MySqlPlannerFunctions(MySqlMain SqlMain)
{
this.sqlMain = SqlMain;
}
然后在我的Usercontrol中,它将使用sqlPlanner,它看起来就像这样。
Form1 myParent;
public PlanningControl()
{
InitializeComponent();
myParent = (Form1)this.ParentForm;
}
private void PlanningControl_Load(object sender, EventArgs e)
{
dtp_selectedDTFrom = planner_dtp_FromDate.Value.Date;
dtp_selectedDTTo = planner_dtp_ToDate.Value.Date;
try
{
dS = new DataSet();
dS = myParent.sqlPlanner.GetPlanInInterval(dtp_selectedDTFrom, dtp_selectedDTTo);
}
catch (MySqlException ex)
{
MessageBox.Show(ex.Message);
}
FillListView(dS, planner_lv_Plan);
}
当我尝试调用函数myParent.sqlPlanner.GetPlanInInterval(data,data)时发生我的nullpointerexepction;
我一直在互联网上搜索几个小时,无法找到任何解决方案。所以我真的希望这里有人可以帮助我和其他可能遇到同样问题的人。
我这样做的方式是错误的,我处理SQL类的方式只是完全延迟,或者你能想出的任何东西都可以让我成为更好的开发者。
我被问到GetPlanInInterval函数内部是什么,这就是它:
public DataSet GetPlanInInterval(DateTime from, DateTime to)
{
DataSet dS;
string sqlQuery = "SELECT * FROM " + prod_planning + " WHERE date >= @from AND =< @to";
MySqlCommand cmd = sqlMain.CreateCommand(sqlQuery);
if (cmd != null)
{
cmd.Parameters.AddWithValue("@from", from.Date.ToString("yyyy-MM-dd"));
cmd.Parameters.AddWithValue("@to", to.Date.ToString("yyyy-MM-dd"));
dS = new DataSet();
dS = sqlMain.Select(prod_planning, cmd);
if (dS != null) return dS;
}
return null;
}
在sqlMain.Select()中它看起来像这样:
public DataSet Select(string table, MySqlCommand sqlCommand)
{
DataSet dS;
if (this.OpenConnection() == true)
{
sqlDataAdapter = new MySqlDataAdapter();
sqlDataAdapter.SelectCommand = sqlCommand;
dS = new DataSet();
sqlDataAdapter.Fill(dS, table);
sqlDataAdapter.Dispose();
sqlCommand.Dispose();
this.CloseConnection();
return dS;
}
else
{
return null;
}
}