C# Query using Npgsql for Postgresql 显示重复的结果和丢失的表数据

Posted

技术标签:

【中文标题】C# Query using Npgsql for Postgresql 显示重复的结果和丢失的表数据【英文标题】:C# Query using Npgsql for Postgresql shows duplicate results and missing table data 【发布时间】:2015-03-11 20:44:49 【问题描述】:

我正在检查 PostgreSQL 作为 SQLServer 的潜在替代品,我在 PostgreSQL 公共架构的测试数据库中创建了一个测试表,并向测试表添加了两行数据。

现在的问题是,当使用 NpgSQL.dll 从 C#.net 运行简单查询时,我得到重复的结果,并且并未显示所有表数据。

这是我使用的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using Npgsql;


namespace PlayingWithPostgres

    class Program
    
        static void Main(string[] args)
        
            // creating the connection string (Server, Port, User id, password, database)
            string conStr = "Server=127.0.0.1; Port=5432; User Id=postgres; Password=Sada1973; Database=CarsTestDB;";
            NpgsqlConnection conn = new NpgsqlConnection(conStr);
            string comStr = "Select * FROM \"CarsTable\";";
            NpgsqlCommand com = new NpgsqlCommand(comStr, conn);
            NpgsqlDataAdapter ad = new NpgsqlDataAdapter(com);
            DataTable dt = new DataTable();
            Console.WriteLine("Conection to server established successfuly \n");
            // check if connection is open or not
            if(conn != null && conn.State == ConnectionState.Open)
            
                Console.WriteLine("Connection Open");
                conn.Close();
            
            else
            
                conn.Open();
            

            // Fill data table with data and start reading
            ad.Fill(dt);
            NpgsqlDataReader dRead = com.ExecuteReader();

            try
            
                Console.WriteLine("Contents of table in database: \n");
                while (dRead.Read())
                
                    foreach(DataRow row in dt.Rows)
                    
                        for (int i = 0; i < dt.Rows.Count; i++)
                        
                            Console.Write("0 \t \n", row[i].ToString());
                        
                    
                
            
            catch (NpgsqlException ne)
            
                Console.WriteLine("Problem connecting to server, Error details 0", ne.ToString());
            
            finally
            
                Console.WriteLine("Closing connections");
                dRead.Close();
                dRead = null;
                conn.Close();
                conn = null;
                com.Dispose();
                com = null;
            
        
    

【问题讨论】:

【参考方案1】:

重复内容的问题是由使用While(dRead.Read()) 的循环和使用foreach 的表的DataRows 循环引起的。这有效地循环了您的数据两次。

如果您想使用DataReader 循环遍历记录,则不需要DataRow 和DataTable,而是使用DataReader 的FieldCount 属性和DataReader 索引器来处理当前记录。

// Not needed
// ad.Fill(dt);
NpgsqlDataReader dRead = com.ExecuteReader();

while (dRead.Read())

   for(int i = 0; i < dRead.FieldCount; i++)
       Console.Write("0 \t \n", dRead[i].ToString());

如果您想循环遍历 DataTable 及其行,则需要使用 Columns.Count 循环

ad.Fill(dt);
// Not needed
// NpgsqlDataReader dRead = com.ExecuteReader();
foreach(DataRow row in dt.Rows)

    for (int i = 0; i < dt.Columns.Count; i++)
    
        Console.Write("0 \t \n", row[i].ToString());
    

【讨论】:

两种方法都有效,现在我显示了整个表格数据,但仍然重复(我的意思是每条记录显示两次)。 抱歉,可以看到您的新代码。当然,您只使用上述两种方法中的一种,对吧? 当然我只使用了一种方法,但仍然得到重复的结果,我是 PostgreSQL 新手,一直在 SQLServer 上工作,这也是我使用数据表和数据读取器但只运行查询的原因一种仅用于测试 PostgreSQL 目的的方法。 也许您可以将新代码添加到您原来的问题中。 我知道了,您建议的第一种方法可以很好地删除重复项,非常感谢我的朋友,不胜感激。【参考方案2】:

在您对每一行的初始方法中,您将其列显示到索引 = 行数的列。我相信这不是你想做的。您应该显示每行的每一列,例如:

代替

foreach(DataRow row in dt.Rows)

    for (int i = 0; i < dt.Rows.Count; i++)
    
        Console.Write("0 \t \n", row[i].ToString());
    

用途:

foreach(DataRow row in dt.Rows)

    for (int i = 0; i < row.ItemArray.Length; i++)
    
        Console.Write("0 \t \n", row.ItemArray[i].ToString());
    

【讨论】:

找不到 DataTable dt 的 ItemArray。 对不起,意思是排。现已编辑。

以上是关于C# Query using Npgsql for Postgresql 显示重复的结果和丢失的表数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 npgsql 在 c# 中插入

如何在 C# 中从 Npgsql 4.1.5.0 执行匿名块 PL/pgSQL (PostgreSQL 13)

尝试在同一连接中运行多个命令时 C# Winforms Npgsql 3.0.5“操作已在进行中”错误

Npgsql 如何处理失败的事务?

Elasticsearch NEST – Examples for mapping between Query and C#

like 使用参数的 npgsql 语句