为什么 ExecuteReader() 只有 returns 第一行?
Why ExecuteReader() only returns the first row?
希望你们一切都好。我试图从 table 中获取所有行,然后将它们放入列表中,但 ExecuteReader 仅 returns 第一行。它与列表有关还是有其他技术?有人可以帮忙吗!
using (SqlConnection mySqlConnection = new SqlConnection(AppConfiguration.ConnectionString))
{
SqlCommand myCommand = new SqlCommand("SelectCity", mySqlConnection);
myCommand.CommandType = CommandType.StoredProcedure;
SqlParameter prmcountrycode = new SqlParameter("@countrycode", SqlDbType.NVarChar, 50);
prmcountrycode.Value = countrycode;
myCommand.Parameters.Add(prmcountrycode);
mySqlConnection.Open();
List<string> allcitiesnames = new List<string>();
using (SqlDataReader myReader = myCommand.ExecuteReader())
{
int count = myReader.FieldCount;
if (myReader.Read())
{
allcitiesnames.Add(myReader.GetString(myReader.GetOrdinal("CityName")));
}
else
{
mySqlConnection.Close();
InsertNewCity(countrycode);
}
myReader.Close();
}
mySqlConnection.Close();
}
基本上SqlDataReader
设计为一次读取数据库行
改变
if (myReader.Read())
{
allcitiesnames.Add(myReader.GetString(myReader.GetOrdinal("CityName")));
}
else
{
mySqlConnection.Close();
InsertNewCity(countrycode);
}
到
while(myReader.Read())
{
if (myReader.Read())
{
allcitiesnames.Add(myReader.GetString(myReader.GetOrdinal("CityName")));
}
else
{
mySqlConnection.Close();
InsertNewCity(countrycode);
}
}
更新:
我建议您将程序更改为
,而不是两次调用数据库
create procedure SelectCity
@countrycode nvarchar(50)
as
begin
if exists(select top 1 CountryCode from mytable where CountryCode=@countrycode)
begin
select * from mytable
end
else
begin
insert into mytable (CountryCode)
values (@countryCode)
end
end
所以这将 select 所有如果存在,否则将其插入 table
通过使用 SqlDataReader
和 ExecuteReader
,其余部分将相同
如果你想直接使用所有行,你必须使用 SqlDataAdapter
并使用 DataTable
填充数据库中的数据,然后 return 来自数据库的 DataTable
。
SqlDataReader
以顺序方式逐行获取,参见 here how to use SqlDataAdapter, Also see this MSDN article
示例:
// Use DataAdapter to fill DataTable
DataTable t = new DataTable();
// 1
// Open connection
using (SqlConnection c = new SqlConnection("Connection string here"))
{
c.Open();
// 2
// Create new DataAdapter
using (SqlDataAdapter a = new SqlDataAdapter("Query Here", c))
{
// 3
// Fill DataTable with data
a.Fill(t);
}
}
试试这个,
while(myReader.Read())
{
allcitiesnames.Add(myReader.GetString(myReader.GetOrdinal("CityName")));
}
希望你们一切都好。我试图从 table 中获取所有行,然后将它们放入列表中,但 ExecuteReader 仅 returns 第一行。它与列表有关还是有其他技术?有人可以帮忙吗!
using (SqlConnection mySqlConnection = new SqlConnection(AppConfiguration.ConnectionString))
{
SqlCommand myCommand = new SqlCommand("SelectCity", mySqlConnection);
myCommand.CommandType = CommandType.StoredProcedure;
SqlParameter prmcountrycode = new SqlParameter("@countrycode", SqlDbType.NVarChar, 50);
prmcountrycode.Value = countrycode;
myCommand.Parameters.Add(prmcountrycode);
mySqlConnection.Open();
List<string> allcitiesnames = new List<string>();
using (SqlDataReader myReader = myCommand.ExecuteReader())
{
int count = myReader.FieldCount;
if (myReader.Read())
{
allcitiesnames.Add(myReader.GetString(myReader.GetOrdinal("CityName")));
}
else
{
mySqlConnection.Close();
InsertNewCity(countrycode);
}
myReader.Close();
}
mySqlConnection.Close();
}
基本上SqlDataReader
设计为一次读取数据库行
改变
if (myReader.Read())
{
allcitiesnames.Add(myReader.GetString(myReader.GetOrdinal("CityName")));
}
else
{
mySqlConnection.Close();
InsertNewCity(countrycode);
}
到
while(myReader.Read())
{
if (myReader.Read())
{
allcitiesnames.Add(myReader.GetString(myReader.GetOrdinal("CityName")));
}
else
{
mySqlConnection.Close();
InsertNewCity(countrycode);
}
}
更新:
我建议您将程序更改为
,而不是两次调用数据库create procedure SelectCity
@countrycode nvarchar(50)
as
begin
if exists(select top 1 CountryCode from mytable where CountryCode=@countrycode)
begin
select * from mytable
end
else
begin
insert into mytable (CountryCode)
values (@countryCode)
end
end
所以这将 select 所有如果存在,否则将其插入 table
通过使用 SqlDataReader
和 ExecuteReader
如果你想直接使用所有行,你必须使用 SqlDataAdapter
并使用 DataTable
填充数据库中的数据,然后 return 来自数据库的 DataTable
。
SqlDataReader
以顺序方式逐行获取,参见 here how to use SqlDataAdapter, Also see this MSDN article
示例:
// Use DataAdapter to fill DataTable
DataTable t = new DataTable();
// 1
// Open connection
using (SqlConnection c = new SqlConnection("Connection string here"))
{
c.Open();
// 2
// Create new DataAdapter
using (SqlDataAdapter a = new SqlDataAdapter("Query Here", c))
{
// 3
// Fill DataTable with data
a.Fill(t);
}
}
试试这个,
while(myReader.Read())
{
allcitiesnames.Add(myReader.GetString(myReader.GetOrdinal("CityName")));
}