C#Collection没有从SQL Query接收数据

时间:2015-03-22 14:02:20

标签: c# sql sql-server sqldatareader

我一直在尝试使用SQL查询中的数据填充集合,但它似乎没有采取,我不知道为什么。我已经确认连接字符串是好的,我有充分的理由相信查询本身正在返回结果,但List集合并不想填充。代码编译并运行没有错误,但是,就像我说的,我的列表中没有数据。 :/(注意:表中唯一的数据是int和varchars)。 非常感谢任何帮助!

//create collection to dump SQL Query date into
List<String> creatureStats = new List<String>();

//Setup connection String to local DB
string connectionString = WindowsFormsApplication1.Properties.Settings.Default.CreaturesConnectionString;

//Open connection to db and run SQL Query
using (SqlConnection db = new SqlConnection(connectionString))
{
    string query = "SELECT * FROM Creatures WHERE CreatureName = @creatureName;";
    using (SqlCommand command = new SqlCommand(query, db))
    {
        //pass Creature name
        command.Parameters.AddWithValue("@creatureName", creatureName);
        db.Open();

        using (SqlDataReader reader = command.ExecuteReader())
        {
            for (int i = 0; i <= reader.FieldCount; i++)
            {
            while (reader.Read())
                {
                    if (!reader.IsDBNull(i))
                    {
                        if (reader.GetDataTypeName(i) == "int")
                            creatureStats.Add(creatureStats[i] = Convert.ToString(reader.GetInt32(i)));
                        else
                            creatureStats.Add(creatureStats[i] = reader.GetString(i));
                    }
                    else
                        creatureStats.Add(creatureStats[i] = string.Empty);
                }
             }
         }
    }
}

2 个答案:

答案 0 :(得分:0)

你的循环被破坏且不正确。

while (reader.Read())

必须是外循环

for (int i = 0; i <= reader.FieldCount; i++)

必须是内循环 因为reader.read从db中读取整条记录的下一条记录。

所以你需要这样的东西

while (reader.Read()){
    for (int i = 0; i <= reader.FieldCount; i++){
    }
}

现在对于内部循环,你的代码非常奇怪:

creatureStats.Add(creatureStats[i] = string.Empty);
creatureStats.Add(creatureStats[i] = reader.GetString(i));
creatureStats.Add(creatureStats[i] = Convert.ToString(reader.GetInt32(i)));

这些陈述应该做什么?即使这样可行,代码也不清楚,并向任何阅读它的人提出问题。将其拆分为2行。 我还没有做任何事情,因为我无法让自己知道你对这个陈述的意图是什么。 在我看来,你改变一个数组元素,同时再添加它。我不明白这一点的用处。

creatureStats.Add(string.Empty);
creatureStats.Add(reader.GetString(i));
creatureStats.Add(Convert.ToString(reader.GetInt32(i))); 

可能是你的意图。

答案 1 :(得分:-1)

打开连接后:

db.Open();

你必须写下这个:

command.ExecuteNonQuery();