C# MySQL OdbcCommand命令有时会挂起?
我在C#中运行一个循环,在Windows 8 64位环境中,通过MySQL ODBC 5.1驱动程序读取文件并更新MySQL数据库 操作简单C# MySQL OdbcCommand命令有时会挂起?,c#,.net,mysql,odbc,C#,.net,Mysql,Odbc,我在C#中运行一个循环,在Windows 8 64位环境中,通过MySQL ODBC 5.1驱动程序读取文件并更新MySQL数据库 操作简单 计数+1 查看文件是否存在 加载XML文件(XDocument) 从XDocument获取数据 开放ODBC连接 对MySQL数据库运行两个存储过程来存储数据 关闭ODBC连接 问题是,一段时间后它将挂起,例如OdbcCommand.ExecuteOnQuery。它将挂起的SP并不总是同一个SP 这是一个真正的问题,我需要循环60000个文件,但每次只能循
public bool addPublisherToGame(int inPublisherId, int inGameId)
{
string sqlStr;
OdbcCommand commandObj;
try
{
sqlStr = "INSERT INTO games_publisher_binder (gameId, publisherId) VALUE(?,?)";
commandObj = new OdbcCommand(sqlStr, mainConnection);
commandObj.Parameters.Add("@gameId", OdbcType.Int).Value = inGameId;
commandObj.Parameters.Add("@publisherId", OdbcType.Int).Value = inPublisherId;
if (Convert.ToInt32(executeNonQuery(commandObj)) > 0)
return true;
else
return false;
}
catch (Exception ex)
{
throw (loggErrorMessage(this.ToString(), "addPublisherToGame", ex, -1, "", ""));
}
finally
{
}
}
protected object executeNonQuery(OdbcCommand inCommandObj)
{
try
{
//FileStream file = new FileStream("d:\\test.txt", FileMode.Append, FileAccess.Write);
//System.IO.StreamWriter stream = new System.IO.StreamWriter(file);
//stream.WriteLine(DateTime.Now.ToString() + " - " + inCommandObj.CommandText);
//stream.Close();
//file.Close();
//mainConnection.Open();
return inCommandObj.ExecuteNonQuery();
}
catch (Exception ex)
{
throw (ex);
}
}
我可以看出in参数是正确的
连接的打开和关闭是在一个top方法for ever循环中完成的(使用finally)
编辑2:
这是提取信息并保存到数据库的方法:
public Boolean addBoardgameToDatabase(XElement boardgame, GameFactory gameFactory)
{
int incomingGameId = -1;
XElement tmpElement;
string primaryName = string.Empty;
List<string> names = new List<string>();
GameStorage externalGameStorage;
int retry = 3;
try
{
if (boardgame.FirstAttribute != null &&
boardgame.FirstAttribute.Value != null)
{
while (retry > -1)
{
try
{
incomingGameId = int.Parse(boardgame.FirstAttribute.Value);
#region Find primary name
tmpElement = boardgame.Elements("name").Where(c => c.Attribute("primary") != null).FirstOrDefault(a => a.Attribute("primary").Value.Equals("true"));
if (tmpElement != null)
primaryName = tmpElement.Value;
else
return false;
#endregion
externalGameStorage = new GameStorage(incomingGameId,
primaryName,
string.Empty,
getDateTime("1/1/" + boardgame.Element("yearpublished").Value),
getInteger(boardgame.Element("minplayers").Value),
getInteger(boardgame.Element("maxplayers").Value),
boardgame.Element("playingtime").Value,
0, 0, false);
gameFactory.updateGame(externalGameStorage);
gameFactory.updateGameGrade(incomingGameId);
gameFactory.removeDesignersFromGame(externalGameStorage.id);
foreach (XElement designer in boardgame.Elements("boardgamedesigner"))
{
gameFactory.updateDesigner(int.Parse(designer.FirstAttribute.Value), designer.Value);
gameFactory.addDesignerToGame(int.Parse(designer.FirstAttribute.Value), externalGameStorage.id);
}
gameFactory.removePublishersFromGame(externalGameStorage.id);
foreach (XElement publisher in boardgame.Elements("boardgamepublisher"))
{
gameFactory.updatePublisher(int.Parse(publisher.FirstAttribute.Value), publisher.Value, string.Empty);
gameFactory.addPublisherToGame(int.Parse(publisher.FirstAttribute.Value), externalGameStorage.id);
}
foreach (XElement element in boardgame.Elements("name").Where(c => c.Attribute("primary") == null))
names.Add(element.Value);
gameFactory.removeGameNames(incomingGameId);
foreach (string name in names)
if (name != null && name.Length > 0)
gameFactory.addGameName(incomingGameId, name);
return true;
}
catch (Exception)
{
retry--;
if (retry < 0)
return false;
}
}
}
return false;
}
catch (Exception ex)
{
throw (new Exception(this.ToString() + ".addBoardgameToDatabase : " + ex.Message, ex));
}
}
最后是顶层:
public void UpdateGames(string directory)
{
DirectoryInfo dirInfo;
FileInfo fileInfo;
Thread thread;
int gameIdToStartOn = 1;
dirInfo = new DirectoryInfo(directory);
if(dirInfo.Exists)
{
_directory = directory;
fileInfo = dirInfo.GetFiles("*.xml").OrderBy(c=> int.Parse(c.Name.Replace(".xml",""))).FirstOrDefault();
gameIdToStartOn = int.Parse(fileInfo.Name.Replace(".xml", ""));
for (int gameId = gameIdToStartOn; gameId < 500000; gameId++)
{
try
{ StartThreadToHandleXmlFile(gameId); }
catch(Exception){}
}
}
}
public void UpdateGames(字符串目录)
{
DirectoryInfo dirInfo;
FileInfo FileInfo;
螺纹;
int gameIdToStartOn=1;
dirInfo=新目录信息(目录);
如果(dirInfo.Exists)
{
_目录=目录;
fileInfo=dirInfo.GetFiles(“*.xml”).OrderBy(c=>int.Parse(c.Name.Replace(“.xml”)).FirstOrDefault();
gameIdToStartOn=int.Parse(fileInfo.Name.Replace(“.xml”,”);
对于(int gameId=gameIdToStartOn;gameId<500000;gameId++)
{
尝试
{StartThreadToHandleXmlFile(gameId);}
捕获(异常){}
}
}
}
你能展示一下你的代码吗?我们能看看代码吗?:)我怀疑你没有正确关闭命令。对命令和连接使用
语句。我已经更新了一些代码。谢谢!我现在正在尝试合并,希望它能解决这个问题。我正在按原样打开和关闭(最终)。我希望数据库调用可以集中在一起,但我不知道怎么做?是否有一个智能工具可以将所有命令保存到脚本文件中,而不是在数据库中运行它?池并没有解决这个问题。但我已经用代码更新了我的帖子,这个问题似乎仅限于此。
public void UpdateGames(string directory)
{
DirectoryInfo dirInfo;
FileInfo fileInfo;
Thread thread;
int gameIdToStartOn = 1;
dirInfo = new DirectoryInfo(directory);
if(dirInfo.Exists)
{
_directory = directory;
fileInfo = dirInfo.GetFiles("*.xml").OrderBy(c=> int.Parse(c.Name.Replace(".xml",""))).FirstOrDefault();
gameIdToStartOn = int.Parse(fileInfo.Name.Replace(".xml", ""));
for (int gameId = gameIdToStartOn; gameId < 500000; gameId++)
{
try
{ StartThreadToHandleXmlFile(gameId); }
catch(Exception){}
}
}
}