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