Cha*_*ell 4 c# sqlite executescalar nullreferenceexception
我有一个自定义编写的DB提供程序.当我运行我的测试时,他们正在打破ExecuteScalar命令NullReferenceException.我可能会在这里失踪什么?我读过一些人有一个MultiThreading问题,但我并不"认为"这就是我遇到的问题.
这是我的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;
}
Run Code Online (Sandbox Code Playgroud)
和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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
而这就是调用它的方法 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;
}
Run Code Online (Sandbox Code Playgroud)
我在它上面设置了一个断点,并尝试进入它... ..代码只是中断并抛出异常......我无法跟踪它
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)