Can anyone assist with performing BulkInsert and BulkUpdate operations on Snowflake tables using Dapper and C#. I am encountering issues where the values are not being inserted into the Snowflake tables. Any help would be greatly appreciated. Thanks in advance!
public async Task<int> BulkInsertAsync<T>(string tableName, IEnumerable<T> data, int batchSize = 1000)
{
int totalRowsAffected = 0;
var batches = data.Batch(batchSize);
foreach (var batch in batches)
{
string connstring = "connection string";
using SnowflakeDbConnection conn = new SnowflakeDbConnection();
conn.ConnectionString = connstring;
conn.Open();
using var transaction = conn.BeginTransaction();
try
{
var dataTable = batch.ToDataTable();
var sql = GenerateBulkInsertSql(tableName, dataTable);
var rowsAffected = await conn.ExecuteAsync(sql, dataTable, transaction: transaction);
transaction.Commit();
totalRowsAffected += rowsAffected;
}
catch
{
transaction.Rollback();
throw;
}
}
return totalRowsAffected;
}
private string GenerateBulkInsertSql(string tableName, DataTable dataTable)
{
var columns = string.Join(", ", dataTable.Columns.Cast<DataColumn>().Select(c => c.ColumnName));
var values = string.Join(", ", dataTable.Columns.Cast<DataColumn>().Select(c => ":" + c.ColumnName));
return $"INSERT INTO {tableName} ({columns}) VALUES ({values})";
}
public static DataTable ToDataTable<T>(this IEnumerable<T> data)
{
var dataTable = new DataTable();
var properties = typeof(T).GetProperties();
foreach (var prop in properties)
{
dataTable.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
}
foreach (var item in data)
{
var row = dataTable.NewRow();
foreach (var prop in properties)
{
row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
}
dataTable.Rows.Add(row);
}
return dataTable;
}