복붙노트

[SQL] C #에서 SQL을 대량 복사 / 삽입

SQL

C #에서 SQL을 대량 복사 / 삽입

내가 JSON과 SqlBulkCopy의 새로운 오전. 내가 JSON 내가 C # .NET을 사용하여 Microsoft SQL에서 대량 복사 / 삽입 할 것을 POST 데이터를 포맷해야합니다.

JSON 형식 :

{
    "URLs": [{
        "url_name": "Google",
        "url_address": "http://www.google.com/"
    },
    {
        "url_name": "Yahoo",
        "url_address": "http://www.yahoo.com/"
    },
    {
        "url_name": "FB",
        "url_address": "http://www.fb.com/"
    },
    {
        "url_name": "MegaSearches",
        "url_address": "http://www.megasearches.com/"
    }]
}

클래스:

public class UrlData
{
    public List<Url> URLs {get;set;}
}

public class Url
{
    public string url_address {get;set;}
    public string url_name {get;set;}
}

어떻게 효율적으로 그렇게 할 수 있습니까?

해결법

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

    1.당신이 SqlBulkCopy의를 사용할 필요는 분명히 없다 10 ~ 50 URL의로드해야하기 때문에 - 그것은 삽입의 수천입니다. 당신은이 작업을 여러 번 반복하는 데 필요한 것입니다 경우를 제외하고.

    당신이 SqlBulkCopy의를 사용할 필요는 분명히 없다 10 ~ 50 URL의로드해야하기 때문에 - 그것은 삽입의 수천입니다. 당신은이 작업을 여러 번 반복하는 데 필요한 것입니다 경우를 제외하고.

    그래서, 당신은 URL 목록이있는 경우, 즉 목록, 데이터베이스에 그럼 그냥 목록에서 모든 URL을 반복하고 삽입, 예를 들어,

    string insertQuery = "insert into TUrls(address, name) values(@address, @name)";
    foreach (URL url in listOfUrls)
    {
        SqlCommand cmd = new SqlCommand(insertQuery);
        cmd.Parameters.AddWithValue("@name", url.url_name);
        cmd.Parameters.AddWithValue("@address", url.urld_address);
    
        // don't forget to take care of connection - I omit this part for clearness
        cmd.ExecuteNonQuery();
    }
    

    당신이 정말로 SqlBulkCopy의를 사용해야한다면 당신은 DataTable의에 클래스 URL의 개체를 변환해야합니다. 마크 Gravell의 대답에 표정이 작업을 수행하려면 :

    그래서 당신은 목록에서의 DataTable을 만들 마크의 솔루션 중 하나를 사용할 수 있습니다. 그럼 그냥 서버에서 대상 테이블에 테이블을 작성해야합니다 :

    string csDestination = "put here connection string to database";
    
    using (SqlConnection destinationConnection = new SqlConnection(csDestination))
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection))
    {
        bulkCopy.DestinationTableName = "TUrls";
        bulkCopy.WriteToServer(dataTableOfUrls);
    }
    

    희망이 도움이.

    UPD

    대량 복사가 아니라 단지 명령을 삽입 작동하지만, 모두의 약간의 다른를 않기 때문에, 당신이 할 수 물론. 내가 잘못 갈 높은 확률을 가지고 경우 작업에서 중간 테이블을 사용하도록 권하고 싶습니다 (당신은 가능한 한 짧은 시간으로 목적지 테이블 바쁜하려는)하거나 일부 데이터 변환을 할 필요가 있지만,의 필요성을 느낄 경우에만 그것.

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

    2.코드 아래에이를 사용하여 DataTable을에 목록 을 변환 할 수 있습니다 : -

    코드 아래에이를 사용하여 DataTable을에 목록 을 변환 할 수 있습니다 : -

    List<YourClass> objlist = alldata;
    string json = Newtonsoft.Json.JsonConvert.SerializeObject(objlist);
    DataTable dt = Newtonsoft.Json.JsonConvert.DeserializeObject<DataTable>(json);
    SaveDataInTables(dt, "Table_Name_Of_SQL");
    

    여기, 내가 ALLDATA 목록 개체를 포함 있으리라 믿고있어 당신도 할 수있는 - objlist.Add (objYourClass를) 다음 SaveDataInTables 방법에 sql_TableName 및 데이터 테이블을 전달합니다. 이 방법은 SQL_Table의 모든 데이터를 삽입합니다.

    public void SaveDataInTables(DataTable dataTable, string tablename)
    {
       if (dataTable.Rows.Count > 0)
       {
           using (SqlConnection con = new SqlConnection("Your_ConnectionString"))
           {
               using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))
               {
                   sqlBulkCopy.DestinationTableName = tablename;
                   con.Open();
                   sqlBulkCopy.WriteToServer(dataTable);
                   con.Close();
                }
            }
        }
    }
    

    희망은,이 코드는 당신을 도와!

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

    3.당신은 테이블 반환 매개 변수를 사용해야합니다. 당신이> SQL 서버 2005을 사용하는 경우에는 여기에 예를 가질 수 있습니다

    당신은 테이블 반환 매개 변수를 사용해야합니다. 당신이> SQL 서버 2005을 사용하는 경우에는 여기에 예를 가질 수 있습니다

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

    4.그것의 유일한 10 ~ 50 URL이, 자주 삽입되는 경우에, 당신은 문 삽입 해고 할 수 있습니다. 간단하고 덜 번거 로움 당신은 날씬한처럼 쉽고 빠르게 무언가를 사용할 수 있습니다.

    그것의 유일한 10 ~ 50 URL이, 자주 삽입되는 경우에, 당신은 문 삽입 해고 할 수 있습니다. 간단하고 덜 번거 로움 당신은 날씬한처럼 쉽고 빠르게 무언가를 사용할 수 있습니다.

    당신이 대량 복사를 원하는 다른 경우, 작성하고 먼저 JSON에서 ADO.NET의 데이터 테이블을 채우기 위해 필요 - 가급적 대상 SQL 테이블의 스키마와 일치. 그것은 당신의 선택입니다.

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

    5.

    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
    {
       bulkCopy.DestinationTableName = "dbo.LogData";
       try
       {
          // Write from the source to the destination.
          connection.Open();
          bulkCopy.WriteToServer(dataTable1);
          connection.Close();
       }
       catch (Exception ex)
       {
          Console.WriteLine(ex.Message);
       }
    }
    
  6. ==============================

    6.난 당신이 사용중인 데이터베이스 모른다. 하지만 포스트 그레스 경험을 가지고 있고 나는이 다른 관계형 데이터베이스에서 유사하다 가정 :

    난 당신이 사용중인 데이터베이스 모른다. 하지만 포스트 그레스 경험을 가지고 있고 나는이 다른 관계형 데이터베이스에서 유사하다 가정 :

    데이터베이스에서 당신은 CSV로 구분 된 값 (e.g.Postgres)에서도 복사 할 수 있습니다. 당신이 expeted 입력 형식에 따라 문자열을 포맷하면이 가장 빠른 방법이 될 것이다.

  7. from https://stackoverflow.com/questions/18841000/sql-bulk-copy-insert-in-c-sharp by cc-by-sa and MIT license