Postgresql查询返回NullReferenceException



我使用Selenium + postgre集成,以验证数据库上的正确数据。在对UI进行操作后,我使用Npgsql从单元格中接收标量值,然后将其用于断言。

代码看起来行:

public static string GetCreditAmount(string orderId, string accountNumber)
{
string findCreditQuery = $@"SELECT ""Credit"" FROM accounting.""AccountLines"" al INNER JOIN accounting.""Accounts"" acc ON al.""Account_FK"" = acc.""Id""
WHERE
""OrderId"" = '{orderId}'
AND ""AccountNumber"" = '{accountNumber}'
ORDER BY al.""CreatedDateUtc"" DESC";
using (var connection = new NpgsqlConnection(Configuration.AdminConnectionString))
{
connection.Open();
var transaction = connection.BeginTransaction();
try
{
var account = connection.ExecuteScalar(findCreditQuery).ToString();
return account;
}
catch (NullReferenceException e)
{
Thread.Sleep(3000);
var account = connection.ExecuteScalar(findCreditQuery).ToString();
return account;
}
catch (Exception e)
{
transaction.Rollback();
throw e;
}
}
}

我收到的问题是NullReferenceException然而,结果是随机的。在一个测试中,我发射了&断言几次,在85%的情况下它不工作(Null引用),有时在15%的情况下它工作(测试通过)。奇怪的情况是,在一次运行中正确的断言在另一次运行中失败了。

我试图添加静态睡眠(Thread.Sleep),以便给数据库一些额外的时间来继续,但它仍然失败。

是否有合适的解决方案可以使用?

如果你这样做:

object o = null;
string s = o.ToString();

我相信你会得到同样的错误。我认为问题是你的数据库对象是空的。

这可能会修复它:

object o = connection.ExecuteScalar(findCreditQuery);
string account = o == null ? null : o.ToString();

或者,您可以实现DbDataReader并使用IsDbNull方法。这将是更多的工作,但也可能是更可伸缩的,如果你计划做更多的比目前正在做的:

string account;
using (NpgsqlCommand cmd = new NpgsqlCommand(findCreditQuery, connection))
{
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
reader.Read();
if (!reader.IsDBNull(0))
account = reader.GetString(0);
}
}

最新更新