C# 在必须传递每个记录都有2000多个参数的列表的情况下,从数据库获取记录的最佳方式是什么?

C# 在必须传递每个记录都有2000多个参数的列表的情况下,从数据库获取记录的最佳方式是什么?,c#,sql,sql-server-2008,parameters,C#,Sql,Sql Server 2008,Parameters,任何关于这段代码的评论都将被欣然接受。这就是我打开这个话题的原因。但主要关注的是这一点;我需要传递商品ID、商店ID、开始日期和结束日期以获取销售记录。问题之一是由于SQL参数限制(2100),我无法向语句发送超过2100个参数。现在,我正在尝试按门店接收记录(门店号超过4000,商品数量也超过4000)。但我想不出一个好办法 任何花时间帮忙的人都会感激 这是数据访问: public List<SalesList> ExecuteSales(List<string> it

任何关于这段代码的评论都将被欣然接受。这就是我打开这个话题的原因。但主要关注的是这一点;我需要传递商品ID、商店ID、开始日期和结束日期以获取销售记录。问题之一是由于SQL参数限制(2100),我无法向语句发送超过2100个参数。现在,我正在尝试按门店接收记录(门店号超过4000,商品数量也超过4000)。但我想不出一个好办法

任何花时间帮忙的人都会感激

这是数据访问:

public List<SalesList> ExecuteSales(List<string> items, int storeID, int W1,int W2,int vendorID,int retailerID)
{
        SqlCommand command = new SqlCommand();

        string statement = "SELECT  I.ITEM_NBR,I.ITEM_DESC1,I.ITEM_DESC2,I.VENDOR_STK_NBR,SUM(SA.POS_QTY) AS POS_QTY,SUM(SA.POS_SALES) AS POS_SALES "
                          + "FROM  SALES_FTBL SA,ITEM_TBL I  "
                         + "WHERE SA.RETAILER_ID=I.RETAILER_ID "
                         + "AND SA.RETAILER_ID =   @RetailerID "
                         + "AND SA.VENDOR_NBR  =   @VendorID "
                         + "AND SA.STORE_NBR  =   @StoreID "
                         + "AND SA.ITEM_NBR=I.ITEM_NBR "
                         +"AND SA.ITEM_NBR  IN (";

        command.Parameters.AddWithValue("@RetailerID", retailerID);
        command.Parameters.AddWithValue("@VendorID",vendorID);
        command.Parameters.AddWithValue("@StoreID", storeID);   

        for (int i = 0; i < items.Count; i++)
        {
            if (i > 0)
            {
                statement += ", ";
            }
            string paramStr = "@itemNo" + i;
            statement += paramStr;
            command.Parameters.Add(paramStr, System.Data.SqlDbType.Int);
            command.Parameters[paramStr].Value = items[i];
        }
        statement += ") ";

        //statement += "AND STORE_NBR IN (";
        //for (int i = 0; i < stores.Count; i++)
        //{
        //    if (i > 0)
        //    {
        //        statement += ", ";
        //    }
        //    string paramStr = "@storeNo" + i;
        //    statement += paramStr;
        //    command.Parameters.Add(paramStr, System.Data.SqlDbType.Int);
        //    command.Parameters[paramStr].Value = stores[i];
        //}
        //statement += ") ";

        statement += "AND WEEK IN (";
        for (int i = 0; i <1; i++)
        {
            if (i > 0)
            {
                statement += ", ";
            }
            string paramStr = "@W" + i;
            statement += paramStr;
            command.Parameters.Add(paramStr, System.Data.SqlDbType.Int);
            command.Parameters[paramStr].Value = W1;
        }
         W1=W1+1;
        for (int counter=W1; counter < W2;counter++ )
        {
            if (counter > 0)
            {
                statement += ", ";
            }
            string paramStr = "@W" + counter;
            statement += paramStr;
            command.Parameters.Add(paramStr, System.Data.SqlDbType.Int);
            command.Parameters[paramStr].Value = W1++;
        }

        statement += ") ";

        statement += "GROUP BY I.ITEM_NBR,I.VENDOR_STK_NBR,I.ITEM_DESC1,I.ITEM_DESC2 Order By I.ITEM_DESC2 ";

        command.CommandText = statement;
        command.Connection = connection;

        List<SalesList> sales = new List<SalesList>();
        SalesList sale;
        string itemDescription;
        string desc1;
        string desc2;
        int count = 0;
        try
        {
            connection.Open();

            SqlDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                sale = new SalesList();

                sale.ItemNumber = Convert.ToInt32(reader["ITEM_NBR"].ToString().TrimEnd());

                if (reader["ITEM_DESC1"] != null)
                {
                    desc1 = reader["ITEM_DESC1"].ToString().TrimEnd();
                }
                else { desc1 = ""; }

                if (reader["ITEM_DESC2"] != null)
                {
                    desc2 = reader["ITEM_DESC2"].ToString().TrimEnd();
                }
                else { desc2 = ""; }

                if (!desc1.Equals(desc2) || !desc2.Equals(desc1))
                { itemDescription = desc1 + " " + desc2; }
                else { itemDescription = desc2; }

                sale.ItemDescription2 = itemDescription;

                sale.PosQuantity = Convert.ToInt32(reader["POS_QTY"].ToString().TrimEnd());
                sale.VendorStockNumber = reader["VENDOR_STK_NBR"].ToString().TrimEnd();


                if (reader["POS_SALES"].ToString() != "")
                {
                    sale.PosSales = Convert.ToDouble(reader["POS_SALES"].ToString().TrimEnd());
                }
                else { sale.PosSales = 0; }

                sales.Add(sale);
            }
        }
        catch (SqlException se)
        {
            Debug.WriteLine("---------- DEBUG INFORMATION ----------");
            Debug.WriteLine(se.Message);
            Debug.WriteLine("=======================================");
            throw se;
        }
        finally
        {
            connection.Close();
        }
        return sales;
    }
public List ExecuteSales(列表项、int-storeID、int-W1、int-W2、int-vendorID、int-retailerID)
{
SqlCommand=newsqlcommand();
string语句=“选择I.ITEM\u NBR、I.ITEM\u DESC1、I.ITEM\u DESC2、I.VENDOR\u STK\u NBR、SUM(SA.POS\u数量)作为POS\u数量、SUM(SA.POS\u销售)作为POS\u销售”
+来自SALES_FTBL SA,第I项
+“其中SA.RETAILER\u ID=I.RETAILER\u ID”
+“和SA.RETAILER_ID=@RetailerID”
+“和SA.VENDOR_NBR=@VendorID”
+“和SA.STORE_NBR=@StoreID”
+“和SA.ITEM_NBR=I.ITEM_NBR”
+“和SA.ITEM_NBR IN(”;
command.Parameters.AddWithValue(“@RetailerID”,RetailerID);
command.Parameters.AddWithValue(“@VendorID”,VendorID);
command.Parameters.AddWithValue(“@StoreID”,StoreID);
对于(int i=0;i0)
{
语句+=“,”;
}
字符串paramStr=“@itemNo”+i;
语句+=paramStr;
Add(paramStr,System.Data.SqlDbType.Int);
command.Parameters[paramStr].Value=items[i];
}
语句+=”;
//语句+=”并将_NBR存储在(“;
//for(int i=0;i0)
//    {
//语句+=“,”;
//    }
//字符串paramStr=“@storeNo”+i;
//语句+=paramStr;
//Add(paramStr,System.Data.SqlDbType.Int);
//command.Parameters[paramStr].Value=stores[i];
//}
//语句+=”;
语句+=”和中的周(“;
对于(int i=0;i 0)
{
语句+=“,”;
}
字符串paramStr=“@W”+i;
语句+=paramStr;
Add(paramStr,System.Data.SqlDbType.Int);
command.Parameters[paramStr].Value=W1;
}
W1=W1+1;
用于(int计数器=W1;计数器0)
{
语句+=“,”;
}
字符串paramStr=“@W”+计数器;
语句+=paramStr;
Add(paramStr,System.Data.SqlDbType.Int);
command.Parameters[paramStr].Value=W1++;
}
语句+=”;
语句+=“按I.ITEM\u NBR分组,I.VENDOR\u STK\u NBR,I.ITEM\u DESC1,I.ITEM\u DESC2按I.ITEM\u DESC2排序”;
command.CommandText=语句;
command.Connection=连接;
列表销售=新列表();
销售清单销售;
字符串项描述;
字符串desc1;
字符串desc2;
整数计数=0;
尝试
{
connection.Open();
SqlDataReader=command.ExecuteReader();
while(reader.Read())
{
sale=新的SalesList();
sale.ItemNumber=Convert.ToInt32(读卡器[“ITEM_NBR”].ToString().TrimEnd());
如果(读卡器[“项目描述”]!=null)
{
desc1=读卡器[“ITEM_desc1]”。ToString().TrimEnd();
}
else{desc1=”“;}
如果(读卡器[“项目描述2”]!=null)
{
desc2=读卡器[“ITEM_desc2”].ToString().TrimEnd();
}
else{desc2=”“;}
如果(!desc1.Equals(desc2)| |!desc2.Equals(desc1))
{itemsdescription=desc1+“”+desc2;}
else{itemsdescription=desc2;}
sale.ItemDescription2=itemDescription;
sale.PosQuantity=Convert.ToInt32(读卡器[“POS_数量”].ToString().TrimEnd());
sale.VendorStockNumber=读卡器[“VENDOR_STK_NBR”].ToString().TrimEnd();
如果(读卡器[“POS_销售”].ToString()!=“”)
{
sale.PosSales=Convert.ToDouble(读卡器[“POS_SALES”].ToString().TrimEnd());
}
else{sale.PosSales=0;}
销售。添加(销售);
}
}
捕获(SQLSE异常)
{
Debug.WriteLine(“------------调试信息-----------------”;
Debug.WriteLine(se.Message);
Debug.WriteLine(“===================================================================”);
扔硒;
}
最后
{
connection.Close();
}
退货;
}
这是业务层:

private List<SalesList> ExecuteSales(List<string> items, List<string> stores, string date1, string date2, int vendorID, int retailerID) {

        int W1 = CalculateWeek(date1);
        int W2 = CalculateWeek(date2);
        SalesListDL salesListDO = new SalesListDL();
        List<SalesList> sales = new List<SalesList>();
        List<SalesList> salesX = new List<SalesList>();

        for (int counter = 0; counter < stores.Count; counter++)
        {
                int storeID = Convert.ToInt32(stores[counter]);

                salesX = salesListDO.ExecuteSales(items, storeID, W1, W2, vendorID, retailerID);
                if (salesX.Count > 0)
                {
                    foreach (SalesList saleX in salesX.ToList())
                    {
                        int index = sales.FindIndex(item => item.ItemNumber == saleX.ItemNumber);
                        if (index > 0)
                        {
                            sales[index].PosQuantity = +saleX.PosQuantity;
                            sales[index].PosSales = +saleX.PosSales;
                            salesX.Remove(saleX);
                        }
                        else { sales.Add(saleX); }
                    }
                }
        }

        return sales;
    }
private List ExecuteSales(列表项、列表存储、字符串date1、字符串date2、int vendorID、int retailerID){
int W1=CalculateWeek(日期1);
int W2=CalculateWeek(日期2);
SalesListDL salesListDO=新的SalesListDL();
列表销售=新列表();
List salesX=新列表();
对于(int counter=0;计数器0)
public List<SalesList> ExecuteSales(List<string> items, int storeID, int W1, int W2, int vendorID, int retailerID)
{
    var sales = new List<SalesList>();
    var table = new DataTable();
    table.Columns.Add("ItemNumber");
    foreach (var item in items)
    {
        table.Rows.Add(item);
    }
    using (var connection = new SqlConnection("ConnectionString"))
    {
        connection.Open();
        using (var command = connection.CreateCommand())
        {
            command.CommandType = CommandType.StoredProcedure;
            command.CommandText = "cp_ExecuteSales";
            command.Parameters.AddWithValue("@RetailerID", retailerID);
            command.Parameters.AddWithValue("@VendorID", vendorID);
            command.Parameters.AddWithValue("@StoreID", storeID);
            var tvp = new SqlParameter("@ItemIds", SqlDbType.Structured)
            {
                 TypeName = "tvpItems",
                 Value = table
            };
            command.Parameters.Add(tvp);
            using (var reader = command.ExecuteReader())
            {
                //DoWork
            }
        }
    }
    return sales;
}
CREATE TYPE [dbo].[tvpItems] AS TABLE(
[ItemNumber] [int] NULL
CREATE PROCEDURE cp_ExecuteSales
     @RetailerID VARCHAR(50),
     @VendorID VARCHAR(50),
     @StoreID VARCHAR(50),
     @ItemIds tvpItems READONLY
AS
  SELECT  I.ITEM_NBR
          ,I.ITEM_DESC1
          ,I.ITEM_DESC2
          ,I.VENDOR_STK_NBR
          ,SUM(SA.POS_QTY) AS POS_QTY
          ,SUM(SA.POS_SALES) AS POS_SALES
  FROM  SALES_FTBL SA
        INNER JOIN ITEM_TBL I ON SA.RETAILER_ID = I.RETAILER_ID 
            AND SA.ITEM_NBR = I.ITEM_NBR
        INNER JOIN @ItemIds ID ON SA.ITEM_NBR = ID.ItemNumber
  WHERE SA.RETAILER_ID=I.RETAILER_ID
        AND SA.RETAILER_ID = @RetailerID
        AND SA.VENDOR_NBR  = @VendorID
        AND SA.STORE_NBR  = @StoreID
        AND SA.ITEM_NBR=I.ITEM_NBR
CREATE TYPE [dbo].[IntList] AS TABLE(
    [Value] [Int] NULL
)