2011-07-19 17 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(); 
} 

未処理でしたか?

Pete。 (上記のコードから)のparam d全く...

EDITを追加していない間

+0

ストレートADO.NETクラスを使用して、通常は全体のパラメータ名(つまり、あなたが入れた場合は、 '@ id'を指定し、例えばあなたは.NETスタイルのAddWithValueを使用することができ、最新バージョンで判明しますクエリでは、パラメータ名は '' id ''ではなく' '@id" 'でなければなりません)。パラメータ名にコロンを追加してみてください。 –

答えて

4

あなたは二回のparam eを追加します。

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

うわー、それは恥ずかしいです。ありがとう!休憩時間だと思います。 – user526549

+1

この問題を見つけるには3つの方法があります。 1. NpgsqlExceptionには、どのsqlが問題を出したかを示すErrorSqlプロパティがあります。 2. Npgsqlロギングを有効にし、どのsql Npgsqlがサーバーに送信しているかを確認できます。 3. postgresqlサーバのロギングを有効にして、どのクエリが受信されているかを確認できます。私はそれが助けて欲しい –

1
私もNpgsqlのドキュメント、次のような問題を、持っていた

、コロンでパラメータを宣言するときにエラーが発生する。 それは

cmd.Parameters.AddWithValue("@paramName", paramValue);