Start by making your code properly asynchronous, and wrapping the insert commands in a transaction.
ASP.NET Core:
public class DataController : Controller
{
[HttpPost]
[Route("data/import", Name = "DataImport")]
public async Task<IActionResult> Post()
{
try
{
using (var reader = new StreamReader(Request.Body, Encoding.UTF8))
{
await ImportDataAsync(reader);
return Ok("POST");
}
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
}
private async Task ImportData(TextReader input)
{
string connectionString = ConfigurationManager.ConnectionStrings["SQLDBCONN"].ConnectionString;
const string query = "INSERT INTO [dbo].[testImport] ([ID], [Type], [Status], [Description]) VALUES (@ID, @Type, @Status, @Description)";
using (SqlConnection sqldbConnection = new SqlConnection(connectionString))
{
await sqldbConnection.OpenAsync();
using (SqlTransaction transaction = sqldbConnection.BeginTransaction())
using (SqlCommand cmd = new SqlCommand(query, sqldbConnection, transaction))
{
var pID = cmd.Parameters.Add("@ID", SqlDbType.Int);
var pType = cmd.Parameters.Add("@Type", SqlDbType.VarChar);
var pStatus = cmd.Parameters.Add("@Status", SqlDbType.VarChar);
var pDescription = cmd.Parameters.Add("@Description", SqlDbType.VarChar);
string line = await input.ReadLineAsync();
while (line != null)
{
string[] parts = line.Split(',');
if (parts.Length < 4) throw new InvalidOperationException($"Invalid line: '{line}'");
pID.Value = parts[0];
pType.Value = parts[1];
pStatus.Value = parts[2];
pDescription.Value = parts[3];
await cmd.ExecuteNonQueryAsync();
line = await input.ReadLineAsync();
}
transaction.Commit();
}
}
}
}
ASP.NET Web API 2:
public class DataController : ApiController
{
[HttpPost]
[Route("data/import", Name = "DataImport")]
public async Task<IHttpActionResult> Post()
{
try
{
string content = await Request.Content.ReadAsStringAsync();
string[] lines = content.Split(Environment.NewLine);
await ImportDataAsync(lines);
return Ok("POST");
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
}
private async Task ImportData(IEnumerable<string> lines)
{
string connectionString = ConfigurationManager.ConnectionStrings["SQLDBCONN"].ConnectionString;
const string query = "INSERT INTO [dbo].[testImport] ([ID], [Type], [Status], [Description]) VALUES (@ID, @Type, @Status, @Description)";
using (SqlConnection sqldbConnection = new SqlConnection(connectionString))
{
await sqldbConnection.OpenAsync();
using (SqlTransaction transaction = sqldbConnection.BeginTransaction())
using (SqlCommand cmd = new SqlCommand(query, sqldbConnection, transaction))
{
var pID = cmd.Parameters.Add("@ID", SqlDbType.Int);
var pType = cmd.Parameters.Add("@Type", SqlDbType.VarChar);
var pStatus = cmd.Parameters.Add("@Status", SqlDbType.VarChar);
var pDescription = cmd.Parameters.Add("@Description", SqlDbType.VarChar);
foreach (string line in lines)
{
string[] parts = line.Split(',');
if (parts.Length < 4) throw new InvalidOperationException($"Invalid line: '{line}'");
pID.Value = parts[0];
pType.Value = parts[1];
pStatus.Value = parts[2];
pDescription.Value = parts[3];
await cmd.ExecuteNonQueryAsync();
}
transaction.Commit();
}
}
}
}
How you update the calling code to make that asynchronous will depend on which language you're using.