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

时间:2014-03-12 04:50:34

标签: c# .net postgresql npgsql

我试图在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#的详细说明。

提前致谢。

1 个答案:

答案 0 :(得分:2)

我在您的代码中发现了两个问题。首先在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注入。您可以创建一个函数(或使用Npgsql中的一个函数,不确定是否存在)来转义字符串,或者更恰当地说,您应该使用一个函数来使用NpgsqlCommand接受查询中的参数,您可以这么简单发送参数或使用准备好的声明。

Check the Npgsql documentation,找到"在查询中使用参数"和#34;使用准备好的陈述"查看示例(HTML中没有要在此处链接的锚点,因此您必须搜索)。