我的功能会导致很多异常,因此性能不是那么好。
你能告诉我如何在返回字符串之前修复函数并验证数据吗?我试图查看表的数量是否大于0,但情况并非总是如此。
public String getString(String sql)
{
DataSet ds = new DataSet();
string connstring = String.Format("Server={0};Port={1}; User Id={2};Password={3};Database={4};", tbHost, tbPort, tbUser, tbPass, tbDataBaseName);
NpgsqlConnection conn = new NpgsqlConnection(connstring);
try
{
conn.Open();
NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
ds.Reset();
da.Fill(ds);
conn.Close();
return ds.Tables.Count == 0 ? "0" : ds.Tables[0].Rows[0][0].ToString();
}
catch (Exception msg)
{
if (conn.State.ToString() == "Open")
{
conn.Close();
}
return "0";
}
}
答案 0 :(得分:2)
您应该使用using自动处理您创建的对象。您可以显式打开/关闭连接,但这里不需要它,因为行为将完全相同。如果没有打开DataAdapter将打开连接,并记得在之后关闭它。
关于validate the data
- 请参阅代码中的评论。
public String getString(String sql)
{
using (DataSet ds = new DataSet())
{
string connstring = String.Format("Server={0};Port={1}; User Id={2};Password={3};Database={4};", tbHost, tbPort, tbUser, tbPass, tbDataBaseName);
using (NpgsqlConnection conn = new NpgsqlConnection(connstring))
{
using (NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn))
{
da.Fill(ds);
// You did check count of tables
if (ds.Tables.Count > 0)
{
DataTable dt = ds.Tables[0];
// But forgot to check count of Rows
if (dt.Rows.Count > 0)
{
object o = dt.Rows[0][0];
// And returned value for nulls
// Check for null is here because I don't know
// This Postgresql classes
if (o != DBNull.Value && o != null)
{
return o.ToString();
}
}
}
}
}
}
// Return default value
return "0";
}
最后一件事 - 测试枚举时,不要将其转换为字符串。要查看是否已打开连接,只需说:
if (conn.State == ConnectionState.Open)
答案 1 :(得分:1)
尝试使用“finally”块。
另外,我建议将Connect功能划分为其他方法,以便更好地控制异常发生的位置。
还可以将存储过程与SQL一起使用,以最大限度地减少SQL字符串的错误。
答案 2 :(得分:1)
public String getString(String sql)
{
DataSet ds = new DataSet();
string connstring = String.Format("Server={0};Port={1}; User Id={2};Password={3};Database={4};", tbHost, tbPort, tbUser, tbPass, tbDataBaseName);
NpgsqlConnection conn = new NpgsqlConnection(connstring);
conn.Open();
NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
ds.Reset();
try
{
da.Fill(ds);
}
catch (Exception msg)
{
// do something here or log the error.
}
finally
{
if (conn.State.ToString() == "Open")
{
conn.Close();
}
}
return ds.Tables.Count == 0 ? "0" : ds.Tables[0].Rows[0][0].ToString();
}