从C#中的存储过程返回行id?
我正在尝试获取插入行的行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
燃油
等级:
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
?