Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C#中的存储过程返回行id?_C#_Sql Server_Stored Procedures - Fatal编程技术网

从C#中的存储过程返回行id?

从C#中的存储过程返回行id?,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,我正在尝试获取插入行的行id 这是燃油等级: public class Fuel { private Int32 fuelId; private DateTime fuelDate; public Fuel(DateTime fuelDate) { this.fuelDate = fuelDate; } public Fuel(Int32 fuelId, DateTime fuelDate) { this

我正在尝试获取插入行的行id

这是
燃油
等级:

public class Fuel
{
    private Int32 fuelId;
    private DateTime fuelDate;

    public Fuel(DateTime fuelDate)
    {
        this.fuelDate = fuelDate;
    }

    public Fuel(Int32 fuelId, DateTime fuelDate)
    {
        this.fuelId = fuelId;
        this.fuelDate = fuelDate;
    }

    public Int32 FuelId() { return fuelId; }
    public DateTime FuelDate() { return fuelDate; }
}
这是尝试写入数据库的方法:

protected String connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;
        AttachDbFilename=" + "C:\\Users\\keith_000\\Documents\\Visual Studio 2017\\Projects\\RubberDress\\RubberDress\\Rubber.mdf" + ";" +
        "Integrated Security=True;" +
        "Connect Timeout=30";

public Int32 InsertFuelPurchase(Fuel myAddFuel)
{
        Int32 myFuelId;

        using (SqlConnection mySqlConn = new SqlConnection(connectionString))
        {
            mySqlConn.Open();

            using (SqlCommand myComm = new SqlCommand("FUELINSERT", mySqlConn))
            {
                myComm.CommandType = CommandType.StoredProcedure;
                myComm.Parameters.Add("@FUELDATE", SqlDbType.DateTime).Value = myAddFuel.FuelDate();
                myComm.Parameters.Add("@FUELID", SqlDbType.Int).Direction = ParameterDirection.Output;
                myFuelId = Convert.ToInt32(myComm.Parameters["@FUELID"].Value);
                mySqlConn.Close();
            }
        }

        return myFuelId;
    }
存储过程是

CREATE PROCEDURE [dbo].[FUELINSERT]
    @FUELDATE DATETIME,
    @FUELID INT OUTPUT
AS
    INSERT INTO FUELPURCHASE (FUELPURCHASEDATE)  
    VALUES (@FUELDATE)

    SELECT @FUELID = SCOPE_IDENTITY()
这将写入下表

CREATE TABLE [dbo].[FUELPURCHASE] 
(
    [FUELPURCHASEID] INT IDENTITY (1, 1) NOT NULL,
    [FUELPURCHASEDATE] DATETIME NOT NULL

    PRIMARY KEY CLUSTERED ([FUELPURCHASEID] ASC)
);
当前返回的结果是0

调试该方法时,我发现存储过程返回了0


有人能指出我必须解决问题的地方吗?

您缺少myComm.ExecuteNonQuery()…您的代码应该如下所示:

myComm.ExecuteNonQuery();
myFuelId = Convert.ToInt32(myComm.Parameters["@FUELID"].Value);

当然,您需要执行该命令(ExecuteScalar、ExecuteOnQuery,甚至ExecuteReader都将调用SP并运行SqlCommand),但您不需要有out参数,只需在存储过程中选择SCOPE_IDENTITY()并使用ExecuteScalar执行该命令即可

CREATE PROCEDURE [dbo].[FUELINSERT]
    @FUELDATE DATETIME
AS
    INSERT INTO FUELPURCHASE (FUELPURCHASEDATE) VALUES (@FUELDATE)
    SELECT SCOPE_IDENTITY()
现在,您可以使用

....
using (SqlCommand myComm = new SqlCommand("FUELINSERT", mySqlConn))
{
    myComm.CommandType = CommandType.StoredProcedure;
    myComm.Parameters.Add("@FUELDATE", SqlDbType.DateTime).Value = myAddFuel.FuelDate();
    myFuelId = Convert.ToInt32(myComm.ExecuteScalar());
}
....
试试这个:

        mySqlConn.Open();
        using (SqlCommand myComm = mySqlConn.CreateCommand())
        {
            myComm.CommandType = CommandType.StoredProcedure;
            myComm.CommandText = "Exec YourProcedure @FUELDATE,@FUELID";
            myComm.Parameters.Add("@FUELDATE", SqlDbType.DateTime).Value = myAddFuel.FuelDate();
            myComm.Parameters.Add("@FUELID", SqlDbType.Int).Direction = ParameterDirection.Output;
            myFuelId = Convert.ToInt32(myComm.Parameters["@FUELID"].Value);
            int result = myComm.ExecuteNonQuery();

            mySqlConn.Close();
            return result;

        }
返回单个值时,请使用myComm.ExecuteScalar()


这取决于您的FUELDATE、FUELID位置:

您似乎缺少
myComm.ExecuteNonQuery()在哪里执行
SqlCommand