PostgreSql ExecuteScalar ASP.NET

时间:2017-02-01 13:13:33

标签: c# asp.net postgresql

我正在将一个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"因为它假设提交了错误的格式。

1 个答案:

答案 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中是可选的。