Sqlite ExecuteScalar throwing NullReferenceExcpetion

本文关键字:NullReferenceExcpetion throwing ExecuteScalar Sqlite | 更新日期: 2023-09-27 18:35:37

我有一个自定义编写的数据库提供程序。当我运行测试时,它们在 ExecuteScalar 命令上中断并带有NullReferenceException.我在这里可能错过了什么?我读过有些人有一个多线程问题,但我并不"认为"这就是我遇到的问题。

这是我的 GetOpenConnection 方法

public SqliteConnection GetOpenConnection()
{
    var connection = new SqliteConnection(_connectionString);
    if (connection == null) throw new Exception("Could not create a database connection.");
    connection.Open();
    return connection;
}

和 ExecuteScalar 方法

public TKey ExecuteScalar<TKey> ( string commandText, IDictionary<string, object> parameters )
{
    using ( var connection = _connectionProvider.GetOpenConnection() )
    {
        using ( var command = connection.CreateCommand() )
        {
            command.CommandType = CommandType.Text;
            command.CommandText = commandText;
            foreach ( var parameter in parameters )
            {
                command.Parameters.Add( new SqliteParameter( parameter.Key, parameter.Value ?? DBNull.Value ) );
            }
            // BREAKING HERE
            return ( TKey )command.ExecuteScalar();
        }
    }
}

这就是调用ExecuteScalar的方法

private const string CheckTableExists = "SELECT name FROM sqlite_master WHERE type='table' AND name='{0}'";
public bool CheckIfTableExists ( string tableName )
{
    var exists = ExecuteScalar<int>( string.Format( CheckTableExists, tableName ) ) == 1;
    return exists;
}

我在上面放了一个断点,并尝试进入它...代码只是中断并抛出异常...我无法追踪它

Sqlite ExecuteScalar throwing NullReferenceExcpetion

如果查询未返回任何记录,则ExecuteScalar返回 null。这似乎解决了 NullReferenceException。

public TKey ExecuteScalar<TKey> ( string commandText, IDictionary<string, object> parameters )
{
    using ( var connection = _connectionProvider.GetOpenConnection() )
    {
        using ( var command = connection.CreateCommand() )
        {
            command.CommandType = CommandType.Text;
            command.CommandText = commandText;
            foreach ( var parameter in parameters )
            {
                command.Parameters.Add( new SqliteParameter( parameter.Key, parameter.Value ?? DBNull.Value ) );
            }
            if (typeof (TKey) != typeof (int))
            {
                return (TKey) command.ExecuteScalar();
            }
                var executeScalar = command.ExecuteScalar();
                var item = executeScalar == null ? 0 : 1;
                return (TKey)(object)item;
        }
    }
}