2011-07-19 116 views
1

我一直在看这几天,我已经做了很多测试,但仍然无法使其工作。我使用Npgsql 2.0.11.91(我也试过2.0.11)和PostgreSQL 9.04。Npgsql语法错误处于或接近“:”

使用Npgsql的用户手册中的示例可以找到here。搜索“使用.NET数据集”查看示例。它对我来说工作正常,但我试图修改它以适应我的需求。

我的代码如下。无论我尝试什么,我都会遇到某种错误。使用下面的代码,这是非常正是是在用户手册,我得到一个NpgsqlException是由用户代码

ERROR: 42601: syntax error at or near ":". 
private void tryThis() 
{ 
    // This method expects the following table in the backend: 
    // 
    // create table customers(code varchar, reference varchar, description varchar, street varchar, suburb varchar, postcode varchar); 
    // 
    // 

    NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=postgres;Password=password;Database=testdatabase;"); 
    conn.Open(); 

    DataSet ds = new DataSet(); 

    NpgsqlDataAdapter da = new NpgsqlDataAdapter("select * from customers", conn); 

    da.InsertCommand = new NpgsqlCommand("insert into customers(code, reference, description, street, suburb, postcode) " + 
           " values (:a, :b, :c, :d, :e, :f)", conn); 

    da.InsertCommand.Parameters.Add(new NpgsqlParameter("a", NpgsqlDbType.Varchar)); 
    da.InsertCommand.Parameters.Add(new NpgsqlParameter("b", NpgsqlDbType.Varchar)); 
    da.InsertCommand.Parameters.Add(new NpgsqlParameter("c", NpgsqlDbType.Varchar)); 
    da.InsertCommand.Parameters.Add(new NpgsqlParameter("e", NpgsqlDbType.Varchar)); 
    da.InsertCommand.Parameters.Add(new NpgsqlParameter("e", NpgsqlDbType.Varchar)); 
    da.InsertCommand.Parameters.Add(new NpgsqlParameter("f", NpgsqlDbType.Varchar)); 

    da.InsertCommand.Parameters[0].Direction = ParameterDirection.Input; 
    da.InsertCommand.Parameters[1].Direction = ParameterDirection.Input; 
    da.InsertCommand.Parameters[2].Direction = ParameterDirection.Input; 
    da.InsertCommand.Parameters[3].Direction = ParameterDirection.Input; 
    da.InsertCommand.Parameters[4].Direction = ParameterDirection.Input; 
    da.InsertCommand.Parameters[5].Direction = ParameterDirection.Input; 

    da.InsertCommand.Parameters[0].SourceColumn = "code"; 
    da.InsertCommand.Parameters[1].SourceColumn = "reference"; 
    da.InsertCommand.Parameters[2].SourceColumn = "description"; 
    da.InsertCommand.Parameters[3].SourceColumn = "street"; 
    da.InsertCommand.Parameters[4].SourceColumn = "suburb"; 
    da.InsertCommand.Parameters[5].SourceColumn = "postcode"; 

    da.Fill(ds); 

    DataTable dt = ds.Tables[0]; 

    DataRow dr = dt.NewRow(); 
    dr["code"] = "CUST1"; 
    dr["reference"] = "C"; 
    dr["description"] = "Customer 1"; 
    dr["street"] = "1 Big Street"; 
    dr["suburb"] = "BRISBANE QLD"; 
    dr["postcode"] = "4000"; 
    dt.Rows.Add(dr); 

    DataSet ds2 = ds.GetChanges(); 

    da.Update(ds2); 

    ds.Merge(ds2); 
    ds.AcceptChanges(); 
} 

任何想法未处理?

皮特。

+0

采用了直板的ADO.NET类,通常你指定完整参数名称(例如,如果你把'@ id'在查询中,参数名称必须是''@id“',而不是''id”')。尝试将冒号添加到参数名称? –

回答

4

您添加帕拉姆e两倍,而不是增加帕拉姆d在所有...

EDIT(从上面的代码):

da.InsertCommand.Parameters.Add(new NpgsqlParameter("e", NpgsqlDbType.Varchar)); 
da.InsertCommand.Parameters.Add(new NpgsqlParameter("e", NpgsqlDbType.Varchar)); 
+1

哇,这是令人尴尬的。谢谢!我想,休息时间。 – user526549

+1

有3种方法可以尝试去找到这个问题。 1. NpgsqlException有一个ErrorSql属性,它告诉你哪个sql提供了这个问题。 2.您可以启用Npgsql日志记录并检查哪个sql Npgsql发送到服务器。 3.您可以启用postgresql服务器日志记录并检查正在接收哪些查询。我希望它有帮助。 –

1

我也有问题,该文件Npgsql的下面,并用冒号声明参数时出错。 原来,你可以使用.NET风格AddWithValue最新的版本,例如,

cmd.Parameters.AddWithValue("@paramName", paramValue); 
相关问题