Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在asp.net中从代码隐藏绑定数据列表_C#_Asp.net_Datalist - Fatal编程技术网

C# 如何在asp.net中从代码隐藏绑定数据列表

C# 如何在asp.net中从代码隐藏绑定数据列表,c#,asp.net,datalist,C#,Asp.net,Datalist,我想从asp.net中的代码隐藏绑定数据列表 我从列表中获取产品id,并根据它们选择所有产品 以下是我的代码: List<string> r_items_grid = (List<string>)Session["recent_items"]; for(int i=0; i < r_items_grid.Count; i++) { OleDbCommand cmd_r_items= new OleDbCommand("SELECT product_id,

我想从asp.net中的代码隐藏绑定数据列表

我从列表中获取产品id,并根据它们选择所有产品

以下是我的代码:

List<string> r_items_grid = (List<string>)Session["recent_items"];

for(int i=0; i < r_items_grid.Count; i++)
{

    OleDbCommand cmd_r_items= new OleDbCommand("SELECT product_id,product_name,product_price,product_image_1 from products where product_id="+ Convert.ToInt32( r_items_grid[i]),con); 
    r_items_reader=cmd_r_items.ExecuteReader();

    DataList3.DataSource = r_items_reader;
    DataList3.DataBind(); 
}
List r_items_grid=(List)Session[“最近的_items”];
对于(int i=0;i

但我只看到datalist中的最后一条记录,问题是您一次选择一条记录,然后将其分配给数据源。执行此操作时,会覆盖上一个值。因此,您只能看到上一次查询的结果。您可以通过发出单个请求,然后将其绑定到列表来修复它:

下面的代码假设您知道
Session[“recent_items”]
存储整数,如果字符串可能存储在那里,那么您将面临SQL注入的风险

List<string> r_items_grid = (List<string>)Session["recent_items"];

string ids = string.Join(",", r_items_grid);    // Here you get IDs in format 1,2,3,4,5 etc.

OleDbCommand cmd_r_items= new OleDbCommand("SELECT product_id,product_name,product_price,product_image_1 from products where product_id IN ("+ ids + ")",con); 
r_items_reader=cmd_r_items.ExecuteReader();

DataList3.DataSource = r_items_reader;
DataList3.DataBind(); 
List r_items_grid=(List)Session[“最近的_items”];
string id=string.Join(“,”,r_items_grid);//在这里,您可以获得格式为1、2、3、4、5等的ID。
OleDbCommand cmd_r_items=新的OleDbCommand(“从产品中选择产品id、产品名称、产品价格、产品图片1,其中产品id位于(“+id+”),con”);
r_items_reader=cmd_r_items.ExecuteReader();
DataList3.DataSource=r\u items\u reader;
DataList3.DataBind();

不需要For循环

您可以使用逗号分隔的列表

string  commaSepara = String.Join(",", r_items_grid);

OleDbParameters commaSepara=new OleDbParameters("@commaSepara",SqlDbType.NVarchar,-1);
commaSepara.Value=commaSepara;
OleDbCommand cmd_r_items= new OleDbCommand(@"SELECT product_id,product_name,product_price,product_image_1 from products where product_id
 IN ( @commaSepara )",con); 


r_items_reader=cmd_r_items.ExecuteReader();

DataList3.DataSource = r_items_reader;
DataList3.DataBind(); 

如果我没有错的话,您正在尝试将字符串列表放入会话中。每次使用基于列表索引值的新字符串绑定datalist(DataList3)时遍历整个列表。所以它总是显示列表的最后一个字符串值。如果要根据列表获取所有数据,可以使用

List<string> r_items_grid = (List<string>)Session["recent_items"];

string items_id= string.Join(",", r_items_grid);// items_id may be like 1,2,3,4,5.

OleDbCommand cmd_r_items= new OleDbCommand("SELECT product_id,product_name,product_price,product_image_1 from products where product_id IN ("+ items_id + ")",con); 
r_items_reader=cmd_r_items.ExecuteReader();

DataList3.DataSource = r_items_reader;
DataList3.DataBind();
List r_items_grid=(List)Session[“最近的_items”];
string items_id=string.Join(“,”,r_items_grid);//项目id可能类似于1,2,3,4,5。
OleDbCommand cmd_r_items=新的OleDbCommand(“从产品中选择产品id、产品名称、产品价格、产品图像1,其中产品id位于(“+项目id+”),con”);
r_items_reader=cmd_r_items.ExecuteReader();
DataList3.DataSource=r\u items\u reader;
DataList3.DataBind();

“从(1,2,3,4,5…)中产品id所在的产品中选择产品id、产品名称、产品价格、产品图像1”查询用于获取项目id为1,2,3,4,5…的所有数据

这一点很明显,对于每次迭代,您都要更改数据源(DS)并重新绑定它,而不是这样做,您应该只分配DS一次,并只绑定到相同的DS一次,这应该在for-loop之外。另外,使用sql命令时要注意清理参数。您确定(@commaSepara)
中的
有效吗?我很确定SQL Server不允许this@dotnetom你能告诉我这里会出现什么问题吗?你可以在这里看到,只要运行上面的代码(或类似的代码),你自己就会看到