4

カスタム作成の DB プロバイダーがあります。テストを実行すると、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;
}

ブレークポイントを置いて、そこにステップインしようとすると、コードが壊れて例外がスローされます...追跡できません

4

1 に答える 1

8

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;

        }
    }
}
于 2013-10-16T22:34:02.873 に答える