2009-08-19 67 views
4

我想使用Npgsql來調用一個函數(存儲過程),它需要一個字符作爲參數,但它不起作用。如果我聲明不帶參數的相同函數或INTEGER參數,我會得到我想要的結果集。當我聲明參數爲CHARACTER時,它停止工作。哪裏不對?使用npgsql調用一個函數,需要字符作爲參數

這裏是我的函數的代碼:

CREATE OR REPLACE FUNCTION testrefcursor1(in xxx character varying(10)) RETURNS SETOF refcursor AS 
$$ 
DECLARE 
    ref1 refcursor; 
    ref2 refcursor; 
BEGIN 

OPEN ref1 FOR 
SELECT * FROM accounts; 
RETURN NEXT ref1; 

OPEN ref2 FOR 
SELECT * FROM accounts; 
RETURN NEXT ref2; 

RETURN; 
END; 
$$ 
LANGUAGE plpgsql; 

這裏是我使用C#代碼:

var connection = new Npgsql.NpgsqlConnection(connectionString.ConnectionString); 

connection.Open(); 
var trans = connection.BeginTransaction(); 

var command = new Npgsql.NpgsqlCommand("testrefcursor1", connection); 
command.CommandType = System.Data.CommandType.StoredProcedure; 

var parameter = command.CreateParameter(); 
parameter.ParameterName = "xxx"; 
parameter.DbType = System.Data.DbType.String; 
parameter.Value = "10"; 
command.Parameters.Add(parameter); 

var da = new Npgsql.NpgsqlDataAdapter(command); 
var ds = new System.Data.DataSet(); 
da.Fill(ds); 

trans.Commit(); 
connection.Close(); 

我已經嘗試過聲明參數爲人品,人品(10) ,字符變化和字符變化(10)...

編輯:我沒有得到任何錯誤消息,但沒有得到預期的結果集,我得到一個空的結果集與單個列h與我試圖調用的函數名稱相同。

+7

... Postgres有什麼問題? – Eric 2009-08-25 12:07:59

回答

5

您正在將Unicode參數傳遞給ASCII參數。

改變這一行:

parameter.DbType = System.Data.DbType.String; 

要:

parameter.DbType = System.Data.DbType.AnsiString; 

一般的Postgres的varchar列是Unicode的,前提是數據庫的Unicode的選項啓用(see here)。我的猜測是,它不是,你的參數無法將自身轉換爲正確的類型以通過函數傳遞。

+0

我嘗試過使用DbType.String,DbType.AnsiString,DbType.StringFixedLength和DbType.AnsiStringFixedLength,它們都帶有和沒有指定參數長度,並且都沒有工作:( – 2009-08-27 22:20:32

+0

什麼是您得到的錯誤消息? – Eric 2009-08-27 22:39:53

+0

我沒有收到任何錯誤消息,而不是獲得預期的結果集,我得到一個空的結果集,其中一列與我試圖調用的函數名稱相同。 – 2009-08-30 14:32:10

1

不確定,如果這與你的問題有關,但昨天我偶然發現了fact PostgreSQL有一個「單字節內部類型」字符,它與char(1)類型不同。也許有關於這些的一些混淆?

+0

我不認爲我正在使用此數據類型。 。 – 2009-09-01 10:32:11

+0

你適應你的命令創建到 * VAR命令=新Npgsql.NpgsqlCommand(「testrefcursor1(:XXX)」,連接); *當你使用一個非空的參數列表? – Whoever 2009-09-01 11:54:19

+0

根據該文件,我應該指定函數的唯一名稱: 「如果你在你的函數有參數,只分配函數名CommandText屬性和參數添加到NpgsqlCommand.Parameters收集像往常一樣將Npgsql的注意正確綁定你的參數。「 http://npgsql.projects.postgresql.org/docs/manual/UserManual.html – 2009-09-03 09:45:52

2

您正在使用哪個Npgsql版本?

另外,您可以使用NpgsqlDbType指定參數類型嗎?有時映射不完全,Npgsql無法找到您嘗試使用的功能,無法使其正常工作。

Npgsql試圖找到函數名和參數類型的完全匹配。 DbString匹配文本參數類型。你介意嘗試一下並將你的參數類型改爲文本嗎?

我希望它有幫助。

+0

謝謝您的回答。我不再爲這個項目工作,但我會盡力抽出時間來嘗試。我會在這裏發佈我的結果。 – 2010-03-07 00:32:02

0

我試着用下面的方法(這是與你相似):

using (NpgsqlConnection connection = new NpgsqlConnection(<connectionString>)) 
{ 
    DataSet ds = new DataSet(); 
    DataTable dt = new DataTable(); 
    connection.Open(); 
    NpgsqlCommand cmd = new NpgsqlCommand(< name of your SP >, connection); 
    cmd.CommandType = CommandType.StoredProcedure; 
    var param = cmd.CreateParameter(); 
    param.ParameterName = < exact parameterName you used in your SP>; 
    param.DbType = System.Data.DbType.AnsiString; 
    param.Value = < parameter value >; 
    cmd.Parameters.Add(param); 
    NpgsqlDataAdapter adapter = new NpgsqlDataAdapter(cmd); 
    adapter.Fill(ds); 
    dt = ds.Tables[0]; 
} 

這是爲我工作的罰款,我得到正確的數據表。

相關問題