【发布时间】:2016-11-17 06:48:15
【问题描述】:
我有一个应用程序,它会进行几次选择,然后进行一些插入。可能会这样做大约 200 次,然后断开连接并关闭所有内容(据我所知)。代码如下:
using (TransactionScope scope = new TransactionScope())
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["FrameBudgetDB"].ToString()))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = string.Format("SELECT TOP 1 category_id FROM businesses WHERE '{0}' LIKE CONCAT('%',description,'%')", transDescription.Replace("'", "''"));
SqlDataReader reader = cmd.ExecuteReader();
try
{
if (reader.HasRows)
{
while (reader.Read())
{
categoryId = (int)reader[0];
}
}
else
{
categoryId = 11; // Extgra Expenses
}
}
finally
{
reader.Close();
cmd.Dispose();
}
// Get Transaction Type
int transTypeId = 0;
cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = string.Format("SELECT trans_type_id FROM transaction_types WHERE description = '{0}'", transType);
reader = cmd.ExecuteReader();
try
{
if (reader.HasRows)
{
while (reader.Read())
{
transTypeId = (int)reader[0];
}
}
}
finally
{
reader.Close();
cmd.Dispose();
}
try
{
cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = string.Format(
"BEGIN " +
"IF NOT EXISTS(SELECT * FROM transactions " +
"WHERE transaction_date = @TransDate " +
"AND trans_type_id = @TransTypeId " +
"AND amount = @Amount " +
"AND ((from_bank = 1 AND description = @TransDesc) " +
"OR (from_bank = 0)) " +
"AND(category_id = @CategoryId OR previous_category_id = @CategoryId )) " +
"BEGIN " +
"INSERT INTO transactions(transaction_date, description, trans_type_id, import_date, category_id, amount, from_bank) " +
"VALUES(@TransDate, @TransDesc, @TransTypeId, @ImportDate, @CategoryId, @Amount, 1) " +
"END " +
"END");
cmd.Parameters.AddWithValue("@TransDate", transDate);
cmd.Parameters.AddWithValue("@TransDesc", transDescription);
cmd.Parameters.AddWithValue("@TransTypeId", transTypeId);
cmd.Parameters.AddWithValue("@Amount", amount);
cmd.Parameters.AddWithValue("@CategoryId", categoryId);
cmd.Parameters.AddWithValue("@ImportDate", DateTime.Now);
rowsInserted = rowsInserted + cmd.ExecuteNonQuery();
cmd.Dispose();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
conn.Close();
conn.Dispose();
}
scope.Complete();
scope.Dispose();
}
}
在所有插入之后,我想通过复制并将其移动到其他地方来备份数据库,但是 sqlserver.exe 会长时间锁定文件。我试过让应用程序等待,但它似乎持有锁很长时间。
我已经构建了一个锁检查 while 循环,但如果知道它实际需要多长时间会很高兴?
【问题讨论】:
-
为什么不使用实际的 SQL Server 备份方法进行备份?
-
你能用 SQL Lite 做到这一点吗?
标签: c# sql-server visual-studio visual-studio-2015