1

我在“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,但也不起作用。我在这里做错了什么?

4

2 回答 2

3

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

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));
于 2013-03-19T06:26:08.200 回答
1

感谢您的帮助,没有意识到 scope_identity 返回小数。我改变了这样的代码:

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

它现在工作正常。谢谢!

于 2013-03-19T06:53:18.507 回答