C# SELECT COUNT(*)认为字符串参数是IEnumerable-返回数组?(蟑螂)
我正在将一个使用MySQL数据库的项目迁移到CockroachDB。在这个查询中,我只是想看看accounts表中是否存在用户名。当我在CLI中运行相同的查询时,它返回计数1 我试图在我的C#应用程序中获得这个整数,但是我不太理解在查询中添加参数的问题。如果我的SELECT COUNT(*)查询中有一个字符串参数,它似乎认为这个字符串是IEnumerableC# 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
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,并调查为什么得出结论,您已经向它传递了一个不再受支持的可枚举参数