복붙노트

[SQL] C # SQL 삽입 명령

SQL

C # SQL 삽입 명령

사람이 나에게 기록이 더 나은 성능을 만들어 삽입하는 다음과 같은 두 가지 방법을 말할 수 있습니까?

사례 1

SqlCommand cmd = new SqlCommand();

for (int i = 0; i < 10000; i++)
{
  cmd = new SqlCommand("insert into test(id, name) value('" + i + "', '" + i + "')");
  cmd.ExecuteNonQuery();
}

사례 2

string sql = null;

for (int i = 0; i < 10000; i++)
{
  sql += "insert into test(id, name) value('" + i + "', '" + i + "')";
}

SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();

해결법

  1. ==============================

    1.첫째 : STOP 함께 당신의 SQL 코드을 연결! 이것은 SQL 주입을 공격 사방 해커에 초대합니다! 사용하는 대신 쿼리를 매개 변수화!

    첫째 : STOP 함께 당신의 SQL 코드을 연결! 이것은 SQL 주입을 공격 사방 해커에 초대합니다! 사용하는 대신 쿼리를 매개 변수화!

    나는이 솔루션을 사용하십시오 매개 변수화 쿼리 하나하는 SqlCommand를 만들고, 그 실행 :

    string stmt = "INSERT INTO dbo.Test(id, name) VALUES(@ID, @Name)";
    
    SqlCommand cmd = new SqlCommand(smt, _connection);
    cmd.Parameters.Add("@ID", SqlDbType.Int);
    cmd.Parameters.Add("@Name", SqlDbType.VarChar, 100);
    
    for (int i = 0; i < 10000; i++)
    {
        cmd.Parameters["@ID"].Value = i;
        cmd.Parameters["@Name"].Value = i.ToString();
    
        cmd.ExecuteNonQuery();
    }
    

    또는 당신이 더 10'000 행 이상의 삽입하고, 특히, SqlBulkCopy의를 사용합니다.

  2. ==============================

    2.두 번째 방법의 외모는 빠른 # 1보다 한 번에 삽입 명령을 보낼 수 있기 때문이다. 처음에 각 ExecuteNonQuery는 대한 SQL 서버에 왕복이있다.

    두 번째 방법의 외모는 빠른 # 1보다 한 번에 삽입 명령을 보낼 수 있기 때문이다. 처음에 각 ExecuteNonQuery는 대한 SQL 서버에 왕복이있다.

    그러나 명령 삽입 대량 시도해야합니다 : 대량 INSERT (Transact-SQL)를, 난 당신이 제공하는 옵션 중 하나보다 더 나은 성능을 얻을 것 같아요.

    []'에스

  3. ==============================

    3.그대로, 어느 경우 작동하는지 정확히 알아야한다.

    그대로, 어느 경우 작동하는지 정확히 알아야한다.

    사례 # 1 지정할 수있는 연결이 필요합니다.

    사례 # 2과 같이 여러 명령을 실행하기 위해 세미콜론 명령문을 종료하도록 요구합니다 :

    string sql = null;
    
    for (int i = 0; i < 10000; i++)
    {
      sql += "insert into test(id, name) value('" + i + "', '" + i + "');";
    }
    
    SqlCommand cmd = new SqlCommand(sql, conn);
    cmd.ExecuteNonQuery();
    

    당신은 단지 몇 천 행에 자신을 테스트하기 위해 궁극적으로 가장 좋은 방법은 될 것입니다. 내 생각뿐만 아니라 그것은 단지 하나의 SqlCommand 개체를 설정 필요하기 때문 사례 # 2는 성능을 위해 더 나은 될 것이라고 겠지만, 그것은 단지 데이터베이스를 하나의 시간을 안타.

  4. ==============================

    4.나는 두 번째가 작동합니다 생각하지 않습니다.

    나는 두 번째가 작동합니다 생각하지 않습니다.

    이 하나의 INSERT 문에 여러 행을 삽입하는 SQL Server 2008의 구문은 그러나 내가 그 빨리 모두보다 당신이 제안한 옵션이 될 것이라고 생각 :

    INSERT INTO test (id, name)
    VALUES
    ('1', 'foo'),
    ('2', 'bar'),
    ('3', 'baz')
     -- etc...
    

    당신이 정말로 높은 성능을 원하는 경우 그러나, SqlBulkCopy의 클래스를 사용하는 것이 좋습니다.

  5. ==============================

    5.단일 왕복으로 끝낼 때문에 두 번째는, 빠른 아마도. 매개 변수가있는 쿼리를 사용하지 않기 때문에 둘 다 똑같이 끔찍한 있습니다.

    단일 왕복으로 끝낼 때문에 두 번째는, 빠른 아마도. 매개 변수가있는 쿼리를 사용하지 않기 때문에 둘 다 똑같이 끔찍한 있습니다.

  6. from https://stackoverflow.com/questions/8218867/c-sharp-sql-insert-command by cc-by-sa and MIT license