在C#中从SQL数据库读取数值

27

我刚开始学习C#,可以无问题地将数据写入数据库。但是我在阅读方面有问题,虽然SQL执行得很好,但我在存储它方面遇到了问题。我该如何存储应返回的四列,然后将它们显示为消息框?谢谢。

SqlCommand myCommand = new SqlCommand("select * from Requests where Complete = 0", myConnection);
SqlDataReader myReader = myCommand.ExecuteReader();
while (myReader.Read())

Console.WriteLine(myReader["Username"].ToString());
Console.WriteLine(myReader["Item"].ToString());
Console.WriteLine(myReader["Amount"].ToString());
Console.WriteLine(myReader["Complete"].ToString());

6
在使用C#中的数据库时,你应该真正关注Linq2SQL或Entity Framework。它们能够大大简化操作。 - Albin Sunnanbo
1
@abatishchev Linq2Sql 在我的工作中很常用。我个人的经验是,它的可读性、编译时类型检查和智能感应功能确实有助于提高生产力。 - Albin Sunnanbo
4
@Albin:我同意ORM是一项伟大的技术,但并不必须在任何地方都使用它。对于新手来说,它会带来更多的困惑而非教育作用。 - abatishchev
在这个问题中,与数据库无关,更多的是关于如何在读取数据后处理它。发帖者显然对编程的初学者问题感到困惑。 - TomTom
5个回答

31

问题之一是在 while 循环后缺少括号

while (myReader.Read())
{  // <<- here
    Console.WriteLine(myReader["Username"].ToString());
    Console.WriteLine(myReader["Item"].ToString());
    Console.WriteLine(myReader["Amount"].ToString());
    Console.WriteLine(myReader["Complete"].ToString());
}  // <<- here

如果省略大括号,每次循环只会处理第一行,剩余的将在循环后处理,此时myReader已经超过了最后一行。


7
如果这个回答解决了你的问题,那么请务必将其标记为答案。在答案帖子中,这是一个复选框勾选的符号。 - Matthew Cox

26

不要忘记使用 using(){} 块:

using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand("select * from Requests where Complete = 0", connection))
{
    connection.Open();  
    using (SqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            Console.WriteLine(reader["Username"].ToString());
            Console.WriteLine(reader["Item"].ToString());
            Console.WriteLine(reader["Amount"].ToString());
            Console.WriteLine(reader["Complete"].ToString());
        }
    }
}

7

个人建议编写一个具有4个属性(名称和类型匹配)的类,然后使用“dapper”(http://code.google.com/p/dapper-dot-net/):

var data = connection.Query<Request>(
    "select * from Requests where Complete = 0").ToList();

有类似这样的东西:

public class Request {
    public string Username{get;set;}
    ...
    public bool Complete {get;set;}
}

Dapper是一款免费、简单易用的工具,它支持参数化查询以避免SQL注入,并且操作速度非常快。


0

我知道有点晚了,但你可以使用本地字符串变量、字符串数组或列表将数据插入数据库,然后在控制台中调用它。


0
我会创建一个带有属性的对象来保存这些值,然后根据需要传递该对象。
public class YourObjectName
{
   public string Username { get; set; }
   public string Item { get; set; }
   public string Amount { get; set; }
   public string Complete { get; set; }
}

YourObjectName a = new YourObjectName();
a.Username = Reader['Username'].ToString();

3
永远、绝对不要将自定义类型命名为Object :) - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接