gpt4 book ai didi

c# - 使用 Npgsql 和 c# 的选择查询没有结果

转载 作者:行者123 更新时间:2023-11-29 13:03:21 25 4
gpt4 key购买 nike

我尝试大量搜索有关 Npgsql 和 C# 的教程。但我无法解决以下问题。

当我运行该程序时,我的程序在执行查询时停止并中断。当我尝试调试并检查执行读取器的返回值是否为空时。

下面是示例代码:

string user=textBox1.Text;
NpgsqlConnection dataconnect = new NpgsqlConnection(
"Server=127.0.0.1;Port=5432;User Id=dbuser;Password=dbpass;Database=dbname;");


string query = "Select USERNAME from helperdata.credentials where USERNAME = "
+ textBox1.Text + " and PASSWORD = " + textBox2.Text;
dataconnect.Open();

NpgsqlCommand command = new NpgsqlCommand(query, dataconnect);


NpgsqlDataReader reader = command.ExecuteReader();

if(reader.Read())
{
MessageBox.Show("Login Successful");
}
else
{
MessageBox.Show("Login failed");
}
reader.Close();
dataconnect.Close();

当我尝试在 Pgsql 中运行以下查询时,它会返回数据。

       Select "USERNAME" from helperdata.credentials where "USERNAME" = 'admin'

我是 Npgsql 新手。

我也希望有人可以提供一些很好的教程网站,其中提供了 Npgsql 和 C# 的详细解释。

提前致谢。

最佳答案

我在您的代码中发现了两个问题。第一个大写字母在PostgreSQL identifiers上的使用. PostgreSQL 允许使用非简单小写字母的标识符,但前提是您要引用它们。

事实上,你可以使用,例如:

CREATE TABLE helperdata.credentials (... USERNAME varchar, ...);

但 PostgreSQL 会将其转换为:

CREATE TABLE helperdata.credentials (... username varchar, ...);

因此,要使其真正保留为大写字母,您必须按如下方式引用它:

CREATE TABLE helperdata.credentials (... "USERNAME" varchar, ...);

这似乎是您创建表的方式,问题是您总是在查询中引用该表,您必须引用它。所以你的查询的开头应该是:

string query = "Select \"USERNAME\" from helperdata.credentials ... ";

我的建议是修改您的列名和表名,不要使用此类标识符。对于这种情况,您可以这样做:

ALTER TABLE helperdata.credentials RENAME COLUMN "USERNAME" TO username;

第二个问题是,当您将文本框中的用户名连接到查询中时,缺少字符串引号。因此,您应该执行以下操作(BAD PRACTICE):

string query = "Select \"USERNAME\" from helperdata.credentials where \"USERNAME\" = '"
+ textBox1.Text + "' and \"PASSWORD\" = '" + textBox2.Text + "'";

这有一个很大的问题,你可以进行 SQL 注入(inject)。您可以创建一个函数(或使用 Npgsql 中的函数,不确定是否存在)来转义字符串,或者更恰本地说,您应该使用一个函数,该函数在使用 NpgsqlCommand 的查询中接受参数,这您可以简单地发送参数或使用准备好的语句。

Check the Npgsql documentation , 并找到“在查询中使用参数”和“使用准备好的语句”以查看示例(HTML 中没有可链接到此处的 anchor ,因此您必须进行搜索)。

关于c# - 使用 Npgsql 和 c# 的选择查询没有结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22342278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com