相关疑难解决方法(0)

SQLite/C#连接池和准备语句混淆

我花了一些时间专门为数据库和SQLite阅读不同的最佳实践.在阅读时我发现我做了很多我不应该做的事情,在尝试修复这些问题时,我在考虑使用SQLite及其ADO实现的一些更精细的细节时感到困惑.

我的困惑源于准备好的陈述和连接池.

在阅读http://msdn.microsoft.com/en-us/library/ms971481.aspx时,我发现只应为事务打开连接.交易完成后,应关闭连接.我没有牢牢掌握为什么会这样,但我一直在假设作者知道的比我更好.我明白当连接关闭时并不意味着它实际上已经存在已经关闭.它只是意味着它已被放回池中.

现在,为了改进我的查询和插入,我阅读了有关使用预准备语句 在SQLite中,准备好的语句真的能提高性能吗?http://petesbloggerama.blogspot.com/2007/02/sqlite-adonet-prepared-statements.html似乎都表明,当执行多次执行的查询时,准备好的语句是可行的.我还读过,预准备语句特定于连接,并且一旦连接关闭,预准备语句就会丢失.

我的困惑是这个.如果我打开和关闭我的连接(可能或不可能意味着由于线程池而关闭连接)那么我从准备好的声明中获得了多少用处?我可以理解,如果我有1000个对象,我需要在单个事务中保存,准备好的语句可以帮助很多.但是我不相信我会看到在事务中保存单个对象会带来好处,因为一旦我关闭了连接,从第一个对象生成的预准备语句现在就会丢失.这是真实的陈述吗?

我相信准备好的语句与我的SQLiteCommand对象的范围有关,这进一步加剧了我的困惑.

如果我创建一个表示我将经常执行的查询的SQLiteCommand,我是否需要将SQLiteCommand保留在内存中以使预准备语句保持活动状态?

如果我用相同的SQLite语句创建一个新的SQLiteCommand,它是否认识到新的SQLiteCommand与前一个相同,因此有一个可以使用的预准备语句?

如果我在内存中保留一个SQLiteCommand并更改它的参数和连接,因为我打开并关闭不同事务的连接,我基本上在不同的连接之间保持一个准备好的语句?

我很可能在这一点上思考问题,但我希望你能帮助我更好地理解这些事情是如何相互作用的,这样我才能从中获益最多.

c# sqlite connection-pooling prepared-statement

32
推荐指数
2
解决办法
1万
查看次数

SqlCommand.Prepare()做什么以及什么时候应该使用它?

可能重复:
在C#中使用SqlCommand Prepare的优点和缺点?

这是MSDN说有关SqlCommand.Prepare():

在SQL Server实例上创建命令的准备版本.

任何人都可以提供更多的见解,了解这意味着何时应该使用它?

.net ado.net sqlcommand

16
推荐指数
3
解决办法
1万
查看次数

数据库中的C#多个并行插入

我有一个大约3000行的数据表.每个行都需要插入数据库表中.目前,我正在运行foreach循环,如下所示:

obj_AseCommand.CommandText = sql_proc;
obj_AseCommand.CommandType = CommandType.StoredProcedure;
obj_AseCommand.Connection = db_Conn;
obj_AseCommand.Connection.Open();

foreach (DataRow dr in dt.Rows)                
{
    obj_AseCommand.Parameters.AddWithValue("@a", dr["a"]);
    obj_AseCommand.Parameters.AddWithValue("@b", dr["b"]);
    obj_AseCommand.Parameters.AddWithValue("@c", dr["c"]);

    obj_AseCommand.ExecuteNonQuery();
    obj_AseCommand.Parameters.Clear();
}

obj_AseCommand.Connection.Close();
Run Code Online (Sandbox Code Playgroud)

您能否告诉我如何在数据库中并行执行SP,因为上述方法需要大约10分钟才能插入3000行.

c# ado.net multithreading sqlcommand

5
推荐指数
2
解决办法
2万
查看次数