如果把sqlserver数据库比作一间屋子,可以分为三个层次:
1、找到这间屋子——实例未找到
2、找到屋子并打开门——sqlconnection
3、进屋之后,能够做饭——sqlcommand
这三种情况,最难处理的即是第一种情况,下面贴出来一段代码,作为参考:
public static DataTable cmdDbFillDt(string conn, string sql) { bool connectFlag = false; DataTable dataTable = new DataTable(); Stopwatch sw = new Stopwatch(); Thread t = new Thread(delegate () { try { using (SqlConnection sqlconn = new SqlConnection(conn)) { sw.Start(); try { if (sqlconn.State == ConnectionState.Open) { sqlconn.Close(); } sqlconn.Open(); connectFlag = true; SqlCommand cmd = new SqlCommand(sql, sqlconn); cmd.CommandTimeout = 60000; SqlDataReader sqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection); dataTable.Load(sqlDataReader); } catch (Exception ex) { LogHelper.writeLog(ex.Message.ToString() + ex.StackTrace.ToString(), ex); } } } catch (Exception ex) { LogHelper.writeLog(ex.Message.ToString() + ex.StackTrace.ToString(), ex); } }); t.IsBackground = true; t.Start(); var timeout = TimeSpan.FromSeconds(3); while (!connectFlag && sw.Elapsed < timeout) t.Join(TimeSpan.FromMilliseconds(200)); sw.Stop(); return dataTable; }
中间使用了[sqldatareader], 为什么没有选择用[sqldataadapter]。因为[sqldataadapter]处理大批数据的效率不是很好。