我试图在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#的详细说明。
提前致谢。
答案 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中没有要在此处链接的锚点,因此您必须搜索)。