想知道我是否正确行事。我正在创建一个C#应用程序,它从我的App.Config.xml文件加载一些变量。我将这些加载到“config”类(Config.cs)以及我从MySQL数据库加载的其他变量。这是我班级到目前为止的样子:
class Config
{
public static string ServerHostname = ConfigurationManager.AppSettings["ServerHostname"];
public static string SoftwareVersion = "v0.1a";
public static int StationID = DBConnector.GetStationID();
public static string StationDescription = DBConnector.GetStationDescription();
public static string StationName = ConfigurationManager.AppSettings["StationName"];
}
我正在使用Config.StationName从DBConnector.cs中的MySQL数据库中提取Config.StationID和Config.StationDescription:
public static int GetStationID()
{
try
{
MySqlConnection conn = new MySqlConnection(connStr);
conn.Open();
string sql = "select station_id from station_master where station_name = @station_name limit 1";
MySqlCommand cmd = new MySqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@station_name", Config.StationName);
object result = cmd.ExecuteScalar();
conn.Close();
return Convert.ToInt32(result);
}
catch (Exception ex)
{
ErrorConnection += ex.ToString();
return 0;
}
}
public static string GetStationDescription()
{
try
{
MySqlConnection conn = new MySqlConnection(connStr);
conn.Open();
string sql = "select station_description from station_master where station_id = '" + Config.StationID +"' limit 1";
MySqlCommand cmd = new MySqlCommand(sql, conn);
// cmd.Parameters.AddWithValue("@station_name", Config.StationName.ToString());
object result = cmd.ExecuteScalar();
conn.Close();
MessageBox.Show(sql);
return (result.ToString());
}
catch (Exception ex)
{
ErrorGenericDBException += ex.ToString();
MessageBox.Show(ErrorGenericDBException);
return "Error";
}
}
DBConnector.GetStationID类工作正常。它返回我的工作站的int值。但是当我尝试显示Config.StationDescription时,它会抛出System.NullReferenceException异常:对象引用未设置为Namespace.DBConnector.GetStationDescription()中的对象实例。
我认为,因为我使用的是Config.StationName的静态类,所以我不必创建一个实例来引用它。我需要帮助才能理解为什么抛出异常。
答案 0 :(得分:1)
对我来说,看起来你可能会混淆代码的哪一部分存在问题。既然你说它是GetSTationDescription
引发的,我不确定你为什么假设StationName
有问题?
我会看一下object result = cmd.ExecuteScalar();
行,如果你在那之后在行上放一个断点,结果是否有值?
另一个问题是,如果没有抛出异常,您当前只关闭连接,在conn.Close();
语句中使用finally
会更安全(或使用using
}声明所以你不必担心关闭它。)