功能不起作用

时间:2013-08-10 15:55:19

标签: c# sql-server ado.net

当我使用sql存储过程运行以下代码时,我得到-1而不是正确的结果。代码有什么问题?请帮忙。

ALTER PROCEDURE GetTopMaterial 
AS
BEGIN
SELECT TOP (1) MaterialId
FROM Materials
END


public static int GetTopMaterial()
{
   SqlHelper objSqlHelper = new SqlHelper();
   return (int)objSqlHelper.ExecuteScalar("GetTopMaterial");
}

 int id =Cart.GetTopMaterial()

public object ExecuteScalar (string query)
{
 SqlConnection cnn = new SqlConnection (strConnectionString);
 SqlCommand cmd = new SqlCommand (query, cnn);
 if (query.StartsWith ("SELECT") | query.StartsWith ("select"))
 {
    cmd.CommandType = CommandType.Text;
 }
 else
 {
    cmd.CommandType = CommandType.StoredProcedure;
 }
 cnn.Open ();
 object retval = cmd.ExecuteNonQuery ();
 cnn.Close ();
 return retval;
}

public object ExecuteScalar(string query, params SqlParameter[] parameters) 
{
        SqlConnection cnn = new SqlConnection(strConnectionString);
        SqlCommand cmd = new SqlCommand(query, cnn);
        if (query.StartsWith("SELECT") | query.StartsWith("select"))
        {
            cmd.CommandType = CommandType.Text;
        }
        else
        {
            cmd.CommandType = CommandType.StoredProcedure;
        }
        for (int i = 0; i <= parameters.Length - 1; i++)
        {
            cmd.Parameters.Add(parameters[i]);
        }
        cnn.Open();
        object retval = cmd.ExecuteScalar();
        cnn.Close();
        return retval;
}

1 个答案:

答案 0 :(得分:7)

因此,您的ExecuteScalar实际上正在包裹ExecuteNonQuery。来自MSDN for ExecuteNonQuery

  

对于UPDATE,INSERT和DELETE语句,返回值为   受命令影响的行数。当a上存在触发器时   正在插入或更新的表,返回值包括数字   受插入或更新操作影响的行数和数字   受触发器或触发器影响的行数。对于所有其他类型的   语句,返回值为-1。如果发生回滚,则返回   值也是-1。