C# 带C的Postgresql插入后的强制转换异常
使用此代码,我在与参数categoryName对应的表中搜索id。如果不存在,则在表中插入值,然后返回键。 执行时长id类别=长id;,有时它可以工作,有时抛出无效的强制转换异常。为什么C# 带C的Postgresql插入后的强制转换异常,c#,.net,postgresql,C#,.net,Postgresql,使用此代码,我在与参数categoryName对应的表中搜索id。如果不存在,则在表中插入值,然后返回键。 执行时长id类别=长id;,有时它可以工作,有时抛出无效的强制转换异常。为什么 public static long GetCategoryID(String categoryName) { using (NpgsqlConnection conn = new NpgsqlConnection(ConfigurationManager.Connectio
public static long GetCategoryID(String categoryName)
{
using (NpgsqlConnection conn = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["myConn"].ToString()))
{
conn.Open();
NpgsqlTransaction transaction = conn.BeginTransaction();
String query = "SELECT idcategory FROM category WHERE categoryname = '" + categoryName + "';";
NpgsqlCommand cmd = new NpgsqlCommand(query, conn, transaction);
object id = cmd.ExecuteScalar();
if (id == null)
{
query = "INSERT INTO Category (categoryname) VALUES ('" + categoryName +"');";
cmd = new NpgsqlCommand(query, conn, transaction);
cmd.ExecuteNonQuery();
query = "SELECT LASTVAL();";
cmd = new NpgsqlCommand(query, conn, transaction);
id = cmd.ExecuteScalar();
}
long idCategory = (long)id;
transaction.Commit();
conn.Close();
return idCategory;
}
}
首先,请使用您的调试器并检查id的值,对于该值会发生异常,这可能有助于找到问题 此外,请检查表“category”中“idcategory”列的id类型和数据类型。这些数据类型之间可能存在差异,从而导致异常 也可能是“idcategory”不是自动插入的,所以您必须在INSERT语句中包含它。“SELECT LASTVAL”是否返回null 除此之外,我总是更喜欢long idCategory=Convert.ToInt64id而不是long idCategory=longid 如果要避免异常,请使用long idCategory=id作为long,并检查idCategory==null我认为应该使用:currvalsequencename。你能试试吗?