using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; /// /// 测试用例 /// namespace TestCase { class Program { static System.Data.DataSet dataSet = null; public static SQLHelper.ConnectionParameters Parameters { get; set; } = new SQLHelper.ConnectionParameters(); static void Main( string[] args ) { // 打开一个数据库; OpenDatabase(); // 初始化数据库连接串; InitConnection(); // 分离数据库(不需要admin权限); //Parameters.DetachDatabase("db"); // 附加数据库(程序需要使用admin权限运行, 否则附加失败); //Parameters.AttachDatabase("db", @"E:\lyfzClassicSoft\服务端\数据\db.mdf", @"E:\lyfzClassicSoft\服务端\数据\db_log.LDF"); /* // 不参数化的sql语句; QueryWithCommandText(); // 参数化的sql语句; QueryWithParameters(); // 表是否存在; if ( IsTableExists("dindan") ) Console.WriteLine("表存在"); else Console.WriteLine("表不存在"); // 表字段是否存在; if ( IsColumnExists("dindan", "id1") ) Console.WriteLine("表字段存在"); else Console.WriteLine("表字段不存在"); // 视图是否存在; if ( IsViewExists("dindanclient1") ) Console.WriteLine("视图存在"); else Console.WriteLine("视图不存在"); */ //Test("Development", "lowdb"); //Test("Development", "lowdb2"); //Test2("Development", "lowdb"); //Test2("Development", "lowdb2"); //Test3("Development", "lowdb", "select * from Vw_OrderReport where Ord_Type in ('0','1','2') and (取件状态 is null or 取件状态 in (0,1))"); //Test3("Development", "lowdb", "select * from Vw_OrderProcessCustomer"); //Test3("Development", "lowdb2", "select * from Vw_OrderReport where Ord_Type in ('0','1','2') and (取件状态 is null or 取件状态 in (0,1))"); //Test3("Development", "lowdb2", "select * from Vw_OrderProcessCustomer"); //Test3("192.168.1.19,1433", "LYFZERPDB", "select * from Vw_OrderReport where Ord_Type in ('0','1','2') and (取件状态 is null or 取件状态 in (0,1))"); //Test3("192.168.1.19,1433", "LYFZERPDB", "select * from Vw_OrderProcessCustomer"); Test5("Development", "Platinum"); // 结束程序; Console.ReadKey(); } /// /// 打开一个数据库连接; /// public static void OpenDatabase() { // 创建连接参数对象, 并初始所有参数; SQLHelper.ConnectionParameters parameters = new SQLHelper.ConnectionParameters(); // 数据库服务地址; parameters.DatabaseServer = "127.0.0.1"; // 数据库服务地址端口号; parameters.DatabasePort = 0; // 数据库名称; parameters.DatabaseName = "db"; // 数据库账号; parameters.DatabaseAccount = "sa"; // 数据库密码; parameters.DatabasePassword = "ly1234"; // 初始化连接串; parameters.InitConnectParameters(); // 打印出连接串; System.Diagnostics.Debug.Write(parameters.ConnectionString + "\n", "正常连接串"); System.Diagnostics.Debug.Write(parameters.MasterConnectionString + "\n", "Master连接串"); System.Diagnostics.Debug.Write(parameters.TrustedConnectionString + "\n", "本地信任连接串"); // 创建一个连接对象; try { System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection(parameters.ConnectionString); connection.Open(); Console.WriteLine("成功打开连接\n"); } catch ( Exception e ) { Console.WriteLine(e.Message); } } /// /// 初始化数据库连接串; /// public static void InitConnection() { // 数据库服务地址; Parameters.DatabaseServer = "127.0.0.1"; // 数据库服务地址端口号; Parameters.DatabasePort = 0; // 数据库名称; Parameters.DatabaseName = "db"; // 数据库账号; Parameters.DatabaseAccount = "sa"; // 数据库密码; Parameters.DatabasePassword = "ly1234"; // 初始化连接串; Parameters.InitConnectParameters(); // 该函数未完成,不建议使用(当前使用结果与上一句一致); Parameters.InitConnectParameters( Parameters.DatabaseServer, Parameters.DatabaseName, Parameters.DatabaseAccount, Parameters.DatabasePassword, Parameters.DatabasePort, 100, 5, 300); } public static void QueryWithCommandText() { try { // 查询数据集: 不使用参数化, 直接语句查询; System.Data.DataTable dt = SQLHelper.SqlHelper.ExecuteDataset(Parameters.ConnectionString, System.Data.CommandType.Text, "select * from dindan where time1 > '2016-01-01'").Tables[0]; if ( dt != null && dt.Rows.Count != 0 ) { for ( int i = 0; i < dt.Rows.Count; i++ ) { Console.WriteLine("{0}, {1}, {2}\n", dt.Rows[i]["id"], dt.Rows[i]["name1"], dt.Rows[i]["name2"]); } } } catch ( Exception e ) { Console.WriteLine(e.Message); } } public static void QueryWithParameters() { try { // 查询数据集: 使用参数化; System.Data.SqlClient.SqlParameter[] sqlParameters = { new System.Data.SqlClient.SqlParameter("@time1", "2016-01-01"), new System.Data.SqlClient.SqlParameter("@taoxijiage", "500") }; System.Data.DataTable dt = SQLHelper.SqlHelper.ExecuteDataset( Parameters.ConnectionString, System.Data.CommandType.Text, "select * from dindan where time1 > @time1 and taoxijiage > @taoxijiage", sqlParameters).Tables[0]; if ( dt != null && dt.Rows.Count != 0 ) { for ( int i = 0; i < dt.Rows.Count; i++ ) { Console.WriteLine("{0}, {1}, {2}, {3}\n", dt.Rows[i]["id"], dt.Rows[i]["name1"], dt.Rows[i]["name2"], dt.Rows[i]["taoxijiage"]); } } } catch ( Exception e ) { Console.WriteLine(e.Message); } } /// /// 指定表名是否存在; /// /// /// public static bool IsTableExists( string tableName ) { string strSQL = "select count(*) from sysobjects where id = object_id(N'[" + tableName + "]') and OBJECTPROPERTY(id, N'IsUserTable') = 1"; object obj = SQLHelper.SqlHelper.ExecuteScalar(Parameters.ConnectionString, System.Data.CommandType.Text, strSQL); if ( (Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)) ) return false; return (int.Parse(obj.ToString()) > 0) ? true : false; } /// /// 指定表的字段是否存在; /// /// /// /// public static bool IsColumnExists( string tableName, string columnName ) { string strSQL = "select count(1) from syscolumns where [id]=object_id('" + tableName + "') and [name]='" + columnName + "'"; object obj = SQLHelper.SqlHelper.ExecuteScalar(Parameters.ConnectionString, System.Data.CommandType.Text, strSQL); if ( (Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)) ) return false; return (int.Parse(obj.ToString()) > 0) ? true : false; } /// /// 视图是否存在; /// /// /// public static bool IsViewExists( string viewName ) { string strSQL = "SELECT count([object_id]) as objCount FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[" + viewName + "]')"; object obj = SQLHelper.SqlHelper.ExecuteScalar(Parameters.ConnectionString, System.Data.CommandType.Text, strSQL); if ( (Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)) ) return false; return (int.Parse(obj.ToString()) > 0) ? true : false; } public static void Test( string server, string dbname ) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); try { // 更改参数; Parameters.DatabaseServer = server; Parameters.DatabaseName = dbname; string strSql = @" --订单的取件状态; with cte_OrderPickup as( select OPlist_OrderNumber as OrderNumber ,OPlist_ViceNumber as ViceNumber ,max(OPlist_PickupTime) as PickupTime ,(case when count(1) = count(case when OPlist_PickupStatus = 0 then '未取' end) then 0 -- 完全未取; when count(1) != count(case when OPlist_PickupStatus = 1 then '已取' end) then 1 -- 取件中; when count(1) = count(case when OPlist_PickupStatus = 1 then '已取' end) then 2 -- 全部取完; end) as PickupStatus from tb_ErpOrderProductList where OPlist_Type = '2' group by OPlist_ViceNumber,OPlist_OrderNumber ), -- 订单接单人; cte_OrderMan as ( select OrdPe_OrderNumber, User_Name from tb_ErpOrdersPerson Left Join tb_ErpUser ON tb_ErpOrdersPerson.OrdPe_OrdersPerson = tb_ErpUser.User_EmployeeID ), cte_OrderPerson as ( select tb1.OrdPe_OrderNumber as OrderNumber ,stuff(( select ','+ User_Name from cte_OrderMan as tb0 where tb0.OrdPe_OrderNumber = tb1.OrdPe_OrderNumber for xml path('')),1,1,'') as OrderPerson from cte_OrderMan as tb1 group by tb1.OrdPe_OrderNumber --select dbo.AggregateString([User_Name]+'{$$},') as OrderPerson, OrdPe_OrderNumber as OrderNumber from cte_OrderMan group by OrdPe_OrderNumber ), --拍照状态; cte_PhotographyStatus as( select max(Ordpg_Number) Ordpg_Number ,Ordpg_ViceNumber ,max(Ordpg_Sights) as Ordpg_Sights ,max(Ordpg_PhotographyTime) as Ordpg_PhotographyTime ,case when count(case when Ordpg_PhotographyStatus = 1 then '拍照' end) = Count(1) then 1 else 0 end as Ordpg_PhotographyStatus from tb_ErpOrdersPhotography group by Ordpg_ViceNumber ) select --------------------------------------------------------------- tb_ErpOrder.ID ,tb_ErpOrder.Ord_DividedShop 分店编号 ,tb_ErpOrder.Ord_Number 订单号 ,tb_ErpOrder.Ord_Class ,tb_ErpOrder.Ord_OrderClass ,tb_ErpOrder.Ord_SinceOrderNumber 自定义订单号 ,tb_ErpOrder.Ord_Type 订单类型 ,tb_ErpOrder.Ord_PhotographyCategory 套系类型 ,tb_ErpOrder.Ord_CustomerSource 客户来源 ,tb_ErpOrder.Ord_SeriesName 套系名称 ,tb_ErpOrder.Ord_SeriesPrice 套系价格 --------------------------------------------------------------- ,cte_OrderPickup.OrderNumber 订单号 ,cte_OrderPickup.PickupStatus 订单取件状态 ,cte_OrderPickup.PickupTime 订单最大取件日期 --------------------------------------------------------------- ,cte_OrderPerson.OrderNumber 订单号 ,cte_OrderPerson.OrderPerson 订单接单人 --------------------------------------------------------------- ,tempTB_AggregationCustomer.GP_OrderNumber 订单号 ,tempTB_AggregationCustomer.[Cus_CustomerSource] 顾客来源 ,tempTB_AggregationCustomer.Cus_Name 顾客姓名 ,tempTB_AggregationCustomer.Cus_Name_py 顾客姓名接单 ,tempTB_AggregationCustomer.Cus_Sex_cs 顾客性别 ,tempTB_AggregationCustomer.Cus_Telephone 顾客电话 ,tempTB_AggregationCustomer.Cus_OpenID 顾客微信号 --------------------------------------------------------------- ,tb_ErpOrderDigital.Ordv_Number 订单号 ,tb_ErpOrderDigital.Ordv_ViceNumber 副订单号 ,tb_ErpOrderDigital.Ordv_EarlyRepairStatus 初修状态 ,tb_ErpOrderDigital.Ordv_EarlyRepairTime 初修时间 ,tb_ErpOrderDigital.Ordv_FilmSelectionStatus 选片状态 ,tb_ErpOrderDigital.Ordv_FilmSelectionTime 选片时间 ,tb_ErpOrderDigital.Ordv_DesignerStatus 设计状态 ,tb_ErpOrderDigital.Ordv_DesignerTime 设计时间 ,tb_ErpOrderDigital.Ordv_RefinementStatus 精修状态 ,tb_ErpOrderDigital.Ordv_RefinementTime 精修时间 ,tb_ErpOrderDigital.Ordv_LookDesignStatus 看设计状态 ,tb_ErpOrderDigital.Ordv_LookDesignTime 看设计时间 --------------------------------------------------------------- ,cte_PhotographyStatus.Ordpg_Sights 景点名 ,cte_PhotographyStatus.Ordpg_PhotographyStatus 拍照状态 ,cte_PhotographyStatus.Ordpg_PhotographyTime 拍照时间 --------------------------------------------------------------- from tb_ErpOrder Left Join cte_OrderPerson ON cte_OrderPerson.OrderNumber = tb_ErpOrder.Ord_Number Left Join tb_ErpOrderDigital ON tb_ErpOrder.Ord_Number = tb_ErpOrderDigital.Ordv_Number Left Join tempTB_AggregationCustomer ON tempTB_AggregationCustomer.GP_OrderNumber = tb_ErpOrder.Ord_Number Left Join cte_OrderPickup ON cte_OrderPickup.ViceNumber = tb_ErpOrderDigital.Ordv_ViceNumber Left Join tb_ErpOrdersPhotography ON tb_ErpOrderDigital.Ordv_ViceNumber = tb_ErpOrdersPhotography.Ordpg_ViceNumber Left Join cte_PhotographyStatus ON cte_PhotographyStatus.Ordpg_ViceNumber = tb_ErpOrderDigital.Ordv_ViceNumber "; dataSet = SQLHelper.SqlHelper.ExecuteDataset(Parameters.ConnectionString, System.Data.CommandType.Text, strSql); } catch { } stopWatch.Stop(); long ticksThisTime = stopWatch.ElapsedMilliseconds; Console.WriteLine("{0}用时{1}", dbname, ticksThisTime); } public static void Test2( string server, string dbname ) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); try { // 更改参数; Parameters.DatabaseServer = server; Parameters.DatabaseName = dbname; dataSet = SQLHelper.SqlHelper.ExecuteDataset(Parameters.ConnectionString, System.Data.CommandType.Text, "select * from Vw_OrderProcessCustomer"); } catch { } stopWatch.Stop(); long ticksThisTime = stopWatch.ElapsedMilliseconds; Console.WriteLine("{0}用时{1}", dbname, ticksThisTime); } public static void Test3( string server, string dbname, string strSql ) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); try { // 更改参数; Parameters.DatabaseServer = server; Parameters.DatabaseName = dbname; dataSet = SQLHelper.SqlHelper.ExecuteDataset(Parameters.ConnectionString, System.Data.CommandType.Text, strSql); } catch { } stopWatch.Stop(); long ticksThisTime = stopWatch.ElapsedMilliseconds; Console.WriteLine("{0}用时{1}", dbname, ticksThisTime); } public static void Test4( string server, string dbname ) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); System.Data.DataTable dt = null; try { // 更改参数; Parameters.DatabaseServer = server; Parameters.DatabaseName = dbname; dataSet = SQLHelper.SqlHelper.ExecuteDataset(Parameters.ConnectionString, System.Data.CommandType.Text, "select * from Vw_OrderProcessCustomerEx"); if ( dataSet != null && dataSet.Tables.Count != 0 ) { dt = dataSet.Tables[0]; for ( int i = dt.Rows.Count - 1; i > 0; i-- ) { System.Data.DataRow dr = dt.Rows[i]; if ( dr["Ord_DividedShop"].ToString() != "SSN001" ) { dt.Rows.RemoveAt(i); continue; } if ( dr["拍照状态"].ToString() != "OK" ) { dt.Rows.RemoveAt(i); continue; } if ( dr["选片状态"].ToString() != "未选" ) { dt.Rows.RemoveAt(i); continue; } if ( dr["取件状态"].ToString() == "OK" ) { dt.Rows.RemoveAt(i); continue; } } } } catch { } stopWatch.Stop(); long ticksThisTime = stopWatch.ElapsedMilliseconds; Console.WriteLine("{0}用时{1}, {2}, {3}", dbname, ticksThisTime, dataSet.Tables[0].Rows.Count, dt.Rows.Count); } public static void Test5( string server, string dbname ) { string strSql = @" -- 成本核算 ------------------------------------------------------ --订单接单人员; with cte_OrderMan as ( select OrdPe_OrderNumber, User_Name from tb_ErpOrdersPerson Left Join tb_ErpUser ON tb_ErpOrdersPerson.OrdPe_OrdersPerson = tb_ErpUser.User_EmployeeID ), cte_OrderPerson as ( select tb1.OrdPe_OrderNumber as OrderNumber ,stuff( (select ','+ User_Name from cte_OrderMan as tb0 where tb0.OrdPe_OrderNumber = tb1.OrdPe_OrderNumber for xml path('')),1,1,'' ) as OrderPerson from cte_OrderMan as tb1 group by tb1.OrdPe_OrderNumber ), ------------------------------------------------------ --订单取件状态; cte_PickupStatus as ( select max(OPlist_OrderNumber) OrderNumber ,max(OPlist_PickupTime) PickupTime ,OPlist_ViceNumber ,case sum(convert(int,OPlist_PickupStatus)) when 0 then 0 -- 未取; when count(1) then 2 -- 已取; else 1 -- 部分取件; end as PickupStatus from tb_ErpOrderProductList where OPlist_Type = '2' group by OPlist_ViceNumber ), ------------------------------------------------------ cte_Scenery as ( select max(Ordpg_Number) OrderNumber, Ordpg_ViceNumber ,stuff( (select ','+ Ordpg_Sights from tb_ErpOrdersPhotography as tb0 where tb0.Ordpg_ViceNumber = tb1.Ordpg_ViceNumber for xml path('')),1,1,'' ) as 景点 from tb_ErpOrdersPhotography tb1 group by Ordpg_ViceNumber ) ------------------------------------------------------ select tb_ErpOrder.Ord_Number --,tb_ErpOrder.Ord_SinceOrderNumber --,tb_ErpOrder.Ord_Type --,tb_ErpOrder.Ord_Class --,tb_ErpOrder.Ord_OrderClass ,tb_ErpOrder.Ord_SeriesName 套系名称 ,tb_ErpOrder.Ord_SeriesPrice 套系价格 --,tb_ErpOrder.Ord_Discount --,tb_ErpOrder.Ord_CreateDateTime --,tb_ErpOrder.Ord_DividedShop ------------------------------------------------------ --,tempTB_AggregationCustomer.GP_OrderNumber ,tempTB_AggregationCustomer.Cus_Name 顾客姓名 --,tempTB_AggregationCustomer.Cus_Name_py --,tempTB_AggregationCustomer.Cus_Sex_cs --,tempTB_AggregationCustomer.Cus_Telephone ------------------------------------------------------ --,cte_OrderPerson.OrderNumber ,cte_OrderPerson.OrderPerson 接单人 ------------------------------------------------------ ,cte_Scenery.景点 ------------------------------------------------------ --,cte_PickupStatus.OPlist_ViceNumber 子订单 ,cte_PickupStatus.PickupStatus 取件状态 ,cte_PickupStatus.PickupTime 取件时间 ------------------------------------------------------ ,isnull( (Ord_SeriesPrice + case when (select sum(case when Plu_GoodsCosts <> '' then convert(decimal(10,2),dbo.fn_GetSumArray(Plu_GoodsCosts)) else 0 end) from tb_ErpPlusPickItems where Plu_OrdNumber = Ord_Number) is null then 0 end ),0.00 ) as 套系价格 ,( isnull((select sum(OPlist_CostPrice * OPlist_ProdQuantity) from tb_ErpOrderProductList where OPlist_Type = '1' And OPlist_OrderNumber = Ord_Number),0) + isnull((select sum(Ws_ProdCostPrice * Ws_ProdQuantity) from tb_ErpWeddingService where Ws_Number = Ord_Number),0) + isnull((select sum(Ordpg_CostPrice) from tb_ErpOrdersPhotography where Ordpg_Number = Ord_Number),0) + isnull((select sum(case when Plu_GoodsCosts <> '' then convert(decimal(10,2),dbo.fn_GetSumArray(Plu_GoodsCosts)) else 0 end) from tb_ErpPlusPickItems where Plu_OrdNumber = Ord_Number),0) ) AS 套系成本 ,( select sum(OPlist_CostPrice * OPlist_ProdQuantity) from tb_ErpOrderProductList where OPlist_Type = '1' And OPlist_OrderNumber = Ord_Number ) as 商品成本 ,( select sum(Ws_ProdCostPrice * Ws_ProdQuantity) from tb_ErpWeddingService where Ws_Number = Ord_Number ) as 服务成本 ,( select sum(Ordpg_CostPrice) from tb_ErpOrdersPhotography where Ordpg_Number = Ord_Number ) as 景点成本 ,( select sum(case when Plu_GoodsCosts <> '' then convert(decimal(10,2),dbo.fn_GetSumArray(Plu_GoodsCosts)) else 0 end) from tb_ErpPlusPickItems where Plu_OrdNumber = Ord_Number ) as 加挑总价 ------------------------------------------------------ from tb_ErpOrder Left Join tempTB_AggregationCustomer ON tb_ErpOrder.Ord_Number = tempTB_AggregationCustomer.GP_OrderNumber Left Join cte_OrderPerson ON tb_ErpOrder.Ord_Number = cte_OrderPerson.OrderNumber Left Join cte_PickupStatus ON tb_ErpOrder.Ord_Number = cte_PickupStatus.OrderNumber Left Join cte_Scenery ON tb_ErpOrder.Ord_Number = cte_Scenery.OrderNumber order by tb_ErpOrder.Ord_Number"; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); System.Data.DataTable dt = null; try { // 更改参数; Parameters.DatabaseServer = server; Parameters.DatabaseName = dbname; dataSet = SQLHelper.SqlHelper.ExecuteDataset(Parameters.ConnectionString, System.Data.CommandType.Text, strSql); } catch { } stopWatch.Stop(); long ticksThisTime = stopWatch.ElapsedMilliseconds; Console.WriteLine("{0}用时{1}", dbname, ticksThisTime); } } }