using
System;
System.Collections.Generic;
System.Data;
System.Data.SqlClient;
System.Diagnostics;
System.Linq;
System.Text;
System.Threading.Tasks;
namespace
SqlServerConventional.Classes
{
public
class
DataOperations
private
static
string
_connectionString =
""
;
bool
RunWithoutIssues =
false
HasException {
get
set
; }
IsSuccessful => HasException ==
ExceptionMessage {
delegate
void
OnConnectionFinished(
timeSpent);
event
OnConnectionFinished ConnectionFinished;
DataTable ReadProducts()
HasException =
var table =
new
DataTable();
_connectionString = RunWithoutIssues ?
"Data Source=.\\sqlexpressISSUE;Initial Catalog=NorthWind2020;Integrated Security=True"
:
"Data Source=.\\sqlexpress;Initial Catalog=NorthWind2020;Integrated Security=True"
(var cn =
SqlConnection(_connectionString))
(var cmd =
SqlCommand() {Connection = cn})
cmd.CommandText = SelectStatement();
var timer =
Stopwatch();
timer.Start();
try
cn.Open();
table.Load(cmd.ExecuteReader());
}
catch
(Exception e)
true
ExceptionMessage = e.Message;
timer.Stop();
TimeSpan timeTaken = timer.Elapsed;
ConnectionFinished?.Invoke(timeTaken.ToString(@
"m\:ss\.fff"
));
return
table;
SelectStatement()
"SELECT P.ProductID, P.ProductName, P.SupplierID, S.CompanyName, P.CategoryID, "
+
"C.CategoryName, P.QuantityPerUnit, P.UnitPrice, P.UnitsInStock, P.UnitsOnOrder, "
"P.ReorderLevel, P.Discontinued, P.DiscontinuedDate "
"FROM Products AS P INNER JOIN Categories AS C ON P.CategoryID = C.CategoryID "
"INNER JOIN Suppliers AS S ON P.SupplierID = S.SupplierID"
System.Windows.Forms;
SqlServerConventional.Classes;
SqlServerConventional
partial
Form1 : Form
Form1()
InitializeComponent();
DataOperations.ConnectionFinished += DataOperationsConnectionFinished;
Shown += OnShown;
DataOperationsConnectionFinished(
timeSpent)
finishedLabel.Text = timeSpent;
async
OnShown(
object
sender, EventArgs e)
await LoadData();
Form1_Load(
async Task LoadData()
dataGridView1.DataSource =
null
await Task.Delay(1000);
DataOperations.RunWithoutIssues = NoIssuesCheckBox.Checked;
var table = DataOperations.ReadProducts();
if
(DataOperations.IsSuccessful)
dataGridView1.DataSource = table;
else
MessageBox.Show($
"Ran into issues\n{DataOperations.ExceptionMessage}"
);
LoadProductsButton.Enabled =
NoIssuesCheckBox.Checked =
LoadProductsButton_Click(
CancellationTokenSource _cancellationTokenSource =
CancellationTokenSource(TimeSpan.FromSeconds(4));
System.Threading;
SqlServerAsyncRead.Classes;
SqlServerAsyncRead
await LoadData(
async Task LoadData(
firstTime =
)
(!firstTime)
(_cancellationTokenSource.IsCancellationRequested)
_cancellationTokenSource.Dispose();
_cancellationTokenSource =
var dataResults = await DataOperations.ReadProductsTask(_cancellationTokenSource.Token);
(dataResults.HasException)
MessageBox.Show(dataResults.ConnectionFailed ? @
"Connection failed"
: dataResults.GeneralException.Message);
dataGridView1.DataSource = dataResults.DataTable;
NoIssuesCheckBox_CheckedChanged(
SqlServerAsyncRead.Classes
async Task<DataTableResults> ReadProductsTask(CancellationToken ct)
var result =
DataTableResults() {DataTable =
DataTable()};
await Task.Run(async () =>
SqlCommand() { Connection = cn })
await cn.OpenAsync(ct);
(TaskCanceledException tce)
Exceptions.Write(tce, ExceptionLogType.ConnectionFailure,
$
"Connection string '{_connectionString}'"
result.ConnectionFailed =
result.ExceptionMessage =
"Connection Failed"
result;
(Exception ex)
Exceptions.Write(ex, ExceptionLogType.General);
result.GeneralException = ex;
result.DataTable.Load(await cmd.ExecuteReaderAsync(ct));
});
System.Console;
ConsoleBasics
Program
async Task Main()
WriteLine(
"Greetings"
"Before work"
await PerformDoNothingWorkTask(1000);
"After work"
"Timed out"
"Finished"
"Close me"
ReadLine();
async Task PerformDoNothingWorkTask(
int
time)
var ct =
CancellationTokenSource(time);
var wasteTimeTask = Task.Run(async () =>
await Task.Delay(2000, ct.Token);
"Task Running"
"still running"
"Not dead yet"
"Task done"
}, ct.Token);
success;
await wasteTimeTask;
success =
(OperationCanceledException)
WriteLine(success ?
"Task finished in time"
"Task took too long"