2011-06-22 26 views
1

我想通過存儲過程來訪問Postgres的..當我執行功能,它是成功的,但是當我運行它使用C#他有一個錯誤存儲過程PostgreSQL和C#WPF

:語法錯誤或接近「 )」 SQLERROR :SELECT * FROM laporan_kab('32 ':: VARCHAR,'14' :: VARCHAR) 爲()

我的功能是:

CREATE OR REPLACE FUNCTION laporan_kab(aprop character varying, atahun character varying) 
    RETURNS TABLE (kode_wilda varchar(255), wilayah varchar(255), dda integer, statda integer, lainnya integer) AS 
$BODY$ 

DECLARE 
    jml_wilda integer; 
    jml_dda integer; 
    jml_statda integer; 
    jml_lainnya integer; 
    nm_wilayah varchar(255); 
    i integer; 
    aprod varchar(255); 

BEGIN 

    CREATE TEMP TABLE lap (
    akode_wilda varchar(255), 
    awilayah varchar(255), 
    adda integer, 
    astatda integer, 
    alainnya integer 
    ); 

    CREATE TEMP TABLE wilda (
    id serial, 
    kd_prop varchar(255), 
    kd_kab varchar(255), 
    kd_kec varchar(255), 
    no_urut integer, 
    nm_wilda varchar(255) 
    ); 

    INSERT into wilda(kd_prop,kd_kab,kd_kec,no_urut,nm_wilda) SELECT kd_prop,kd_kab,kd_kec,no_urut,nm_wilda from t_history_wilda where is_active = '1' and kd_prop = aprop and kd_kec = '000' and kd_kab != '00'; 

    SELECT count(*) INTO jml_wilda from wilda; 

    i := 1; 
    while(i <= jml_wilda) 
    LOOP 

     SELECT kd_prop||kd_kab||kd_kec||no_urut INTO aprod from wilda WHERE id = i; 

     SELECT count(*) INTO jml_dda from t_publikasi where kd_produsen = aprod and kd_bahan_pustaka ='121' and thn_terbit = atahun; 
     SELECT count(*) INTO jml_statda from t_publikasi where kd_produsen = aprod and kd_bahan_pustaka ='122' and thn_terbit = atahun; 
     SELECT count(*) INTO jml_lainnya from t_publikasi where kd_produsen = aprod and kd_bahan_pustaka !='121' and kd_bahan_pustaka !='122' and thn_terbit = atahun; 
     SELECT nm_wilda INTO nm_wilayah from wilda WHERE id = i; 

     INSERT INTO lap values (aprod,nm_wilayah,jml_dda,jml_statda,jml_lainnya); 
     i := i + 1; 
    END LOOP; 

    PERFORM * from lap; 
    RETURN QUERY SELECT * from lap ; 

END 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION laporan_kab(character varying, character varying) OWNER TO postgres; 

和我的C#代碼:

public DataSet LapPubDa(string kode, string tahun) 
    { 
     DBConnection odbCon = new DBConnection(); 
     DBData odbData = new DBData(); 
     DataSet ds = new DataSet(); 
     DBParameter akode = new DBParameter(); 
     string aprop = "aprop"; 
     akode.Name = aprop; 
     akode.Type = NpgsqlTypes.NpgsqlDbType.Varchar; 
     akode.Value = kode; 
     DBParameter atahun = new DBParameter(); 
     string btahun = "atahun"; 
     atahun.Name = btahun; 
     atahun.Type = NpgsqlTypes.NpgsqlDbType.Varchar; 
     atahun.Value = tahun; 
     DBParameter[] param = { akode, atahun }; 
     string cmd = "laporan_kab"; 
     odbData = odbCon.ExecuteStoredProcedureCommand(cmd, param); 
     return ds; 
    } 
+1

你正在創建臨時表,每次你運行它時,你刪除它們? – Syeda

回答

1

大概是因爲:

select * from laporan_kab('32'::varchar,'14'::varchar) as() 
-- note the missing "as ('x', 'y', 'z')" 

我看你是查詢返回的東西:

RETURN QUERY SELECT * from lap ; 

所以嘗試添加一些輸出參數:

NpgsqlParameter firstColumn = new NpgsqlParameter("firstcolumn", NpgsqlDbType.Integer); 
firstColumn.Direction = ParameterDirection.Output; 
command.Parameters.Add(firstColumn); 

有關更多示例,請從這裏查看文檔:http://npgsql.projects.postgresql.org/docs/manual/UserManual.html,「在查詢中使用輸出參數」部分。