Exception 索引超出范围异常
我正试图用存储过程来填充VisualStudio端的列表 我正在使用以下存储过程:Exception 索引超出范围异常,exception,exception-handling,sqldatareader,Exception,Exception Handling,Sqldatareader,我正试图用存储过程来填充VisualStudio端的列表 我正在使用以下存储过程: CREATE PROCEDURE [dbo].[GetColletcion] AS BEGIN select CollectionType.Name ,GlassesCollection.Name from GlassesCollection inner join CollectionType on GlassesCollection.Collection
CREATE PROCEDURE [dbo].[GetColletcion]
AS
BEGIN
select CollectionType.Name ,GlassesCollection.Name
from GlassesCollection
inner join CollectionType
on GlassesCollection.CollectionType=CollectionType.CollTypeID
END
以下是背后的代码:
protected void Button1_Click(object sender, EventArgs e)
{
List<GlassesCollection> list = new List<GlassesCollection>();
using (SqlConnection conn = new SqlConnection("Server=(local);DataBase=ISeeOptic;Integrated Security=SSPI"))
{
GlassesCollection gln = new GlassesCollection();
SqlCommand cmd = new SqlCommand();
SqlDataReader reader;
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "GetColletcion";
conn.Open();
reader = cmd.ExecuteReader();
while (reader.Read())
{
gln.Name = (string)reader["CollectionType.Name"];
gln.CollectionType = (string)reader["GlassesCollection.Name"];
list.Add(gln);
}
reader.Close();
conn.Close();
}
}
我得到一个例外:
Exception Details: System.IndexOutOfRangeException: CollectionType.Name
索引超出范围,但在数据库中有多条记录。
我怎样才能解决我的问题呢?我也纠正了你的打字错误。(GetCollection) 代码隐藏:
protected void Button1_Click(object sender, EventArgs e)
{
List<GlassesCollection> list = new List<GlassesCollection>();
using (SqlConnection conn = new SqlConnection("Server=(local);DataBase=ISeeOptic;Integrated Security=SSPI"))
{
GlassesCollection gln = new GlassesCollection();
SqlCommand cmd = new SqlCommand();
SqlDataReader reader;
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "GetCollection";
conn.Open();
reader = cmd.ExecuteReader();
while (reader.Read())
{
gln.Name = (string)reader["GlassesCollection_Name"];
gln.CollectionType = (string)reader["CollectionType_Name"];
list.Add(gln);
}
reader.Close();
conn.Close();
}
}
受保护的无效按钮1\u单击(对象发送者,事件参数e)
{
列表=新列表();
使用(SqlConnection conn=newsqlconnection(“服务器=(本地);数据库=iSeopic;集成安全=SSPI”))
{
GlasseCollection gln=新的GlasseCollection();
SqlCommand cmd=新的SqlCommand();
SqlDataReader;
cmd.Connection=conn;
cmd.CommandType=CommandType.storedProcess;
cmd.CommandText=“GetCollection”;
conn.Open();
reader=cmd.ExecuteReader();
while(reader.Read())
{
gln.Name=(字符串)读取器[“GlasseCollection_Name”];
gln.CollectionType=(字符串)读取器[“CollectionType_Name”];
列表。添加(gln);
}
reader.Close();
康涅狄格州关闭();
}
}
最好使用列别名,并通过这些别名引用列
CREATE PROCEDURE [dbo].[GetColletcion]
AS
BEGIN
select CollectionType.Name As TypeName ,GlassesCollection.Name As GlassesName
from GlassesCollection
inner join CollectionType
on GlassesCollection.CollectionType=CollectionType.CollTypeID
END
然后使用
(string)reader["TypeName"];
(string)reader["GlassesName"];
如果无法更改存储过程,则可以使用原始位置:
(string)reader[0]; //CollectionType.Name
(string)reader[1]; //GlassesCollection.Name
我已经对我的存储过程进行了更改,并且它工作正常。但是我不明白我的代码有什么问题?为什么它不工作?对于原始代码,您返回了两个同名的列。当SQL将结果返回给客户机时,它只返回列的名称,而不返回表和列的名称。如果要循环遍历所有字段名,您会注意到“Name”的两个实例。如果您访问了reader[“Name”],它将只返回第一个匹配列的数据。
(string)reader["TypeName"];
(string)reader["GlassesName"];
(string)reader[0]; //CollectionType.Name
(string)reader[1]; //GlassesCollection.Name