Search code examples
c#.netpostgresqlnpgsql

Npgsql Syntax Error at or near ":"


I've been looking at this for a few days now and I've done a lot of testing but I still can't get it to work. I'm using Npgsql 2.0.11.91 (I tried 2.0.11 as well) and PostgreSQL 9.04.

Using the example from the User Manual for Npgsql which can be found here. Search for "Working with .NET Datasets" to see the example. It works fine for me as it is but I'm trying to modify it to suit my needs.

My code is below. No matter what I try I get some sort of error. Using the code below which is pretty much exactly what's in the user manual I get an NpgsqlException was unhandled by user code

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();
}

Any ideas?

Pete.


Solution

  • You add the param e twice while not adding the param d at all...

    EDIT (from your code above):

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