我有以下c#代码:
using (SqlConnection connection = new SqlConnection(connString))
{
//Get Parent Task
SqlCommand command = new SqlCommand(queryStringParent, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
if (!string.IsNullOrEmpty(fkobjectid) && fkobjectid != " ")
{
if (reader.HasRows)
{
gvParentTasks.DataSource = reader;
gvParentTasks.DataBind();
}
while (reader.read())
{
}
}
}
如果仅使用第一行填充GridView(gvParentTasks
)。如何使用while (reader.read())
读取所有行并为所有行填充GridView?
答案 0 :(得分:3)
实际上你需要做得更难。您可以在前端创建页面。您所要做的就是:
<asp:SqlDataSource
id="sdsOrderReview" runat="server"
ConnectionString="<%$ ConnectionStrings:ECommerceDB %>"
ProviderName="System.Data.SqlClient"
SelectCommand="SELECT [OrderId], [AccountId], [Name]
FROM [Order] ORDER BY [OrderId] DESC">
</asp:SqlDataSource>
这是一个简单的例子,然后对于你的网格视图,你需要做的就是:
<asp:GridView id="gvOrder" runat="server" DataSourceId=sdsOrderReview">
然后它会自动用您查询中的数据填充网格。此外,它将存在于整个页面状态。通过后端执行此操作,您必须确保在页面加载时调用它,因为您可能遇到持续存在的问题。
答案 1 :(得分:2)
您应该使用SqlDataAdapter
代替填写DataSet
,然后填充GridView
:
using (SqlConnection connection = new SqlConnection(connString))
{
//Get Parent Task
SqlCommand command = new SqlCommand(queryStringParent, connection);
connection.Open();
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(command);
if (!string.IsNullOrEmpty(fkobjectid) && fkobjectid != " ")
{
da.Fill(ds);
gvParentTasks.DataSource = ds.Tables[0];
gvParentTasks.DataBind();
}
}
答案 2 :(得分:1)
只需从代码中删除while (reader.read())
,您就会看到来自DataReader
SqlDataReader reader = command.ExecuteReader();
gvParentTasks.DataSource = reader;
gvParentTasks.DataBind();
答案 3 :(得分:1)
最简单的方法:使用SqlDataAdapter
来填充DataTable
:
DataTable data = new DataTable();
using (var connection = new SqlConnection(connString))
using (var command = new SqlCommand(queryStringParent, connection))
using(var da = new SqlDataAdapter(command))
{
// you don't need to open/close the connection with Fill
da.Fill(data);
}
gvParentTasks.DataSource = data;
gvParentTasks.DataBind();
但是,对于SqlDataSource
直接使用DataSource
作为GridView
也应该有效:
SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
gvParentTasks.DataSource = reader;
gvParentTasks.DataBind();
我认为你问题的原因是:
while (reader.read())
{
}
消耗所有记录。