在从查询中恢复字符串值之前检查异常
本文关键字:检查 异常 字符串 查询 恢复 | 更新日期: 2023-09-27 18:37:00
我的函数导致很多异常,因此性能不是那么好。
您能否建议如何在我返回字符串之前修复函数并验证数据?我试图查看表的数量是否大于 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";
}
}
您应该使用 自动释放您创建的对象。您可以显式打开/关闭连接,但此处不需要它,因为行为将完全相同。如果未打开,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)
尝试使用"final"块。
此外,我建议将连接功能划分为其他方法,以便更好地控制异常发生的位置。
还可以将存储过程与 SQL 结合使用,以最大程度地减少 SQL 字符串的错误。
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();
}