簡體   English   中英

從 C# 調用時,Npgsql.Postgresql 異常 42883 function 不存在 - 是否有可用的工作示例?

[英]Npgsql.Postgresql Exception 42883 function does not exist when called from C# - is there a working example available?

這似乎是一個非常普遍的問題。 我瀏覽了PostgresException: 42883上的一些帖子。 其中大部分與 PostgreSQL 數據庫中 function 簽名中的不匹配以及來自 C# 的調用有關。

我真的沒有看到這個問題。 有人可以啟發我嗎?

我的 PostgreSQL function 是:

CREATE OR REPLACE FUNCTION public.getimportkey(
    instid integer,
    fname character varying,
    fhash text)
    RETURNS bigint
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
AS $BODY$
declare
        impId bigint;
        begin
        
            select id 
            into impId
            from importlog
            where instrumentid = instId and
                  filename = fname and
                  filehash = fhash;
                  
            return impId;
            
        end;
$BODY$;

生成PostgresException: 42883異常的 C# 代碼如下。

 using (NpgsqlTransaction transaction = connection.BeginTransaction())
        {
            NpgsqlCommand command = new NpgsqlCommand("getimportkey", connection);
                                                       
            command.CommandType = System.Data.CommandType.StoredProcedure;

            command.Parameters.AddWithValue("@instid",NpgsqlTypes.NpgsqlDbType.Integer,instrumentId);
            command.Parameters.AddWithValue("@fName",NpgsqlTypes.NpgsqlDbType.Varchar, fileInfo.Name);
            command.Parameters.AddWithValue("@fHash", NpgsqlTypes.NpgsqlDbType.Text, fileHash);

            int? impId = (int?)command.ExecuteScalar();
            if (impId != null) imported = true;

        }

我注意到varchar(255)character varying必須被視為等效類型。 我嘗試了以下方法:

  1. 從數據庫中刪除了getimportkey function。 我刷新了 function 列表,確認getimportkey不見了。
  2. 修改CREATE腳本如下:

更改了fname參數的定義:

 fname character varying,

至:

  fname varchar(255),
  1. 執行修改后的腳本。

  2. 刷新了 function 列表。 getimportkey又回來了,但fname參數類型顯示為character varying

我猜varchar(255)被認為與character varying類型相同。

誰能指導我使用 C# 的參數調用 PostgreSQL function 的工作示例?

function 使用小寫參數名稱聲明,但 c# 代碼使用兩個大寫名稱,因此它們不匹配( @fName@fHash

您也應該在調用代碼中使用小寫名稱,或者放棄名稱以僅依賴位置參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM