【问题标题】:Returning data from ExecuteReader从 ExecuteReader 返回数据
【发布时间】:2017-11-23 08:39:49
【问题描述】:

我在从数据库中获取数据时遇到问题,因为我是 C# 语言的新手。我认为 ExecuteReader 应该检索所有行。顺便说一句,我无法访问充满对象的数据。而 reader.GetString(0) 它只返回给我数组对象的索引。

是否有任何来自 c# 的属性可以访问数据库中的行?

我正在寻找解决这个问题的答案。我会拨出帮助!

这是我目前的代码:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Npgsql;

namespace Sample.Controllers
{
    public class HomeController : Controller
    {
        public string Index()
        {
            var connString = "Host=localhost;Username=postgres;Password=123456;Database=dotnet_core_db";
            using (var conn = new NpgsqlConnection(connString))
            {
                conn.Open();
                // Retrieve all rows
                using (var cmd = new NpgsqlCommand("SELECT * FROM Persons", conn))
                using (var reader = cmd.ExecuteReader())
                while (reader.Read())
                {   
                    Console.WriteLine(reader.GetString(0));
                    Console.WriteLine(reader.GetString(1));
                    Console.WriteLine(reader.GetString(2));
                    Console.WriteLine(reader.GetString(3));
                    Console.WriteLine(reader.GetString(4));
                    ViewData["connString"] = connString;
                }


            }

            return connString;
        }

        public IActionResult Error()
        {
            ViewData["RequestId"] = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
            return View();
        }
    }
}

预期结果

{
        {
            id: 92,
            name: "foo",
            last_name: "bar",
            address: "adress Of foo",
            city: "city of foo"
        },
        {
            id: 872,
            name: "foo1",
            last_name: "bar 2",
            address: "address of foo1",
            city: "city of foo1"
        }
    }

【问题讨论】:

  • 顺便说一句,连接字符串应该存储在配置文件中
  • 你得到了什么?
  • @TimSchmelter 这只是一个示例,但我主要关注的是数据检索。
  • @RanjitSingh 我有 reader.GetString(0) = 92, reader.GetString(1) = 'foo', reader.GetString(2) = 'bar' ...但我的期望是 {{id: 92, name: "foo", last_name: "bar", address: "adress Of foo", city: "city of foo"}}
  • 您可以尝试reader["ColumnName"] 检索特定列的数据。然后你必须为此调用 tostring() 或任何你想要的演员。

标签: c# sql .net-core


【解决方案1】:

你可以像下面那样做

 using (var cmd = new NpgsqlCommand("SELECT * FROM Persons", conn))
 {
 using (var reader = cmd.ExecuteReader())
 {
     var columns = new List<string>();
     for(int i=0;i<reader.FieldCount;i++)
        columns.Add(reader.GetName(i));

    JsonArrayCollection jsonArray = new JsonArrayCollection();
     while (reader.Read())
    {   
        JsonObjectCollection jsonObject = new JsonObjectCollection();
        for(string columnName in columns)
            jsonObject.Add(new JsonStringValue(columnName, reader[columnName]));
        jsonArray.Add(jsonObject);
    }
 }
}

写在记事本里,如有编译错误请见谅。

注意:你可以使用任何 json 库,只是语法会改变。

【讨论】:

    【解决方案2】:

    数据检索正常。你需要的是一个 json 编写包。考虑像 json.net 这样的库来简化工作。

    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);
    using (JsonWriter writer = new JsonTextWriter(sw))
    {
        writer.Formatting = Formatting.Indented;
        while (dataReader.Read())
        {
            writer.WriteStartObject();
            for (int i = 0; i < dataReader.fieldCount; ++i)
            {
                writer.WritePropertyName(dataReader.GetName(i));
                writer.WriteValue(dataReader.GetValue(i).ToString());
            }
            writer.WriteEndObject();
        }
    }
    
    fileWriter.Write(sb.ToString());
    

    【讨论】:

      猜你喜欢
      • 2015-06-13
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 2020-11-17
      相关资源
      最近更新 更多