Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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#非常快速地将数千行从文本文件添加到数据库_C#_Sql Server_Sql Server 2008_Web Applications_Webforms - Fatal编程技术网

C#非常快速地将数千行从文本文件添加到数据库

C#非常快速地将数千行从文本文件添加到数据库,c#,sql-server,sql-server-2008,web-applications,webforms,C#,Sql Server,Sql Server 2008,Web Applications,Webforms,我正在为Grepolis创建一个应用程序,这是一款在线战争游戏,你可以和成千上万的其他玩家一起玩。我正在连接到位于的文本文件,并将其下载到WebClient.DownloadString。然后我在“\n”上拆分这个字符串,并在“,”上拆分每个字符串。每行包含玩家id、姓名、联盟id、积分、等级和城镇(玩家拥有的城镇数量)。上次清点时有6万多人。我在大约10分钟内将他们全部上传到本地数据库,现在对每一行进行更新,以便在此过程中删除所有得分为0的玩家,并更新自上次更新以来发生变化的玩家。问题是,到目

我正在为Grepolis创建一个应用程序,这是一款在线战争游戏,你可以和成千上万的其他玩家一起玩。我正在连接到位于的文本文件,并将其下载到WebClient.DownloadString。然后我在“\n”上拆分这个字符串,并在“,”上拆分每个字符串。每行包含玩家id、姓名、联盟id、积分、等级和城镇(玩家拥有的城镇数量)。上次清点时有6万多人。我在大约10分钟内将他们全部上传到本地数据库,现在对每一行进行更新,以便在此过程中删除所有得分为0的玩家,并更新自上次更新以来发生变化的玩家。问题是,到目前为止,即使只是更新也要花费10分钟以上的时间

有没有什么快速的方法来完成我想做的事情?以下是我认为相关的所有代码:

文件:Global.asax.cs

protected void Application_Start(object sender, EventArgs e)
{
    WebClient wc = new WebClient();
    String str = wc.DownloadString("http://en12.grepolis.com/data/players.txt");
    String[] players = str.Split('\n');
    foreach (String player in players)
    {
        String[] playerInfo = player.Split(',');
        ContentManager cm = new ContentManager();
        int id = 0;
        String name = "";
        int alliance_id = 0;
        int points = 0;
        int rank = 0;
        int towns = 0;
        try
        {
            int.Parse(playerInfo[0]);
            id = int.Parse(playerInfo[0]);
        }
        catch
        {
        }
        try
        {
            name = playerInfo[1];
        }
        catch
        {
        }
        try
        {
            int.Parse(playerInfo[2]);
            alliance_id = int.Parse(playerInfo[2]);
        }
        catch
        {
        }
        try
        {
            int.Parse(playerInfo[3]);
            points = int.Parse(playerInfo[3]);
        }
        catch
        {
        }
        try
        {
            int.Parse(playerInfo[4]);
            rank = int.Parse(playerInfo[4]);
        }
        catch
        {
        }
        try
        {
            int.Parse(playerInfo[5]);
            towns = int.Parse(playerInfo[5]);
        }
        catch
        {
        }
        if (points > 0 && towns > 0 && id > 0 && !name.Equals(""))
        {
            try
            {
                cm.UpdatePlayer(id, name, alliance_id, points, rank, towns);
            }
            catch
            {
            }
        }
        else
        {
            try
            {
                cm.DeletePlayer(id);
            }
            catch
            {
            }
        }
    }
}
文件:ContentManager.cs

public class ContentManager : IHttpModule
{
    SqlDataSource conn = new SqlDataSource(WebConfigurationManager.ConnectionStrings["DevConn"].ConnectionString, "");
    public void UpdatePlayer(int id, String name, int alliance_id, int points, int rank, int towns) {
        conn.UpdateCommandType = SqlDataSourceCommandType.StoredProcedure;
        conn.UpdateCommand = "UpdatePlayer";
        conn.UpdateParameters.Clear();
        conn.UpdateParameters.Add("id", id.ToString());
        conn.UpdateParameters.Add("name", name);
        conn.UpdateParameters.Add("alliance_id", alliance_id.ToString());
        conn.UpdateParameters.Add("points", points.ToString());
        conn.UpdateParameters.Add("rank", rank.ToString());
        conn.UpdateParameters.Add("towns", towns.ToString());
        conn.Update();
    }

    public void DeletePlayer(int id)
    {
        conn.DeleteCommandType = SqlDataSourceCommandType.StoredProcedure;
        conn.DeleteCommand = "DeletePlayer";
        conn.DeleteParameters.Clear();
        conn.DeleteParameters.Add("id", id.ToString());
        conn.Delete();
    }
}

如果一次只处理一个播放器,则需要进行批量上传

您需要处理FOR循环中的所有用户,然后执行“批量插入”

在我这里的工作,我可以批量插入的速度,我的硬盘可以读取

警告,大容量插入会锁定表,因此,如果您计划在导入期间使表完全可读,则可能必须为大容量插入设置批次

例如:10万行,10万批。 1) 锁台 2) 开始导入到10k行 3) 解锁表 4) 如果要提交更多行,请转到1

在步骤3和步骤4之间,会有一个中断,其他查询可能会在该表上运行


SQL和.NET几乎管理了所有这些,我刚刚为您解释了逻辑。你所需要做的就是阅读批量插入和批处理,一旦你得到它,这看起来非常容易。

你一次只处理一个播放器,你需要批量上传

您需要处理FOR循环中的所有用户,然后执行“批量插入”

在我这里的工作,我可以批量插入的速度,我的硬盘可以读取

警告,大容量插入会锁定表,因此,如果您计划在导入期间使表完全可读,则可能必须为大容量插入设置批次

例如:10万行,10万批。 1) 锁台 2) 开始导入到10k行 3) 解锁表 4) 如果要提交更多行,请转到1

在步骤3和步骤4之间,会有一个中断,其他查询可能会在该表上运行


SQL和.NET几乎管理了所有这些,我刚刚为您解释了逻辑。你所需要做的就是阅读批量插入和批处理,一旦你得到它,这看起来真的很容易。

过去每当我必须这样做时,我都会将数据输出到一个临时文本文件,然后用于将数据转储到数据库中。

过去每当我必须这样做时,我都会将数据输出到一个临时文本文件,然后用于将数据转储到数据库中。

谢谢你。我试图使用它,但我使用变量设置文件名(通过参数输入更新过程)。我正在使用Server.MapPath(“/App\u Data/players.txt”),但它在“C:”上抛出了一个错误。我认为是冒号引起了这个问题。已经尝试过URL和HTML编码,但没有效果。知道是什么原因吗?路径是相对于SQL server的,因此只有当应用程序盒和SQL盒共享同一个C驱动器时才能工作。谢谢。我试图使用它,但我使用变量设置文件名(通过参数输入更新过程)。我正在使用Server.MapPath(“/App\u Data/players.txt”),但它在“C:”上抛出了一个错误。我认为是冒号引起了这个问题。已经尝试过URL和HTML编码,但没有效果。知道是什么原因吗?路径是相对于SQL server的,因此只有当应用程序盒和SQL盒共享同一个C驱动器时,该路径才会工作。