我试图搜索大量关于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#的详细解释。
提前谢谢。
发布于 2014-03-12 12:05:57
我在您的代码中发现了两个问题。第一,大写字母在PostgreSQL标识符上的用法。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;第二个问题是,当您将用户名从textbox连接到查询时,缺少字符串引号。因此,您应该执行以下操作(BAD PRACTICE):
string query = "Select \"USERNAME\" from helperdata.credentials where \"USERNAME\" = '"
+ textBox1.Text + "' and \"PASSWORD\" = '" + textBox2.Text + "'";这有一个很大的问题,您可以使用SQL注入。您可以创建一个函数(或者使用一个来自Npgsql的函数(不确定是否存在)来转义字符串,或者更恰当的是,您应该使用一个使用NpgsqlCommand接受查询中参数的函数,该函数可以简单地发送参数,也可以使用准备好的语句。
检查Npgsql文档,并查找“在查询中使用参数”和“使用准备好的语句”来查看示例(这里的HTML中没有锚点可链接,因此您必须搜索)。
https://stackoverflow.com/questions/22342278
复制相似问题