今天上午做导入,开始还特别的顺利,可以一次性导入许多数据,可是到了下午,我添加一个判断:“判断数据库中是否已经存在已经要导入的数据”,由于是excel种的每一条都得判断,所以我就图省事把“查库-判断是否存在”的步骤代码写在了for循环里面!结果就报了这么一个奇葩错误:“Multiple simultaneous connections or connections with different connection strings inside the same transaction are not currently supported.”
这个错误翻译过来就是:“ 目前不支持多个并发连接或连接不同的连接字符串在相同事务中”!
总结:
这个错误翻译过来就是:“ 目前不支持多个并发连接或连接不同的连接字符串在相同事务中”!
一开始各种不明白,弄了半天的数据库连接字符串,还非常奇怪:我就连了一次啊!!!后来冯尧给了一个思路就是:判断数据库中是否存在用到了EF连接了一次数据库,批量添加数据又用到了一次数据库,而且又写到了一个循环里面,这可能就是所谓的在一次事务当中连接了多次数据库吧!你试试把判断是否重复的代码拿出来!
//得到导入目标表的DataTable
Dictionary<int, DataTable> dicTargetTable = this.GetImportTable(strPath, strXMLName, dicDefaultColumn, strDBKey);
//得到导入第三张表的DataTable
Dictionary<int, DataTable> dicThirdTable = this.GetThirdTable();
//得到过程中出现的问题表
Dictionary<int, DataTable> dicErrorTable = this.GetErrorTable();
//数据库连接字符串
//获得配置文件链接数据库的字符串
//string connstr = ConfigurationManager.AppSettings["connectionString"];
ITOO.Library.Core.Common.MySqlHelper mysql = new ITOO.Library.Core.Common.MySqlHelper(strDBKey);
//先吧数据库中存在的数据取出来放到一个list里面
List<EvaluationQuestionBank> listNew = new List<EvaluationQuestionBank>();
for (int intTableIndex = 0; intTableIndex < dicTargetTable.Count; intTableIndex++)
{
if (dicTargetTable[intTableIndex].Rows.Count > 0)
{
DataTable dtTarget = dicTargetTable[intTableIndex];
for (int i = 0; i < dtTarget.Rows.Count; i++)
{
EvaluationQuestionBank questionbank = new EvaluationQuestionBank();
// DataTable singledtTarget = new DataTable();
string questioncontent = dtTarget.Rows[i]["QuestionContent"].ToString();
string paperid = dicDefaultColumn["PaperID"].ToString();
//查询该考试内容和paperid下是否有重复的内容,有则不用导入
Boolean isexist = isExistPaperIdAndQuestionContent(paperid, questioncontent);
if (isexist == false)
{
//放入到新的list中
questionbank.PaperId = dicDefaultColumn["PaperID"].ToString();
questionbank.QuestionContent = dtTarget.Rows[i]["QuestionContent"].ToString();
questionbank.QuestionNo =Convert.ToInt16( dtTarget.Rows[i]["QuestionNo"]);
questionbank.QuestionScore= Convert.ToDecimal(dtTarget.Rows[i]["QuestionScore"].ToString());
questionbank.TableName = dtTarget.TableName.ToString();
}
listNew.Add(questionbank);
}
}
}
//然后对这个新的list提取信息
try
{
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
for (int intTableIndex = 0; intTableIndex < dicTargetTable.Count; intTableIndex++)
{
if (dicTargetTable[intTableIndex].Rows.Count > 0)
{
//DataTable dtTarget = dicTargetTable[intTableIndex];
//开始不同
StringBuilder sbSql = new StringBuilder();
for (int i = 0; i < listNew.Count; i++)
{
string QuestionId = System.Guid.NewGuid().ToString();
DateTime TimeStamp = DateTime.Now;
string IsDeleteQuestion = "1";
string QuestionOrderId = "0";
if (listNew[i].QuestionNo == 0)
{
continue;
}
//sql语句拼接
sbSql.Append("insert into ").Append(listNew[i].TableName.ToString()).Append(" (QuestionNo,QuestionContent,QuestionScore,QuestionId,IsDeleteQuestion,QuestionOrderId,TimeStamp,PaperId) values (");
sbSql.Append("'" + listNew[i].QuestionNo+ "',")
.Append("'" + listNew[i].QuestionContent + "',")
.Append("'" + listNew[i].QuestionScore + "',")
.Append("'" + QuestionId + "',")
.Append("'" + IsDeleteQuestion + "',")
.Append("'" + QuestionOrderId + "',")
.Append("'" + TimeStamp + "',")
.Append("'" + dicDefaultColumn["PaperID"] + "'")
.Append(");");
}
if (sbSql.Length==0)
{
break;
}
//往SQLHelper里面提交数据
int flag = mysql.ExecuteNonQuery(sbSql.ToString());
}
}
scope.Complete();
}
}
catch (Exception e)
{
throw new Exception(e.Message);
}
Boolean bolIsExistErrorData = false;
foreach (int intErrorTableIndex in dicErrorTable.Keys)
{
if (dicErrorTable[intErrorTableIndex].Rows.Count > 0)
{
bolIsExistErrorData = true;
}
}
if (bolIsExistErrorData)
{
return dicErrorTable;
}
return null;
总结:
ITOO5.0用到了myql数据库,很多问题都是和sqlserver不一样的!而且mysql的修改和添加都是有限制的,只能有一个程序对同一个表进行修改和添加,所以就会造成很多问题,平时要小心,仔细,不能偷懒啊!