首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Npgsql和c#对select查询没有结果

使用Npgsql和c#对select查询没有结果
EN

Stack Overflow用户
提问于 2014-03-12 04:50:33
回答 1查看 5.2K关注 0票数 2

我试图搜索大量关于Npgsql和c#的教程。但我无法解决以下问题。

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

下面是示例代码:

代码语言:javascript
复制
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中运行以下查询时,它会返回数据。

代码语言:javascript
复制
       Select "USERNAME" from helperdata.credentials where "USERNAME" = 'admin'

我是Npgsql的新手。

我还希望有人能为我提供一些好的教程站点,这些站点提供了对Npgsql和C#的详细解释。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-12 12:05:57

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

实际上,您可以使用,例如:

代码语言:javascript
复制
CREATE TABLE helperdata.credentials (... USERNAME varchar, ...);

但是PostgreSQL会将其转换为:

代码语言:javascript
复制
CREATE TABLE helperdata.credentials (... username varchar, ...);

因此,要使它真正离开大写,您必须引用如下:

代码语言:javascript
复制
CREATE TABLE helperdata.credentials (... "USERNAME" varchar, ...);

这似乎就是您创建表的方式,而问题在于,您总是在查询中引用该表,您将不得不引用它。因此,查询的开头应该是:

代码语言:javascript
复制
string query = "Select \"USERNAME\" from helperdata.credentials ... ";

我的建议是修改列名和表名,以避免使用此类标识符。在这种情况下,您可以:

代码语言:javascript
复制
ALTER TABLE helperdata.credentials RENAME COLUMN "USERNAME" TO username;

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

代码语言:javascript
复制
string query = "Select \"USERNAME\" from helperdata.credentials where \"USERNAME\" = '"
    + textBox1.Text + "' and \"PASSWORD\" = '" + textBox2.Text + "'";

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

检查Npgsql文档,并查找“在查询中使用参数”和“使用准备好的语句”来查看示例(这里的HTML中没有锚点可链接,因此您必须搜索)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22342278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档