Net 4.0 avec Dapper et Ms Sql 2000

c# c#-4.0 dapper sql-server sql-server-2000

Question

Comme nous le savons, Ms Sql 2000 ne supporte pas MultipleActiveResultSets.

Puis-je utiliser Dapper avec async Task sans exceptions:

"Il existe déjà un DataReader ouvert associé à cette commande qui doit être fermé en premier."

Mon exemple de code

private async void Form_Load(object sender, EventArgs e){
var sql1 = "select * from Tab1";
var sql2 = "select * from Tab2";
var sql3 = "select * from Tab3";

await Task.Factory.StartNew(() => FillComboBoxWithData(this.cbo1, sql1));
await Task.Factory.StartNew(() => FillComboBoxWithData(this.cbo2, sql2));
await Task.Factory.StartNew(() => FillComboBoxWithData(this.cbo3, sql3));

}

public static async Task FillComboBoxWithData(ComboBox comboBox, string sql{
try
{

    var data = await Task.Factory.StartNew(() => SqlConn.Query<IdName>(sql));
    var d1 = data.ToNonNullList();

    comboBox.DataSource = d1;

    comboBox.DisplayMember = "Name";
    comboBox.ValueMember = "Id";
    comboBox.SelectedItem = null;
}
catch (Exception ex)
{
    Console.Write(ex.ToString());
}

}

Je vous remercie.

Réponse acceptée

Il semble que votre code devrait fonctionner, même si je ne comprends pas très bien pourquoi vous utilisez Task.Factory.StartNew partout. vous ne devriez pas avoir à faire cela, et en effet: ce n'est pas l'idéal pour le faire.

Je ne vois pas non plus comment / où SqlConn est défini, donc pour tout ce que je sais, il est effectivement accessible simultanément. Cependant, pour réécrire votre code plus idiomatiquement:

private async void Form_Load(object sender, EventArgs e)
{
    await FillComboBoxWithData(this.cbo1, "select from Tab1");
    await FillComboBoxWithData(this.cbo2, "select from Tab2");
    await FillComboBoxWithData(this.cbo3, "select from Tab3");
}

public static async Task FillComboBoxWithData(ComboBox comboBox, string sql)
{
    try
    {
        var data = (await SqlConn.QueryAsync<IdName>(sql)).AsList();

        comboBox.DataSource = data;
        comboBox.DisplayMember = "Name";
        comboBox.ValueMember = "Id";
        comboBox.SelectedItem = null;
    }
    catch (Exception ex)
    {
        Console.Write(ex.ToString());
    }
}

Remarque: no Task.Factory.StartNew ; il utilise l'implémentation asynchrone du service de sauvegarde.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi