2017-06-28 493 views
0

私はPostgresデータベースの私のC#コードで42883:関数が存在しません - Postgresの関数の呼び出しEntity FrameworkのC#のNpgsqlで

CREATE OR REPLACE FUNCTION "thisSearchList"(IN searchstring text) 
RETURNS TABLE(q_description text, q_barcode text) AS 
$BODY$ 
    SELECT q_description, q_barcode 
    FROM q_product 
    WHERE q_description like $1 
OR q_barcode like $1  
$BODY$ 
LANGUAGE sql VOLATILE 
COST 100 
ROWS 1000; 

に以下の機能を持っている私が利用するために、次のコードを持っているが

機能を言いましたアプリケーションを実行するには
NpgsqlConnection connection = new NpgsqlConnection("Host=192.168.0.52;Database=bolo;Username=western;Password=western"); 
connection.Open(); /*OPEN DATABASE CONNECTION*/ 

NpgsqlCommand cmd = new NpgsqlCommand("thisSearchList", connection); 
cmd.CommandType = CommandType.StoredProcedure; 

cmd.Parameters.Add("@string", NpgsqlTypes.NpgsqlDbType.Text); 
cmd.Parameters["@string"].Value = searchValue.ToUpper(); 

NpgsqlDataReader dr = cmd.ExecuteReader(); 

while (dr.Read()) 
{ 
var prod = new ProductViewModel(); 
prod.q_description = dr["q_description"].ToString(); 
prod.q_barcode = dr["q_barcode"].ToString();    

model.Add(prod); 
} 

- 検索テキストボックスにユーザーの種類と機能をトリガ、ビュー/ページに表示される製品のリストを返すように検索をクリック:私は

次のエラーを取得しますグーグルを通して私の理解から

NpgsqlDataReader dr = cmd.ExecuteReader(); 

のソースと

42883: function thissearchlist(string := text) does not exist 

、Postgresは文字列やテキストの問題がある可能性があります! dbで定義されているテキストではなくパラメータ文字列を持つ関数を探しているところです(ポストグルでは文字列ではなく文字列しか定義できません)。機能とパラメータを渡すとき、それは(テキストパラメータを使用して)適切な関数を取得して呼び出された場合しかし、その後、このライン

cmd.Parameters.Add("@string", NpgsqlTypes.NpgsqlDbType.Text); 

は、問題を解決したでしょうwouldntの?この時点で私は何が欠けているのですか、そうしないとpostgres関数をこのように呼び出すことはできません。

+0

同じユーザ "western"を使用すると、plsqlコンソール/ pgadminのストアドプロシージャを正常に呼び出せますか? (つまり、西洋は機能に関する実行権を持っています) – JGH

+0

はいできます。 "western"はすべての権利を持つスーパーユーザーです。 – LavsTo

答えて

3

関数の作成時に二重引用符と大文字を使用しているため、関数の名前で大文字と小文字が区別されるようになりました。

CREATE OR REPLACE FUNCTION "thisSearchList" 

あなたは、文字列を引用され、C#コードで関数を呼び出しますが、この文字列の内容は(大文字と小文字が区別されます)、関数名のために必要な引用符が含まれていない、そしてそれは

:なぜエラーメッセージが小文字

new NpgsqlCommand("thisSearchList", connection); 

痛みを伴う方法は、第二重引用符を追加することであると表示し、関数名を取得します

new NpgsqlCommand("\"thisSearchList\"", connection); 

簡単な方法は、長期的に、引用符を削除することによって、あなたの関数の場合は感度を取り除くことです。

CREATE OR REPLACE FUNCTION thisSearchList 

** EDIT **

あなたは、名前付きパラメータを使用していますが、名前が一致しません。 @stringの代わりに@searchstringを使用するか、位置パラメータの一致を使用するために名前をまったく使用しないでください。

+0

私は関数内のqoutesを取り除き、すべての小文字で関数の名前を変更しましたが、私はまだ同じエラーを受けています。 – LavsTo

+0

@JHG searchstringを使うようにコードを変更しました。エラーは表示されず、検索結果ページにもどっていますが、空で、レコードを含む文字列のレコードが表示されません。この場合、戻り値の型とview/cshtmlコードは間違っていますか? – LavsTo

+0

これは別の質問ですが、あなたは 'like'に関連する'% 'がありません。 [こちら](https://stackoverflow.com/questions/44779362/npgsql-query-with-search-variable-parameter-returning-empty-result-c-sharp-postg/44779602#44779602)と同じです。 – JGH

関連する問題