我正在将一个ASP.NET Webforms应用程序从MSSQL移植到PostgreSql。 我遇到了这段代码的问题。
string checkIfExist ="SELECT COUNT(*) FROM tblHairRecord WHERE customerid = @customerID AND typetitle1= @titleParam AND type1_1=@typeValue";
//Open the SQL Connectionn
con.Open();
//Set all the parameters
NpgsqlCommand cmdChk = new NpgsqlCommand(checkIfExist,con);
cmdChk.Parameters.Add("@customerID", NpgsqlDbType.Integer);
cmdChk.Parameters.Add("@titleParam", NpgsqlDbType.Char, 10);
cmdChk.Parameters.Add("@typeValue", NpgsqlDbType.Char, 10);
cmdChk.Parameters["@customerID"].Value = lblCustIDed.Text;
cmdChk.Parameters["@titleParam"].Value = "顔型";
cmdChk.Parameters["@typeValue"].Value = "卵型";
//Run the the count query and Close the connection
int checkIfExistCount = (int)cmdChk.ExecuteScalar();
con.Close();
网页返回的错误是*
输入字符串的格式不正确。
* 堆栈跟踪引导我到代码段中的行
int checkIfExistCount = (int)cmdChk.ExecuteScalar();
我知道这个代码段可以正常工作,因为它在MSSQL环境中执行时没有问题。 我对PostgreSql相当新,并且认为PostgreSql基本上不喜欢" int"因为它假设提交了错误的格式。
答案 0 :(得分:1)
PostgreSQL中的count
聚合函数返回bigint,
或C#术语Int64
/ long
。我认为演员阵容太暴力了。 ExecuteScalar
会返回一个输入的对象,因此我认为您需要使用Convert
而不是强制转换:
int checkIfExistCount = Convert.ToInt32(cmdChk.ExecuteScalar());
为了说明这一点,请在SQL
中运行这个简单的命令select count (*)
你会看到它返回一个64位整数。
- 编辑:对于评论中的上下文,我将其留下,但忽略以下所有内容 -
关闭主题,但您的代码可以缩写为以下内容:
NpgsqlCommand cmdChk = new NpgsqlCommand(checkIfExist, con);
cmdChk.Parameters.AddWithValue("customerId", lblCustIDed.Text);
cmdChk.Parameters.AddWithValue("titleParam", "顔型");
cmdChk.Parameters.AddWithValue("typeValue", "卵型");
int checkIfExistCount = Convert.ToInt32(cmdChk.ExecuteScalar());
con.Close();
如果要执行一次声明,执行多次(如使用插入/更新),则声明参数并分两步分配值。在这种情况下,您将声明一次,执行一次。参数仍然是一个好主意,但AddWithValue
方法使代码保持良好和紧凑。
- 编辑 - 除了这一行。它仍然相关 -
同样有趣的是,许多数据库在声明参数时都需要“@”前缀,但它们在Postgres中是可选的。