Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MySQL OdbcCommand命令有时会挂起?_C#_.net_Mysql_Odbc - Fatal编程技术网

C# MySQL OdbcCommand命令有时会挂起?

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个文件,但每次只能循

我在C#中运行一个循环,在Windows 8 64位环境中,通过MySQL ODBC 5.1驱动程序读取文件并更新MySQL数据库

操作简单

  • 计数+1
  • 查看文件是否存在
  • 加载XML文件(XDocument)
  • 从XDocument获取数据
  • 开放ODBC连接
  • 对MySQL数据库运行两个存储过程来存储数据
  • 关闭ODBC连接
  • 问题是,一段时间后它将挂起,例如OdbcCommand.ExecuteOnQuery。它将挂起的SP并不总是同一个SP

    这是一个真正的问题,我需要循环60000个文件,但每次只能循环1000个左右

    编辑1: 问题似乎总是出现在这里:

    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);}
    捕获(异常){}
    }
    }
    }
    
  • 通过向connectionstring添加“pooling=true”来使用SQL连接池
  • 确保正确关闭连接和文件
  • 您可以创建一个大型查询并只执行一次,我认为它比60000个松散查询快得多
    你能展示一下你的代码吗?

    我们能看看代码吗?:)我怀疑你没有正确关闭命令。对命令和连接使用
    语句。我已经更新了一些代码。谢谢!我现在正在尝试合并,希望它能解决这个问题。我正在按原样打开和关闭(最终)。我希望数据库调用可以集中在一起,但我不知道怎么做?是否有一个智能工具可以将所有命令保存到脚本文件中,而不是在数据库中运行它?池并没有解决这个问题。但我已经用代码更新了我的帖子,这个问题似乎仅限于此。
    
    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){}
            }
        }
    }