使用 Npgsql for Postgresql 的 C# 查询显示重复结果和缺失 table 数据
C# Query using Npgsql for Postgresql shows duplicate results and missing table data
我正在检查 PostgreSQL 作为 SQLServer 的潜在替代品,我在 PostgreSQL public 模式的测试数据库中创建了一个测试 table 并向测试添加了两行数据 table.
现在的问题是,当 运行 使用 NpgSQL.dll 从 C#.net 进行简单查询时,我得到了重复的结果,并且没有显示所有 table 数据。
这是我使用的代码:
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;
}
}
}
}
在您对每一行的初始方法中,您将显示其列直到索引为行数的列。我相信那不是你想做的。您应该每行显示每一列,如:
而不是
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());
}
}
重复内容的问题是由使用While(dRead.Read())
循环和使用foreach
循环table的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 public 模式的测试数据库中创建了一个测试 table 并向测试添加了两行数据 table.
现在的问题是,当 运行 使用 NpgSQL.dll 从 C#.net 进行简单查询时,我得到了重复的结果,并且没有显示所有 table 数据。
这是我使用的代码:
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;
}
}
}
}
在您对每一行的初始方法中,您将显示其列直到索引为行数的列。我相信那不是你想做的。您应该每行显示每一列,如:
而不是
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());
}
}
重复内容的问题是由使用While(dRead.Read())
循环和使用foreach
循环table的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());
}
}