Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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# 在SQL Server上使用C在临时表中插入30000行的最快方法#_C#_Sql_Sql Server_Bulkinsert_Sqlbulkcopy - Fatal编程技术网

C# 在SQL Server上使用C在临时表中插入30000行的最快方法#

C# 在SQL Server上使用C在临时表中插入30000行的最快方法#,c#,sql,sql-server,bulkinsert,sqlbulkcopy,C#,Sql,Sql Server,Bulkinsert,Sqlbulkcopy,我试图找出如何使用c#提高SQL Server中临时表的插入性能。有些人说我应该使用SQLBulkCopy,但我一定是做错了什么,因为它似乎比简单地构建SQL插入字符串慢得多 我使用SQLBulkCopy创建表的代码如下: public void MakeTable(string tableName, List<string> ids, SqlConnection connection) { SqlCommand cmd = new SqlCommand("

我试图找出如何使用c#提高SQL Server中临时表的插入性能。有些人说我应该使用SQLBulkCopy,但我一定是做错了什么,因为它似乎比简单地构建SQL插入字符串慢得多

我使用SQLBulkCopy创建表的代码如下:

public void MakeTable(string tableName, List<string> ids, SqlConnection connection)
    {

        SqlCommand cmd = new SqlCommand("CREATE TABLE ##" + tableName + " (ID int)", connection);
        cmd.ExecuteNonQuery();

        DataTable localTempTable = new DataTable(tableName);

        DataColumn id = new DataColumn();
        id.DataType = System.Type.GetType("System.Int32");
        id.ColumnName = "ID";
        localTempTable.Columns.Add(id);

        foreach (var item in ids)
        {
             DataRow row = localTempTable.NewRow();
             row[0] = item;
             localTempTable.Rows.Add(row);
             localTempTable.AcceptChanges();
        }


        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
        {
            bulkCopy.DestinationTableName = "##" + tableName;
            bulkCopy.WriteToServer(localTempTable);

        }
    }

因为我看到有人(在堆栈交换上)告诉我应该使用SQLBulkCopy,这样会更快,我相信我应该改进我的方法。因此,如果有人能建议我如何改进SQLBulkCopy代码,或者告诉我是否有更好的insert语句可以提高我的应用程序的性能,那就太好了。

您的问题可能出在
localtentable.AcceptChanges()因为它提交了您的更改。
如果你做下一步,我想它会跑得更快

    foreach (var item in ids)
    {
         DataRow row = localTempTable.NewRow();
         row[0] = item;
         localTempTable.Rows.Add(row);

    }

    localTempTable.AcceptChanges();

    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
    {
        bulkCopy.DestinationTableName = "##" + tableName;
        bulkCopy.WriteToServer(localTempTable);

    }

提交自加载或删除此数据集以来对此数据集所做的所有更改 自从上次调用AcceptChanges以来


我自己用秒表对象运行这段代码来测量时间。每一次迭代中的变化都会使速度变慢

public void MakeTable(string tableName, List<string> ids, SqlConnection connection)
{
    SqlCommand cmd = new SqlCommand("CREATE TABLE ##" + tableName + " (ID int)", connection);
    cmd.ExecuteNonQuery();

    DataTable localTempTable = new DataTable(tableName);

    DataColumn id = new DataColumn();
    id.DataType = System.Type.GetType("System.Int32");
    id.ColumnName = "ID";
    localTempTable.Columns.Add(id);

    System.Diagnostics.Stopwatch sw1 = new System.Diagnostics.Stopwatch();        

    sw1.Start();
    foreach (var item in ids)
    {
        DataRow row = localTempTable.NewRow();
        row[0] = item;
        localTempTable.Rows.Add(row);

    }
    localTempTable.AcceptChanges();
    long temp1 = sw1.ElapsedMilliseconds;
    sw1.Reset();
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
    {
        bulkCopy.DestinationTableName = "##" + tableName;
        bulkCopy.WriteToServer(localTempTable);

    }
    long temp2 = sw1.ElapsedMilliseconds;
}
public void MakeTable(字符串tableName、列表id、SqlConnection)
{
SqlCommand cmd=newsqlcommand(“创建表##”+tableName+“(ID int)”,连接);
cmd.ExecuteNonQuery();
DataTable localtentable=新的DataTable(tableName);
DataColumn id=新的DataColumn();
id.DataType=System.Type.GetType(“System.Int32”);
id.ColumnName=“id”;
localtentable.Columns.Add(id);
System.Diagnostics.Stopwatch sw1=新的System.Diagnostics.Stopwatch();
sw1.Start();
foreach(ID中的变量项)
{
DataRow row=localtentable.NewRow();
行[0]=项目;
localtentable.Rows.Add(row);
}
localetreable.AcceptChanges();
长temp1=sw1.elapsedmillyses;
sw1.Reset();
使用(SqlBulkCopy-bulkCopy=newsqlbulkcopy(连接))
{
bulkCopy.DestinationTableName=“##”+表名;
bulkCopy.WriteToServer(LocalTestable);
}
长temp2=sw1.elapsedmillyses;
}
AccpetChanges位于foreach循环内时的结果

而当它不是

差别有三个数量级:)

使用它,它会运行得更快

而不是
cmd.ExecuteNonQuery()
执行


这个字符串列表的数据首先来自哪里?它将是来自另一个应用程序的一组键。我还没有完成这个链接。现在它是我用一些id创建的一个数组,用于测试。30000个id可能来自某个数据库。如果是这样的话,我将寻找一种用sql完成所有这些的方法。它可能不会来自sql,这就是为什么需要为我的案例创建一个临时表的原因。它确实运行得更快。谢谢使用IDataReader比使用DataTable好,这是对的,但是使用
cmd.executeReader()
是错误的,它仍然应该是
cmd.ExecuteNonQuery()    foreach (var item in ids)
    {
         DataRow row = localTempTable.NewRow();
         row[0] = item;
         localTempTable.Rows.Add(row);

    }

    localTempTable.AcceptChanges();

    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
    {
        bulkCopy.DestinationTableName = "##" + tableName;
        bulkCopy.WriteToServer(localTempTable);

    }
public void MakeTable(string tableName, List<string> ids, SqlConnection connection)
{
    SqlCommand cmd = new SqlCommand("CREATE TABLE ##" + tableName + " (ID int)", connection);
    cmd.ExecuteNonQuery();

    DataTable localTempTable = new DataTable(tableName);

    DataColumn id = new DataColumn();
    id.DataType = System.Type.GetType("System.Int32");
    id.ColumnName = "ID";
    localTempTable.Columns.Add(id);

    System.Diagnostics.Stopwatch sw1 = new System.Diagnostics.Stopwatch();        

    sw1.Start();
    foreach (var item in ids)
    {
        DataRow row = localTempTable.NewRow();
        row[0] = item;
        localTempTable.Rows.Add(row);

    }
    localTempTable.AcceptChanges();
    long temp1 = sw1.ElapsedMilliseconds;
    sw1.Reset();
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
    {
        bulkCopy.DestinationTableName = "##" + tableName;
        bulkCopy.WriteToServer(localTempTable);

    }
    long temp2 = sw1.ElapsedMilliseconds;
}
cmd.ExecuteReader()