gpt4 book ai didi

c# - 如何从 Npgsql 和存储过程返回自定义表类型?

转载 作者:行者123 更新时间:2023-11-29 12:18:02 24 4
gpt4 key购买 nike

我正在尝试返回基于隐式表类型的自定义(复合)类型。

我有这个表定义:

CREATE TABLE app_user (id CHAR(36) PRIMARY KEY, name TEXT);

哪个映射到这个类定义:

public class ApplicationUser
{
public string Id { get; set; }
public string Name { get; set; }
}

通过调用映射:

NpgsqlConnection.MapCompositeGlobally<ApplicationUser>("app_user");

我正在尝试使用此存储过程返回一条记录:

CREATE FUNCTION find_by_id(user_id app_user.id%TYPE) RETURNS app_user AS $$
DECLARE
found_user app_user;
BEGIN
SELECT *
FROM app_user
WHERE id = user_id
INTO found_user;

RETURN found_user;
END
$$ LANGUAGE plpgsql STABLE SECURITY DEFINER;

我是这样从 C# 调用的:

ApplicationUser user;
using (NpgsqlConnection db = new NpgsqlConnection(this.connectionString))
{
db.Open();
using (NpgsqlCommand cmd = new NpgsqlCommand("find_by_id", db))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("user_id", userId);
object result = cmd.ExecuteScalar();
user = result == DBNull.Value ? null : (ApplicationUser)result;
}
}

但是在将 result 转换为 ApplicationUser 时出现异常:

InvalidCastException: Unable to cast object of type 'System.String' to type 'MyApp.ApplicationUser'.

这显然是因为 result 只是字符串 Id,但为什么 result 不是我的复合 app_user 对象?

我也尝试过使用 out 参数返回对象,但遇到了完全相同的异常。我尝试使用 Npgsql 可以实现什么,还是我必须在 C# 中从各个列手动重新构建 ApplicationUser 对象?

我正在使用 Npgsql v3.2.0 和 PostgreSQL v9.6。

最佳答案

看来我明白了。结果比我想象的要容易。我需要更改的只是从 C# 调用存储过程的方式。

ApplicationUser user;
using (NpgsqlConnection db = new NpgsqlConnection(this.connectionString))
{
db.Open();
using (NpgsqlCommand cmd = new NpgsqlCommand("SELECT find_by_id(@user_id);", db))
{
cmd.Parameters.AddWithValue("user_id", userId);
object result = cmd.ExecuteScalar();
user = result == DBNull.Value ? null : (ApplicationUser)result;
}
}

我更喜欢调用存储过程的另一种方式,但至少这行得通!

关于c# - 如何从 Npgsql 和存储过程返回自定义表类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42337076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com