using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Web.Configuration; using System.Data.OleDb; namespace Cus_GetSQL { public class Get_Data { // 全域變數。從 Stored Procedure 回傳的單一數值,取得符合查詢條件的資料列總筆數 public int _totalRecords = 0; // 取得 Web.config 連線字串的名稱 public string strConnString = System.Configuration.ConfigurationManager.ConnectionStrings["shopConn"].ToString(); public Get_Data() { } #region 取得 WebForm 裡的 ObjectDataSource 傳來的參數,並將參數傳送給 SELECT 函數處理 // true 表示為 ObjectDataSource 要 SELECT 時的預設值 [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, true)] public DataSet Get_ObjectDataSource_Val(string TableName_val, string ColumnName_val, string OrderColumn_val, string Where_val, int startRowIndex, int maxinumRows, string sortExpression) { // 最後三個參數:startRowIndex, maxinumRows, sortExpression,ObjectDataSource 控制項會自動傳入,開發人員不用手動撰碼傳值 DataSet ds = null; try { //HttpContext.Current.Response.Write("變數=" & eztrust) //檢查所帶進來的參數是否有值(如果為empty會發生錯誤) if (TableName_val == null | Convert.ToString(TableName_val)=="") { TableName_val = ""; } if (ColumnName_val == null | Convert.ToString(ColumnName_val) == "") { ColumnName_val = ""; } if (OrderColumn_val == null | Convert.ToString(OrderColumn_val) == "") { OrderColumn_val = ""; } if (Where_val == null | Convert.ToString(Where_val) == "") { Where_val = ""; } // 參數: (Table名稱、查詢Column名稱集合、Where條件(包括模糊查詢關鍵字)、排序方式(按標題搜尋前)、起始撈取的資料列索引、GridView每頁要顯示的筆數、排序方式(按標題搜尋後)) ds = SelectData(TableName_val.Trim(), ColumnName_val.Trim(), Where_val, OrderColumn_val.Trim(), startRowIndex, maxinumRows, sortExpression); } catch (Exception ex) { throw new Exception(ex.Message); //顯示錯誤訊息,如資料庫存取發生錯誤,或網路中斷、資料庫關機 } return ds; } #endregion #region 將接受到的參數,執行SELECT (搭配 Stored Procedure 做「分頁及撈取資料」處理) // true 表示為 ObjectDataSource 要 SELECT 時的預設值 [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, true)] public DataSet SelectData(string strTableName, string strColumnName, string strSqlWhere, string strDefaultOrderColumn, int startRowIndex, int maxinumRows, string sortExpression) { OleDbConnection sqlConn = null; OleDbCommand sqlCmd = null; OleDbDataAdapter sqlAdapter = null; DataSet ds = null; string strOrderBy = null; try { sqlConn = new OleDbConnection(strConnString); sqlConn.Open(); if (sqlConn.State == ConnectionState.Open) { ds = new DataSet(); // 取得排序資料 (昇幕或降幕) if (string.IsNullOrEmpty(sortExpression)) { //排序欄位。第一次進入頁面時,sortExpression 為空值,所以以開發人員在層指定的欄位排序 strOrderBy = strDefaultOrderColumn; } else if ((!string.IsNullOrEmpty(sortExpression)) & (sortExpression.IndexOf(" DESC") == -1)) { // 排序欄位。若使用者按下了 GridView 某個欄位的 title,此時 sortExpression 有值,且要由小到大排序 strOrderBy = sortExpression + " ASC"; } else if ((!string.IsNullOrEmpty(sortExpression)) & (sortExpression.IndexOf(" DESC") != -1)) { // 刪除 ObjectDataSource 自動在最後面加的「 DESC」字樣(5個字元) sortExpression = sortExpression.Remove(sortExpression.Length - 5, 5); // 排序欄位。若使用者按下了 GridView 某個欄位的 title,此時 sortExpression 有值,且要由大到小排序 strOrderBy = sortExpression + " DESC"; } // SELECT SQL 的 WHERE 條件 (包含使用者輸入的模糊查詢關鍵字) if (string.IsNullOrEmpty(strSqlWhere)) { // 若沒加這句,則當 WHERE 條件為空值時(使用者未輸入搜尋關鍵字),丟到 Stored Procedure 裡後會 Error strSqlWhere = " 1=1 "; } sqlCmd = new OleDbCommand("dbo.pager_eztrust", sqlConn); // 系統中每支程式共用的預存程序名稱 sqlCmd.CommandType = CommandType.StoredProcedure; // 資料來源為 Stored Procedure(預存程序) sqlCmd.Parameters.Add(new OleDbParameter("@StartRowIndex", startRowIndex)); // 目前頁面,要撈的資料,的第一筆資料的索引 (第一筆為 0,依序加 1,依此類推) sqlCmd.Parameters.Add(new OleDbParameter("@PageSize", maxinumRows)); // GridView 每頁要顯示的資料筆數 sqlCmd.Parameters.Add(new OleDbParameter("@tableName", strTableName)); sqlCmd.Parameters.Add(new OleDbParameter("@columnName", strColumnName)); sqlCmd.Parameters.Add(new OleDbParameter("@sqlWhere", strSqlWhere)); sqlCmd.Parameters.Add(new OleDbParameter("@orderBy", strOrderBy)); sqlCmd.Parameters.Add(new OleDbParameter("@rowCount", SqlDbType.Int)); // Stored Procedure 會傳回一個數字(符合查詢條件的資料總筆數) sqlCmd.Parameters["@rowCount"].Direction = ParameterDirection.Output; // 用來在 GridView 下方的「頁碼列」顯示頁碼之用(Ex: 1 2 3 4 ... 55) sqlAdapter = new OleDbDataAdapter(sqlCmd); sqlAdapter.Fill(ds); _totalRecords = Convert.ToInt32(sqlCmd.Parameters["@rowCount"].Value); // 總筆數 (要回傳至前端 .aspx,給 GridView 下方的「頁碼列」顯示用) HttpContext.Current.Session["s_RecordTotalCount"] = _totalRecords; // 存至 Session,以便在.aspx.vb中取用後,用來在 GridView 下方的「頁碼列」中顯示頁碼之用 Console.Write("tc: " + _totalRecords); int jj = ds.Tables[0].Rows.Count; // 實際從資料庫撈回來,儲存在 AP Server 記憶體中 DataSet/DataTable 的資料筆數 Console.Write(jj); // GridView 每頁要呈現的資料筆數 } } catch (OleDbException ex) { Console.WriteLine(ex.ToString()); throw; } catch (Exception ex) { throw new Exception("發生 SqlClient 以外的資料庫錯誤: " + ex.Message); } finally { sqlCmd.Dispose(); sqlAdapter.Dispose(); ds.Dispose(); if (sqlConn.State == ConnectionState.Open) { sqlConn.Close(); sqlConn.Dispose(); } sqlConn.Dispose(); } return ds; } #endregion #region 從 Stored Procedure 回傳的一個整數,為符合查詢條件的資料總筆數,用來在 GridView 下方的「頁碼列」顯示頁碼之用(Ex: 1 2 3 4 ... 55) public int getRecordCount(string TableName_val, string ColumnName_val, string OrderColumn_val, string Where_val) { return _totalRecords; } #endregion } public struct GetSqlData { public string tableName; public string columnName; public string sqlWhere; public string sort; public int startRowIndex; public int maxinumRows; public DataSet selectData() { string db = ConfigurationManager.ConnectionStrings["shopConn"].ConnectionString; string p_name = ConfigurationManager.ConnectionStrings["shopConn"].ProviderName; //ProviderName MyWeb.sql sql = new MyWeb.sql(); OleDbConnection sqlConn = new OleDbConnection(db); OleDbCommand sqlCmd = null; OleDbDataAdapter sqlAdapter = null; DataSet ds = null; string strOrderBy = null; try { sqlConn.Open(); if (sqlConn.State == ConnectionState.Open) { ds = new DataSet(); // SELECT SQL 的 WHERE 條件 (包含使用者輸入的模糊查詢關鍵字) if (string.IsNullOrEmpty(sqlWhere)) { // 若沒加這句,則當 WHERE 條件為空值時(使用者未輸入搜尋關鍵字),丟到 Stored Procedure 裡後會 Error sqlWhere = " 1=1 "; } sqlCmd = new OleDbCommand("dbo.pager_eztrust", sqlConn); // 系統中每支程式共用的預存程序名稱 sqlCmd.CommandType = CommandType.StoredProcedure; // 資料來源為 Stored Procedure(預存程序) sqlCmd.Parameters.Add(new OleDbParameter("@StartRowIndex", startRowIndex)); // 目前頁面,要撈的資料,的第一筆資料的索引 (第一筆為 0,依序加 1,依此類推) sqlCmd.Parameters.Add(new OleDbParameter("@PageSize", maxinumRows)); // 每頁要顯示的資料筆數 sqlCmd.Parameters.Add(new OleDbParameter("@tableName", tableName + " ")); sqlCmd.Parameters.Add(new OleDbParameter("@columnName", columnName)); sqlCmd.Parameters.Add(new OleDbParameter("@sqlWhere", sqlWhere)); sqlCmd.Parameters.Add(new OleDbParameter("@orderBy", sort)); sqlCmd.Parameters.Add(new OleDbParameter("@rowCount", SqlDbType.Int)); // Stored Procedure 會傳回一個數字(符合查詢條件的資料總筆數) sqlCmd.Parameters["@rowCount"].Direction = ParameterDirection.Output; // 用來在 GridView 下方的「頁碼列」顯示頁碼之用(Ex: 1 2 3 4 ... 55) sqlAdapter = new OleDbDataAdapter(sqlCmd); sqlAdapter.Fill(ds); int totalRecords = Convert.ToInt32(sqlCmd.Parameters["@rowCount"].Value); // 回傳回來的總筆數 HttpContext.Current.Session["s_RecordTotalCount"] = totalRecords; // 存至 Session,以便在.aspx.vb中取用後 } } catch (OleDbException ex) { Console.WriteLine(ex.ToString()); throw; } catch (Exception ex) { throw new Exception("發生 SqlClient 以外的資料庫錯誤: " + ex.Message); } finally { sqlCmd.Dispose(); sqlAdapter.Dispose(); ds.Dispose(); if (sqlConn.State == ConnectionState.Open) { sqlConn.Close(); sqlConn.Dispose(); } sqlConn.Dispose(); } return ds; } } } namespace Cus_SQL { #region 將查詢的sql陣列組成字串傳回 public class SQL_Array { public string sql_str(ArrayList fs) { string functionReturnValue = null; for (int i = 0; i <= fs.Count - 1; i++) { if (functionReturnValue != null) { functionReturnValue += " AND "; } functionReturnValue += fs[i]; } return functionReturnValue; } } #endregion }