【问题标题】:Reading values from SQL database in C#在 C# 中从 SQL 数据库中读取值
【发布时间】:2011-08-25 14:22:36
【问题描述】:

我刚开始学习 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());

【问题讨论】:

  • 在 c# 中使用数据库时,您应该真正了解一下 Linq2SQL 或实体框架。它简化了很多。
  • @abatishchev Linq2Sql 经常帮助我。根据我的经验,可读性、编译时类型检查和智能感知确实有助于提高生产力。
  • @Albin:我同意 ORM 是一项很棒的技术,但没有必要在任何地方都使用它。在新手级别上,它会混淆更多然后教
  • 最重要的是,这个问题与数据库无关,而是与读取数据后如何处理数据有关。海报受到有关编程的初学者问题的挑战。

标签: c# .net sql-server tsql ado.net


【解决方案1】:

一个问题是在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 超过最后一行。

【讨论】:

  • @Paul 如果这回答了您的问题(似乎是这种情况),请务必将回复标记为答案。这是答案帖子的复选标记符号。
【解决方案2】:

别忘了使用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());
        }
    }
}

【讨论】:

    【解决方案3】:

    我会创建一个具有保存这些值的属性的对象,然后根据需要传递该对象。

    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();
    

    【讨论】:

    • 永远,永远,永远调用自定义类型Object :)
    【解决方案4】:

    我个人会编写一个具有 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 注入,而且速度非常快。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-30
        • 1970-01-01
        • 1970-01-01
        • 2012-12-25
        • 2012-10-21
        • 1970-01-01
        相关资源
        最近更新 更多