2016-03-14 53 views
0

@ Micha-kun指出了一個很好的示例,說明如何執行不帶參數的存儲過程或只是一個直接的sql查詢。但是,如果我需要執行3個沒有參數的存儲過程2和1個帶參數的存儲過程呢?通過RegisterAsyncTask使用參數查詢

private Task LoadDataAsync() 
{ 
    var t1 = ExecuteQueryAsync(databaseConnection, "exec FirstGraders "); 
    var t2 = ExecuteQueryAsync(databaseConnection, "exec SecondGraders "); 
    var t3 = ExecuteQueryAsync(databaseConnection, "exec ThirdGraders "); 
    return Task.Factory.ContinueWhenAll(new[] { t1, t2, t3 }, _ => { 
    gv1.DataSource = t1.Result; 
    gv1.DataBind(); 
    gv2.DataSource = t2.Result; 
    gv2.DataBind(); 
    gv3.DataSource = t3.Result; 
    gv3.DataBind(); 
    }); 
} 

所以上面的示例中,讓我們說,在存儲過程exec ThirdGraders需要一個字符串(SQL Server中的varchar)的@teacher參數 - 可我還是用工作實例我是從This post給參數添加到只1個存儲過程?

回答

0

你有沒有試過類似的東西?

private Task<DataSet> ExecuteSqlQueryAsync(string connectionString, string sqlQuery, Dictionary<string, object> parameters = null) 
{ 
    return Task.Factory.StartNew(
    () => 
    { 
     try 
     { 
      connstring = System.Configuration.ConfigurationManager.AppSettings[connectionString].ToString(); 
      dbconn = new SqlConnection(connstring); 
      cm = new SqlCommand(sqlQuery, dbconn); 
      dbconn.Open(); 
      cm.CommandTimeout = 0; 
      if (params != null) { 
       foreach(var pair in parameters) 
       { 
        cm.Parameters.AddWithValue(pair.Key, pair.Value); 
       } 
      } 

      datasetttt = new DataSet(); 
      da = new SqlDataAdapter(cm); 
      da.Fill(datasetttt, "Data"); 
      return datasetttt; 
     } 
     catch (Exception exception) { throw exception; } 
     finally 
     { 
      dbconn.Close(); 
      cm.Dispose(); 
      da.Dispose(); 
     } 
    }); 
} 

我還沒有試過這段代碼。如果失敗,請修復這些滋擾。然後在你的代碼中,你可以使用類似這樣的東西:

var t1 = ExecuteSqlQueryAsync(cnx, "SELECT * FROM SomeTable"); // Without params 
var t2 = ExecuteSqlQueryAsync(
      cnx, 
      "SELECT * FROM SomeTable WHERE Property1 = @Value", 
      new Dictionary<string, object> 
       { 
        {"@Value", 12} 
       }); // With params