【发布时间】:2016-11-23 15:14:47
【问题描述】:
我遇到了从并行线程执行的查询的问题。 几乎总是我得到关于该索引的错误 |表类型 |程序 |表已经存在。
我很确定我的 sql 查询受到保护,不会出现该错误,并且它永远不会出现。
此查询应该能够从并发线程运行而不会出现任何错误。
我在做什么:
我有数百个文件,每个文件包含几百万行。
每一行都包含我需要插入到特定表中的对象。
如果表/索引/过程不存在,我需要创建它。
目前它工作得很好,除了这个不应该出现的错误。
我的查询代码(创建索引):
public void CreateIndex(string tableName)
{
try
{
StringBuilder sb = new StringBuilder();
var connectionString = ConnectionString;
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
// Creating INDEX
sb.AppendFormat(@" IF NOT EXISTS(SELECT * FROM sys.indexes
WHERE name='TimeSeries_DateStamp_{0}' AND object_id = OBJECT_ID('{0}'))
exec(' CREATE UNIQUE CLUSTERED INDEX TimeSeries_DateStamp_{0} ON [dbo].[{0}]
(
[TimeSeriesID] ASC,
[DateStamp] ASC
) WITH (
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = OFF,
DROP_EXISTING = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY] '); ", tableName);
using (SqlCommand cmd = new SqlCommand(sb.ToString().Trim(), conn))
{
cmd.ExecuteNonQuery();
}
conn.Close();
}
}
catch (Exception ex)
{
Log.Error(string.Format("Error occured while adding index: {0}", tableName), ex);
}
}
我已经标记了 (...) 代码,其中实际上没有什么重要的事情发生 - 只是一些数据处理。
DB 是实体框架 6 上下文,也包含此 CreateIndex 方法。
Parallel.ForEach(timeSeriesFiles, file =>
{
(...)
// FOREACH LINE
foreach (string line in File.ReadLines(file))
{
(...)
using (var db = Context.DB)
{
db.CreateIndex(tableName(line));
}
(...)
}
}
我将不胜感激任何建议或线索为什么会发生这种情况。
【问题讨论】:
标签: c# sql entity-framework-6 sql-server-2016