Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SELECT COUNT(*)认为字符串参数是IEnumerable-返回数组?(蟑螂)_C#_Mysql_Postgresql_Npgsql_Cockroachdb - Fatal编程技术网

C# SELECT COUNT(*)认为字符串参数是IEnumerable-返回数组?(蟑螂)

C# SELECT COUNT(*)认为字符串参数是IEnumerable-返回数组?(蟑螂),c#,mysql,postgresql,npgsql,cockroachdb,C#,Mysql,Postgresql,Npgsql,Cockroachdb,我正在将一个使用MySQL数据库的项目迁移到CockroachDB。在这个查询中,我只是想看看accounts表中是否存在用户名。当我在CLI中运行相同的查询时,它返回计数1 我试图在我的C#应用程序中获得这个整数,但是我不太理解在查询中添加参数的问题。如果我的SELECT COUNT(*)查询中有一个字符串参数,它似乎认为这个字符串是IEnumerable public bool accExists(string id, string userName) { int totalCoun

我正在将一个使用MySQL数据库的项目迁移到CockroachDB。在这个查询中,我只是想看看accounts表中是否存在用户名。当我在CLI中运行相同的查询时,它返回计数1

我试图在我的C#应用程序中获得这个整数,但是我不太理解在查询中添加参数的问题。如果我的SELECT COUNT(*)查询中有一个字符串参数,它似乎认为这个字符串是IEnumerable

public bool accExists(string id, string userName)
{
    int totalCount = 0;

    using (var conn = new NpgsqlConnection(connstr.getConnStr(id)))
    {
        //SSL Connection Init
        conn.ProvideClientCertificatesCallback += ProvideClientCertificatesCallback;
        conn.UserCertificateValidationCallback += UserCertificateValidationCallback;

        conn.Open();

        // Check if Account Exists
        NpgsqlCommand accExists = new NpgsqlCommand("SELECT COUNT(*) FROM accounts WHERE username LIKE @username", conn);
        accExists.Parameters.AddWithValue("@username", userName);

        // Query Executions:
        totalCount = Convert.ToInt32(accExists.ExecuteScalar());
    }

    // Return Value
    switch (totalCount)
    {
        case 1: // Account Exists
            return true;

        case 0: // Account Does NOT Exist
            return false;

        default: // Protective Code - Shouldn't be hit
            addManageLog("SYSTEM", id, "MORE THAN ONE OF THE SAME USERNAME " + userName);
            return false;
    }
}
捕获的异常是:

System.NotSupportedException:'Npgsql 3.x删除了对使用IEnumerable值写入参数的支持,请改用.ToList()/.ToArray()

编辑:我现在也尝试将参数行更改为:

accExists.Parameters.AddWithValue("@username", NpgsqlTypes.NpgsqlDbType.Varchar, userName);
显式定义参数类型,因为它似乎认为这是一个
IEnumerable
值。但是,这将返回异常:

数据库中不存在NpgsqlDbType“Varchar”

数据库中的username列设置为VARCHAR(50)


谢谢你的帮助

听起来好像给定的参数没有正确处理,而不是返回值<通常不建议使用code>AddWithValue,而是添加具有特定类型的参数并设置值。这样做会改变什么吗?你需要使用正确的形式
AddWithValue(“@username”,NpgsqlDbType.String,username)
。您的版本只需添加一个值为
MySqlDbType.String
的参数,然后对其进行更改。这里也不要混用MySQL类型@是的!当我发布评论时,我才意识到我使用的是MySQL类型。我尝试使用
acceists.Parameters.AddWithValue(“@username”,NpgsqlTypes.NpgsqlDbType.varchar,username)将参数类型指定为varchar
这会导致异常:
数据库中不存在NpgsqlDbType“Varchar”。
username列的类型为accounts表中的Varchar。NpgsqlType的类型字符串不存在。是否有其他/更好的方法来显式定义参数类型?非常感谢。我不确定你的问题标题和正文是否一致;在标题中,你是在暗示你将得到一个数组。在主体中,db驱动程序似乎暗示您正在放入数组(误解字符串?)。除此之外,您应该遵循c#约定,即MethodNames/PropertyNames以大写字母开头,variableNames以小写字母开头。这样编写变量会使它们看起来像属性;对于遵循约定的开发人员来说,这是相当令人困惑的。在如何处理您的问题方面,我可能会克隆npgsql repo,然后您可以使用调试器(或者选择“抛出时中断”)在抛出此异常的过程中捕获npgsql,并调查为什么会得出这样的结论:您向它传递了一个不再支持的可枚举参数。编辑听起来好像给定的参数没有得到正确处理,而不是返回值。
AddWithValue
通常不建议使用,而是通过h特定类型和设置值。这样做会改变什么吗?您需要使用正确的格式。
AddWithValue(“@username”,NpgsqlDbType.String,username)
。您的版本只是添加了一个值为
MySqlDbType.String
的参数,然后对其进行更改。这里也不要混合使用MySQL类型!@SamiKuhmonen是的!我在发布评论时才意识到我使用的是MySQL类型。我尝试使用
accExists.Parameters.AddWithValue(@username)将参数类型指定为varchar,NpgsqlTypes.NpgsqlDbType.Varchar,用户名)这会导致异常:
'NpgsqlDbType'Varchar'不在您的数据库中。
username列是accounts表中的Varchar类型。NpgsqlType不存在类型字符串。是否有其他/更好的方法来显式定义参数类型?谢谢!我不确定您的问题标题和正文是否正确对齐;在标题中,你暗示你正在取出一个数组。在正文中,db驱动程序似乎暗示你正在放入一个数组(误解了字符串?)。作为次要的一点,您应该遵循c#约定,即MethodNames/PropertyNames以大写字母开头,variableNames以小写字母开头。这样编写变量会使它们看起来像属性;对于遵循约定的开发人员来说,对于如何处理您的问题来说,这是相当混乱的。我可能会克隆npgsql代表o然后,您可以使用调试器进入它(或者选择“抛出时中断”,并在抛出此异常时捕获npgsql,并调查为什么得出结论,您已经向它传递了一个不再受支持的可枚举参数