简体   繁体   English

查询花费比预期的odbc更长的时间

[英]Query taking longer than expected odbc sage

I am doing a simple select with a date filter on it with a months range where only 32 records are present however its taking 15 seconds to query and return the data I am using sage 50 as you can probally tell and c#. 我正在做一个简单的选择,在它上面有一个月范围的日期过滤器,其中仅存在32条记录,但是它花了15秒查询和返回我使用sage 50的数据,正如您可能会告诉和c#一样。 I am using odbc to create the query the seem speeds can be found if i use the odbc query tool. 我正在使用odbc创建查询,如果我使用odbc查询工具,则可以发现似乎速度。

在此处输入图片说明

This is for a stright forward select and it should not be taking that long to return the data through odbc. 这是一个可靠的前向选择,通过odbc返回数据应该花很长时间。

String SQL = string.Format("SELECT 'ORDER_NUMBER', 'ORDER_OR_QUOTE', 'ANALYSIS_1','ACCOUNT_REF','ORDER_DATE','NAME', 'COURIER_NUMBER','COURIER_NAME','CUST_TEL_NUMBER' ,'DESPATCH_DATE','ACCOUNT_REF', 'DEL_NAME', 'DEL_ADDRESS_1', 'DEL_ADDRESS_2', 'DEL_ADDRESS_3', 'DEL_ADDRESS_4', 'DEL_ADDRESS_5', 'INVOICE_NUMBER','ORDER_DATE','INVOICE_NUMBER_NUMERIC', 'CONTACT_NAME','CONSIGNMENT', 'NOTES_1', 'ITEMS_NET' ,'ITEMS_GROSS','QUOTE_STATUS' FROM SALES_ORDER WHERE ORDER_DATE 字符串SQL = string.Format(“ SELECT'ORDER_NUMBER','ORDER_OR_QUOTE','ANALYSIS_1','ACCOUNT_REF','ORDER_DATE','NAME','COURIER_NUMBER','COURIER_NAME','CUST_TEL_NUMBER','DESPATCH_DATE',' ACCOUNT_REF','DEL_NAME','DEL_ADDRESS_1','DEL_ADDRESS_2','DEL_ADDRESS_3','DEL_ADDRESS_4','DEL_ADDRESS_5','INVOICE_NUMBER','ORDER_DATE','INVOICE_NUMBER_NUMERIC','CONTACT_MENT', ,“ ITEMS_NET”,“ ITEMS_GROSS”,“ QUOTE_STATUS”来自于ORDER_DATE的SALES_ORDER

='{0}' and ORDER_DATE <='{1}'", fromD, toD); ='{0}'和ORDER_DATE <='{1}'“,从D到D);

public List<SalesOrders> GetSalesOrders()
{
        List<SalesOrders> _salesOrdersList = new List<SalesOrders>();

        try
        {


            string sageDsn = ConfigurationManager.AppSettings["SageDSN"];
            string sageUsername = ConfigurationManager.AppSettings["SageUsername"];
            string sagePassword = ConfigurationManager.AppSettings["SagePassword"];
            //int totalRecords = GetSalesOrdersount();
            int counter = 0;
             //using (var connection = new OdbcConnection("DSN=SageLine50v24;Uid=Manager;Pwd=;"))
            using (var connection = new OdbcConnection(String.Format("DSN={0};Uid={1};Pwd={2};", sageDsn, sageUsername, sagePassword)))
            {

                connection.Open();

                //string sql = string.Format(getInvoiceSql, customerCode, DateTime.Today.AddMonths(-1).ToString("yyyy-MM-dd"));
                string fromD = dtpFrom.Value.ToString("yyyy-MM-dd");
                string toD = dtpTo.Value.ToString("yyyy-MM-dd");

                String SQL = string.Format("SELECT 'ORDER_NUMBER', 'ORDER_OR_QUOTE', 'ANALYSIS_1','ACCOUNT_REF','ORDER_DATE','NAME', 'COURIER_NUMBER','COURIER_NAME','CUST_TEL_NUMBER' ,'DESPATCH_DATE','ACCOUNT_REF',  'DEL_NAME', 'DEL_ADDRESS_1', 'DEL_ADDRESS_2', 'DEL_ADDRESS_3', 'DEL_ADDRESS_4', 'DEL_ADDRESS_5',  'INVOICE_NUMBER','ORDER_DATE','INVOICE_NUMBER_NUMERIC', 'CONTACT_NAME','CONSIGNMENT', 'NOTES_1', 'ITEMS_NET' ,'ITEMS_GROSS','QUOTE_STATUS' FROM SALES_ORDER WHERE ORDER_DATE >='{0}' and ORDER_DATE <='{1}'", fromD, toD);
                using (var command = new OdbcCommand(SQL, connection))
                {


                    using (var reader = command.ExecuteReader())

                    {

                        while (reader.Read())
                        {
                            counter++;

                            backgroundWorker1.ReportProgress(counter);

                            var salesOrders = new SalesOrders();
                            salesOrders.ACCOUNT_REF = Convert.ToString(reader["ACCOUNT_REF"]);
                            salesOrders.RecordIdentifier = "";
                            salesOrders.ShipmmentId = Convert.ToString(reader["ORDER_NUMBER"]);
                            salesOrders.OrderDate = Convert.ToDateTime(reader["ORDER_DATE"]);
                            salesOrders.OrderNumber = Convert.ToString(reader["ORDER_NUMBER"]);

                            salesOrders.Company = "";
                            salesOrders.Carrier = Convert.ToString(reader["COURIER_NUMBER"]);
                            salesOrders.CarrierService = Convert.ToString(reader["COURIER_NAME"]);
                            salesOrders.CustomerName = Convert.ToString(reader["NAME"]);
                            salesOrders.ShipToAddress1 = Convert.ToString(reader["DEL_ADDRESS_1"]);
                            salesOrders.ShipToAddress2 = Convert.ToString(reader["DEL_ADDRESS_2"]);
                            salesOrders.ShipToAddress3 = Convert.ToString(reader["DEL_ADDRESS_3"]);
                            salesOrders.ShipToAddress4 = Convert.ToString(reader["DEL_ADDRESS_4"]);
                            salesOrders.ShipToAddress5 = Convert.ToString(reader["DEL_ADDRESS_5"]);
                            salesOrders.ShiptoAttention = Convert.ToString(reader["DEL_NAME"]);
                            salesOrders.ShiptoPhoneNo = Convert.ToString(reader["CUST_TEL_NUMBER"]);
                            salesOrders.Country = Convert.ToString(reader["ANALYSIS_1"]);
                            salesOrders.ShiptoEmail = "";
                            salesOrders.MakeAddressDefault = "Y";
                            bool isProcessed = _sqlManager.hasbeenProcessed(salesOrders.OrderNumber);
                            if (isProcessed == true)
                                salesOrders.Exported = true;
                            _salesOrdersList.Add(salesOrders);


                        }
                    }
                }

            }

        return _salesOrdersList.OrderByDescending(o => o.OrderDate).ToList();
    }

don't use {0}, {1} for embedding values in strings... ADD via Parameters 不要使用{0},{1}将值嵌入字符串中...通过参数添加

               String SQL = 
@"SELECT 
      ORDER_NUMBER, 
      ORDER_OR_QUOTE, 
      ANALYSIS_1,
      ACCOUNT_REF,
      ORDER_DATE,
      `NAME`, 
      COURIER_NUMBER,'
      OURIER_NAME,
      CUST_TEL_NUMBER,
      DESPATCH_DATE,
      ACCOUNT_REF,  
      DEL_NAME, 
      DEL_ADDRESS_1,
      DEL_ADDRESS_2,
      DEL_ADDRESS_3,
      DEL_ADDRESS_4,
      DEL_ADDRESS_5,
      INVOICE_NUMBER,
      ORDER_DATE,
      INVOICE_NUMBER_NUMERIC,
      CONTACT_NAME,
      CONSIGNMENT,
      NOTES_1,
      ITEMS_NET,
      ITEMS_GROSS,
      QUOTE_STATUS
   FROM 
      SALES_ORDER 
   WHERE 
          ORDER_DATE >= ?
      and ORDER_DATE <= ?
   ORDER BY
      ORDER_DATE DESC";

                using (var command = new OdbcCommand(SQL, connection))
                {
                   // assuming fields are actually date data types fields
                   command.Parameters.Add( "parmFromDate", fromD );
                   command.Parameters.Add( "parmToDate", toD );

The "?" “?” in the query are place-holders for the parameter values which are handled by the ODBC process. 在查询中是由ODBC进程处理的参数值的占位符。 The Parameters being added within the using() portion are added in the same ordinal position as their respective place-holder parts. 在using()部分中添加的参数与它们各自的占位符部分的添加顺序相同。 I just assigned the parameter name to give context to whoever is looking at it after. 我刚刚分配了参数名称,以便为以后查看它的任何人提供上下文。

The query itself SHOULD be very quick depending on the date range you are pulling. 查询本身应该非常快,具体取决于您要提取的日期范围。 Even added the SQL Order by descending order so it is pre-pulled down in the order you intended it too. 甚至以降序添加了SQL Order,因此它也按照您想要的顺序被预先拉了下来。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM