我正在研究嵌套转发器。我的问题似乎就在于,当我执行我的SQL命令时,没有数据返回给数据读取器。即使我运行完全相同的查询(复制和粘贴)到SQL Server。
我的noteDrClient阅读器不包含数据,但它确实知道表中有5列。我不知道此时该做什么,或者为什么没有数据传递到数据读取器。任何人都可以看到一个明显的问题吗?
SqlConnection con = new SqlConnection("Data Source=***;Initial Catalog=*;User ID=*;Password=*;Integrated Security=False;MultipleActiveResultSets=true;");
上面是我的连接字符串。请注意,我将多个活动结果集设置为true。我之所以这样做,是因为我的数据阅读器处于打开状态时仍然出现错误,即使它已关闭。
protected void rptList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
RepeaterItem item = e.Item;
if ((item.ItemType == ListItemType.Item) ||
(item.ItemType == ListItemType.AlternatingItem))
{
System.Data.Common.DbDataRecord rd = (System.Data.Common.DbDataRecord)e.Item.DataItem;
Repeater nestedRepeater = e.Item.FindControl("NotesRepeater") as Repeater;
string FID = rd[0].ToString();
using (cmd2 = new SqlCommand("SELECT * FROM notes WHERE FID = 1356;", con)) ;
SqlDataReader noteDrClient = cmd2.ExecuteReader(); //no data is being filled to the data reader... even though this command pulls data in SQL Server Management Studio.
if (noteDrClient.Read()) { //bind the repeater if there is data to bind
nestedRepeater.DataSource = noteDrClient;
nestedRepeater.DataBind();
}
noteDrClient.Close();
}
答案 0 :(得分:2)
您正在使用语句在您有机会使用之前处置SqlCommand。此外,您正在尝试绑定到DataReader。将数据读取器的结果导入“Note”实体的集合,然后绑定到集合。
using (SqlCommand cmd2 = new SqlCommand("SELECT * FROM notes WHERE FID = 1356;", con))
{
using(SqlDataReader noteDrClient = cmd2.ExecuteReader())
{
while (noteDrClient.Read())
{
Note n = new Note();
... get note from data reader
notes.Add(n); // add note to collection
}
}
}
// bind child
nestedRepeater.DataSource = notes;
nestedRepeater.DataBind();
修改强> 的
您可能需要查看DataAdapter - http://www.mikesdotnetting.com/Article/57/Displaying-One-To-Many-Relationships-with-Nested-Repeaters
答案 1 :(得分:0)
我通过创建一个额外的连接字符串而不是重复使用我用于主转发器的相同连接字符串来解决问题。数据仍然没有约束力,但确实存在。
using (cmd2 = new SqlCommand("SELECT * FROM notes WHERE FID = 1356;", con2)) ;
答案 2 :(得分:0)
我认为查询中的分号可能会导致问题。
尝试在值周围使用引号,如下所示:
SELECT * FROM notes WHERE FID = '1356;'
如果分号不是值的一部分:
SELECT * FROM notes WHERE FID = '1356'