.net C#中的SQL大量复制/插入

ghhaqwfi  于 2022-11-26  发布在  .NET
关注(0)|答案(5)|浏览(94)

我是JSON和SQLBulkCopy的新手。我有一个JSON格式的POST数据,我想使用C#在Microsoft SQL中批量复制/插入。
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;}
}

我怎样才能有效地做到这一点?

toiithl6

toiithl61#

TL;DR如果数据已经表示为DataTable,则可以使用SqlBulkCopy将其插入到服务器上的目标表:

string csDestination = "put here the a connection string to the database";

using (SqlConnection connection = new SqlConnection(csDestination))
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
    connection.Open()
    bulkCopy.DestinationTableName = "TUrls";
    bulkCopy.WriteToServer(dataTableOfUrls);
}

如果你只想加载“10到50个URL”,就不需要使用SqlBulkCopy--它的通用目的是消除数千个单独的插入。
因此,插入而不插入SqlBulkCopy [并且不插入EntityFramework]可以逐个进行:

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);

    // Remember to take care of connection! I omit this part for clarity
    cmd.ExecuteNonQuery();
}

要插入带有**SqlBulkCopy的数据**,您需要将您的数据(例如自定义类对象列表)转换为DataTable。以下是引用Marc Gravell's answer作为此类转换的通用解决方案的示例:
这里有一个很好的2013年更新使用FastMember从NuGet:

IEnumerable<SomeType> data = ...
DataTable table = new DataTable();
using(var reader = ObjectReader.Create(data)) {
    table.Load(reader);
}

是的,这和这个正好相反;反射就足够了--或者如果您需要更快的速度,可以使用Python 2.0中的HyperDescriptor,或者Python 3.5中的Expression。实际上,HyperDescriptor应该绰绰有余。
例如:

// remove "this" if not on C# 3.0 / .NET 3.5
public static DataTable ToDataTable<T>(this IList<T> data)
{
    PropertyDescriptorCollection props =
        TypeDescriptor.GetProperties(typeof(T));
    DataTable table = new DataTable();
    for(int i = 0 ; i < props.Count ; i++)
    {
        PropertyDescriptor prop = props[i];
        table.Columns.Add(prop.Name, prop.PropertyType);
    }
    object[] values = new object[props.Count];
    foreach (T item in data)
    {
        for (int i = 0; i < values.Length; i++)
        {
            values[i] = props[i].GetValue(item);
        }
        table.Rows.Add(values);
    }
    return table;        
}

现在,将数据表示为DataTable,就可以将其写入服务器上的目标表:

string csDestination = "put here the a connection string to the database";

using (SqlConnection connection = new SqlConnection(csDestination))
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
    connection.Open();
    bulkCopy.DestinationTableName = "TUrls";
    bulkCopy.WriteToServer(dataTableOfUrls);
}

希望能有所帮助。

更新日期:

1.* @pseudonym27问题的答案:“您好,我可以使用BulkCopy类将数据追加到SQL数据库中的现有表吗?"*
是的,您可以- BulkCopy就像一个插入命令一样工作,它追加数据。
此外,如果操作出错的可能性很高(例如,插入时间长和连接问题),并且您希望尽可能少地忙碌/锁定目标表,请考虑使用中间表。当然,中间表的另一个用例是在插入之前需要进行一些数据转换。

u4vypkhs

u4vypkhs2#

使用下面的代码,可以将List<YourClassname>转换为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包含list<YourClass>对象,你也可以执行-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();
            }
        }
    }
}

希望,这些代码帮助你!!!

csbfibhn

csbfibhn3#

如果您使用的是〉sql server 2005,则应该使用Table valued parameters.

qyuhtwio

qyuhtwio4#

如果只有10-50个网址,插入频率不高,你可以使用insert语句,简单而不麻烦,你可以使用一些简单快捷的语句,比如dapper。
否则,如果您需要批量复制,则需要首先从JSON创建并填充ADO .NET数据表-最好与目标sql表的架构匹配。这由您选择。

vnzz0bqm

vnzz0bqm5#

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);
   }
}

相关问题