2011-07-19 77 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); 
相關問題