C# 如何提高.NET windows应用程序中保存多行的效率?

C# 如何提高.NET windows应用程序中保存多行的效率?,c#,sql,asp.net,sql-server,windows-applications,C#,Sql,Asp.net,Sql Server,Windows Applications,在我的.NET Windows应用程序中,我每次需要插入大约1000万个数据。但是,根据我效率低下的代码,保存到SQL server需要5分钟以上。有什么最佳方法可以最大限度地减少保存这些数据所需的时间 private void saveAllDataInGrid() { int rowCount = dataGridView1.RowCount; String str = "server=DESKTOP-TDV8JQ7;database=ExcelFi

在我的.NET Windows应用程序中,我每次需要插入大约1000万个数据。但是,根据我效率低下的代码,保存到SQL server需要5分钟以上。有什么最佳方法可以最大限度地减少保存这些数据所需的时间

private void saveAllDataInGrid()
    {
        int rowCount = dataGridView1.RowCount;

        String str = "server=DESKTOP-TDV8JQ7;database=ExcelFileApp;Integrated Security=SSPI";
        SqlConnection con = new SqlConnection(str);
        con.Open();
        for (int count = 0; count < rowCount; count++)
        {
            try
            {
                String query = "insert into TemMainTable values (@p1,@p2,@p3,@p4,@p5,@p6,@p7,@p8,@p9,@p10,@p11,@p12,@p13,@p14,@p15,@p16,@p17,@p18,@p19,@p20,@p21,@p22,@p23)";
                SqlCommand cmd = new SqlCommand(query, con);

                cmd.Parameters.AddWithValue("@p1", dataGridView1.Rows[count].Cells[0].Value.ToString());
                cmd.Parameters.AddWithValue("@p2", dataGridView1.Rows[count].Cells[1].Value.ToString());
                cmd.Parameters.AddWithValue("@p3", dataGridView1.Rows[count].Cells[2].Value.ToString());
                cmd.Parameters.AddWithValue("@p4", dataGridView1.Rows[count].Cells[3].Value.ToString());
                cmd.Parameters.AddWithValue("@p5", dataGridView1.Rows[count].Cells[4].Value.ToString());
                cmd.Parameters.AddWithValue("@p6", dataGridView1.Rows[count].Cells[5].Value.ToString());
                cmd.Parameters.AddWithValue("@p7", dataGridView1.Rows[count].Cells[6].Value.ToString());
                cmd.Parameters.AddWithValue("@p8", dataGridView1.Rows[count].Cells[7].Value.ToString());
                cmd.Parameters.AddWithValue("@p9", dataGridView1.Rows[count].Cells[8].Value.ToString());
                cmd.Parameters.AddWithValue("@p10", dataGridView1.Rows[count].Cells[9].Value.ToString());
                cmd.Parameters.AddWithValue("@p11", dataGridView1.Rows[count].Cells[10].Value.ToString());
                cmd.Parameters.AddWithValue("@p12", dataGridView1.Rows[count].Cells[10].Value.ToString());
                cmd.Parameters.AddWithValue("@p13", dataGridView1.Rows[count].Cells[12].Value.ToString());
                cmd.Parameters.AddWithValue("@p14", dataGridView1.Rows[count].Cells[13].Value.ToString());
                cmd.Parameters.AddWithValue("@p15", dataGridView1.Rows[count].Cells[14].Value.ToString());
                cmd.Parameters.AddWithValue("@p16", dataGridView1.Rows[count].Cells[15].Value.ToString());
                cmd.Parameters.AddWithValue("@p17", dataGridView1.Rows[count].Cells[16].Value.ToString());
                cmd.Parameters.AddWithValue("@p18", dataGridView1.Rows[count].Cells[17].Value.ToString());
                cmd.Parameters.AddWithValue("@p19", dataGridView1.Rows[count].Cells[18].Value.ToString());
                cmd.Parameters.AddWithValue("@p20", dataGridView1.Rows[count].Cells[19].Value.ToString());
                cmd.Parameters.AddWithValue("@p21", dataGridView1.Rows[count].Cells[20].Value.ToString());
                cmd.Parameters.AddWithValue("@p22", dataGridView1.Rows[count].Cells[21].Value.ToString());
                cmd.Parameters.AddWithValue("@p23", dataGridView1.Rows[count].Cells[22].Value.ToString());

                int i = cmd.ExecuteNonQuery();

                lblDataSaved.Text = "No of rows Saved : " + rowCount;
            }
            catch (Exception es)
            {
                MessageBox.Show(es.Message);
            }
        }
        con.Close();
        MessageBox.Show("Successfully Saved");
    }
private void saveAllDataInGrid()
{
int rowCount=dataGridView1.rowCount;
String str=“server=DESKTOP-TDV8JQ7;database=ExcelFileApp;integratedsecurity=SSPI”;
SqlConnection con=新的SqlConnection(str);
con.Open();
对于(int count=0;count

谢谢

您可以使用
用户定义的表类型
进行批量插入。您需要在数据库中创建
用户定义的表类型
SQLServerManagementStudio>>可编程性>>用户定义的表类型

CREATE TYPE [dbo].[TableList] AS TABLE(
    [SampleColumn1] [bigint] NOT NULL,
    [SampleColumn2] [nvarchar](100) NOT NULL    
)
SQL脚本语法如下,用于创建
用户定义的表类型

CREATE TYPE [dbo].[TableList] AS TABLE(
    [SampleColumn1] [bigint] NOT NULL,
    [SampleColumn2] [nvarchar](100) NOT NULL    
)
示例SQL Insert查询如下所示-

INSERT  INTO SampleTable
        ( SampleColumn1 ,
          SampleColumn2

        )
        SELECT  cusTbl.SampleColumn1 ,
                cusTbl.SampleColumn2
        FROM    @TableList AS cusTbl;
SqlCommand cmd = new SqlCommand(query, con);    
var tvparam = cmd.Parameters.AddWithValue("@TableList", tableList);
tvparam.SqlDbType = SqlDbType.Structured;
tvparam.TypeName = "dbo.TableList" 
cmd.Connection.Open();
cmd.ExecuteNonQuery();
在C#代码中-插入的一般语法如下-

INSERT  INTO SampleTable
        ( SampleColumn1 ,
          SampleColumn2

        )
        SELECT  cusTbl.SampleColumn1 ,
                cusTbl.SampleColumn2
        FROM    @TableList AS cusTbl;
SqlCommand cmd = new SqlCommand(query, con);    
var tvparam = cmd.Parameters.AddWithValue("@TableList", tableList);
tvparam.SqlDbType = SqlDbType.Structured;
tvparam.TypeName = "dbo.TableList" 
cmd.Connection.Open();
cmd.ExecuteNonQuery();
注意:您在Windows应用程序中使用了
DataGridView
。因此,您可以轻松地传递用于绑定
DataGridView
DataTable
。 注意
DataTable
具有相同的
ColumnName
DataType
,这是在SQL Server数据库
用户定义的表类型中声明的

CREATE TYPE [dbo].[TableList] AS TABLE(
    [SampleColumn1] [bigint] NOT NULL,
    [SampleColumn2] [nvarchar](100) NOT NULL    
)
我每次需要插入大约1000万个数据。但是,这需要5分钟以上的时间 与逐个向SQL Server发送行相比,插入所需的时间肯定会减少。

1。在事务中执行此操作,2。使用存储过程,3。并行化代码查看:看起来您正在将datagridview传输到sql server数据库中。datagridview上的数据来自哪里?你不能告诉我有人在datagridview中键入了100万行数据。将许多行插入SQL Server表的.NET最有效的方法是使用SqlBulkCopy类。如果数据来自Excel文件,则可以从中获取数据读取器并调用SqlBulkCopy.WriteToServer