【问题标题】:Cast error in C#C# 中的转换错误
【发布时间】:2013-03-19 06:19:15
【问题描述】:

我在“Checkout”类中有一个函数,它运行一条 sql 语句将一条记录插入到表中,然后选择 scope_identity,给我该记录的 ID。它以 int 形式返回 ID,我将其分配给网页中的变量:

int OrderID = Checkout.WriteOrder_tblOrders(CustID);

函数如下:

public static int WriteOrder_tblOrders(int CustID)
{
    // OrderID is initially 0, then changed when scope_identity is called in the sql statement.
    int OrderID = 0;
    DateTime OrderDate = DateTime.Now;
    string sql = "INSERT INTO tblOrders (OrderDate, CustID) VALUES (@OrderDate, @CustID); SELECT scope_identity();";

    using (SqlConnection myConnection = new SqlConnection(connectString))
    {
        using (SqlCommand cmd = new SqlCommand(sql, myConnection))
        {
            cmd.Parameters.AddWithValue("@CustID", CustID);
            cmd.Parameters.AddWithValue("@OrderDate", OrderDate);
            myConnection.Open();
            OrderID = (int)cmd.ExecuteScalar();
            myConnection.Close();
        }
    }
    return OrderID;
}

调试器显示该函数没有问题,新记录在该表中正确显示,但我得到了一个

“无效的演员表”

第一行出错,我在其中分配了 OrderID。我试过这个:

int OrderID = (int)Checkout.WriteOrder_tblOrders(CustID);

同时使用 int 和 Int32,并尝试使用 Convert.ToInt32,但也不起作用。我在这里做错了什么?

【问题讨论】:

标签: c# asp.net sql casting int


【解决方案1】:

原因可能是您得到空值。
所以你可以创建一个扩展方法如下

public static T ExecuteNullableScalar<T>(this SqlCommand cmd) where T : struct
{
    var result = cmd.ExecuteScalar();
    if (result == DBNull.Value) return default(T);
    return (T)result;
}

用法变为:

int value = cmd.ExecuteNullableScalar<int>();
//new approach
ulong value=cmd.ExecuteNullableScalar<ulong>();

其他方面

 myConnection.Open();
 var o = cmd.ExecuteScalar();
 OrderID = (o== DBNull.Value ? 0 :  Convert.ToUInt64(o));
 myConnection.Close();

改变了

OrderID = (o== DBNull.Value ? 0 :  Convert.ToUInt64(o));

【讨论】:

  • 所以它应该被转换成ToInt64ulong?
【解决方案2】:

感谢你们的帮助,没有意识到 scope_identity 返回一个小数。我修改了这样的代码:

OrderID = Convert.ToInt32((decimal)cmd.ExecuteScalar());

现在可以正常工作了。谢谢!

【讨论】:

猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多