是否有机会重写C#中的SQLite连接打开方法?
每次打开连接时,我都需要执行SQliteCommand。我将继承SQliteConnection类并使用Autofac注册自定义类,但这种方法对我不起作用。而不是是否有机会重写C#中的SQLite连接打开方法?,c#,sqlite,autofac,C#,Sqlite,Autofac,每次打开连接时,我都需要执行SQliteCommand。我将继承SQliteConnection类并使用Autofac注册自定义类,但这种方法对我不起作用。而不是是一种关系使用有一种关系-不要继承SQliteConnection,而是将其封装在类中 像这样的事情应该让你开始: public class DBHelper { private readonly string _connectionString, _sqlToExecut
是一种关系使用有一种关系-不要继承SQliteConnection
,而是将其封装在类中
像这样的事情应该让你开始:
public class DBHelper
{
private readonly string _connectionString,
_sqlToExecuteOnConnectionOpen;
public DBHelper(string connectionString)
{
_connectionString = connectionString;
_sqlToExecuteOnConnectionOpen = "Your sql goes here";
}
public void ExecuteSql(Action<SQliteConnection> action)
{
using(var con = new SQliteConnection(_connectionString))
{
using(var cmd = new SQliteCommand(_sqlToExecuteOnConnectionOpen, con)
{
con.Open();
// of course, any parameters goes here...
cmd.ExecuteNonQuery();
}
action(con);
}
}
}
公共类DBHelper
{
私有只读字符串\u连接字符串,
_sqlToExecuteOnConnectionOpen;
公共DBHelper(字符串连接字符串)
{
_connectionString=connectionString;
_sqlToExecuteOnConnectionOpen=“您的sql在此运行”;
}
public void ExecuteSql(操作)
{
使用(var con=new SQliteConnection(_connectionString))
{
使用(var cmd=new SQliteCommand(_sqlToExecuteOnConnectionOpen,con)
{
con.Open();
//当然,这里有任何参数。。。
cmd.ExecuteNonQuery();
}
行动(con);
}
}
}
现在,您有了一个方法,可以打开和处理SqliteConnection
的实例,执行预先定义的sql,以及您希望使用该连接执行的任何其他操作
您甚至可以更进一步,将此方法设置为私有,但为ExecuteOnQuery、ExecuteScalar、ExecuteReader甚至填充数据集或数据表公开公共方法,并让它们都执行此方法。
这可以节省使用ADO.Net时通常编写的大量重复的管道代码
事实上,我已经发布了一个与此完全相同的示例(当然,除了您的常量sql语句)-您可以克隆它,查看它的代码,通常只是从中吸取想法并在您自己的代码中实现。而不是是一种关系使用有一种关系-不要继承SQliteConnection
,而是将其封装在类中
像这样的事情应该让你开始:
public class DBHelper
{
private readonly string _connectionString,
_sqlToExecuteOnConnectionOpen;
public DBHelper(string connectionString)
{
_connectionString = connectionString;
_sqlToExecuteOnConnectionOpen = "Your sql goes here";
}
public void ExecuteSql(Action<SQliteConnection> action)
{
using(var con = new SQliteConnection(_connectionString))
{
using(var cmd = new SQliteCommand(_sqlToExecuteOnConnectionOpen, con)
{
con.Open();
// of course, any parameters goes here...
cmd.ExecuteNonQuery();
}
action(con);
}
}
}
公共类DBHelper
{
私有只读字符串\u连接字符串,
_sqlToExecuteOnConnectionOpen;
公共DBHelper(字符串连接字符串)
{
_connectionString=connectionString;
_sqlToExecuteOnConnectionOpen=“您的sql在此运行”;
}
public void ExecuteSql(操作)
{
使用(var con=new SQliteConnection(_connectionString))
{
使用(var cmd=new SQliteCommand(_sqlToExecuteOnConnectionOpen,con)
{
con.Open();
//当然,这里有任何参数。。。
cmd.ExecuteNonQuery();
}
行动(con);
}
}
}
现在,您有了一个方法,可以打开和处理SqliteConnection
的实例,执行预先定义的sql,以及您希望使用该连接执行的任何其他操作
您甚至可以更进一步,将此方法设置为私有,但为ExecuteOnQuery、ExecuteScalar、ExecuteReader甚至填充数据集或数据表公开公共方法,并让它们都执行此方法。
这可以节省使用ADO.Net时通常编写的大量重复的管道代码
事实上,我已经发布了一个完全可以做到这一点的方法(当然,除了您的常量sql语句),您可以克隆它,查看它的代码,通常只需从中获取想法,并在您自己的代码中实现它们。您可以使用原理拦截Open
方法
让我们从实现自定义拦截器开始
public class PrepareConnectionInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
if (!(invocation.InvocationTarget is IDbConnection
&& invocation.Method.Name == nameof(IDbConnection.Open)))
{
invocation.Proceed();
return;
}
invocation.Proceed();
IDbConnection connection = (IDbConnection)invocation.InvocationTarget;
using(IDbCommand command = connection.CreateCommand())
{
command.CommandText = "SQL statement";
command.ExecuteNonQuery();
}
}
}
然后使用autofac注册您的连接和拦截器
builder.RegisterType()
.AsSelf();
builder.RegisterType()
.As()
.EnableInterfaceInterceptors()
.被(类型为(PrepareConnectionInterceptor));
现在,每次在已解析的IDbConnection
上调用Open
方法时,将触发拦截器并执行自定义SQL
您可以找到有关的更多信息。您可以使用principle拦截打开
方法
让我们从实现自定义拦截器开始
public class PrepareConnectionInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
if (!(invocation.InvocationTarget is IDbConnection
&& invocation.Method.Name == nameof(IDbConnection.Open)))
{
invocation.Proceed();
return;
}
invocation.Proceed();
IDbConnection connection = (IDbConnection)invocation.InvocationTarget;
using(IDbCommand command = connection.CreateCommand())
{
command.CommandText = "SQL statement";
command.ExecuteNonQuery();
}
}
}
然后使用autofac注册您的连接和拦截器
builder.RegisterType()
.AsSelf();
builder.RegisterType()
.As()
.EnableInterfaceInterceptors()
.被(类型为(PrepareConnectionInterceptor));
现在,每次在已解析的IDbConnection
上调用Open
方法时,将触发拦截器并执行自定义SQL
您可以在上找到更多信息,为什么不使用自己的连接方法来连接并执行此特殊操作,然后调用它。是否可以选择编写“SpecialPen”?查看StateChange
事件。为什么不使用自己的连接方法进行连接并执行此特殊操作,然后调用它。是否可以选择编写“specialpen”?查看StateChange
事件。