我需要在问题表中插入一行并检索插入的ID。我初始化我的sql命令并用ExecuteScalar()
执行它。我正在尝试将此方法的结果转换为int,但我做不到。
我试图这样做:
int result = Convert.ToInt32(Command.ExecuteScalar));
或
int result = (int)Command.ExecuteScalar();
但没有任何作用
这是我的功能
public int AddQuestionOrientation(Question questionForAdd)
{
try
{
con = new SqlConnection(connectionString);
con.Open();
SqlCommand command;
String sql = "";
sql = "INSERT INTO QUESTION VALUES(@Libelle,
@Bareme,2,@Filliere)";
SqlParameter param = new SqlParameter();
param.ParameterName = "@Libelle";
param.Value = questionForAdd.Libelle;
SqlParameter param2 = new SqlParameter();
param2.ParameterName = "@Bareme";
param2.Value = questionForAdd.Bareme;
SqlParameter param3 = new SqlParameter();
param3.ParameterName = "@Filliere";
param3.Value = questionForAdd.IdFiliere;
command = new SqlCommand(sql, con);
command.Parameters.Add(param);
command.Parameters.Add(param2);
command.Parameters.Add(param3);
int idQuestionInserted = (int)command.ExecuteScalar();
command.Dispose();
con.Close();
return idQuestionInserted;
}
catch(Exception ex)
{
return 0;
}
}
如果我尝试使用强制类型转换(int),则会显示错误消息:
对象引用未设置为对象的实例
如果我尝试使用Convert.ToInt32
,则我的变量“ IdQuestionInserted”等于0。
答案 0 :(得分:1)
这与您的起点大相径庭。但是您遇到了几个问题。您应该在具有IDisposable接口(连接,命令等)的对象周围使用USING语句。
此代码未经测试,但应该非常接近。
从创建存储过程开始,以便您可以开始在应用程序中创建图层。
create Procedure Question_Insert
(
@Libelle varchar(50)
, @Bareme varchar(50)
, @Filliere varchar(50)
, @QuestionID int output
) as
set nocount on;
INSERT INTO QUESTION
(
Libelle
, Bareme
, Filliere
)
values
(
@Libelle
, @Bareme
, @Filliere
)
select @QuestionID = SCOPE_IDENTITY()
然后,在您的dotnet代码中,您需要进行一些更改以使其更整洁,更强大。理想情况下,您应该做的比在出现错误时简单地返回0更好。如果仅返回0,则在发生错误时进行调试将非常困难。这就像一条错误消息,指出“发生错误”。真没用。做一些错误。捕获消息以使您可以对其进行修复。
public int AddQuestionOrientation(Question questionForAdd)
{
try
{
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
using (SqlCommand command = new SqlCommand("Question_Insert"))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("@Libelle", SqlDbType.VarChar, 50).Value = questionForAdd.Libelle;
command.Parameters.Add("@Bareme", SqlDbType.VarChar, 50).Value = questionForAdd.Bareme;
command.Parameters.Add("@Filliere", SqlDbType.VarChar, 50).Value = questionForAdd.IdFiliere;
command.Parameters.Add("@QuestionID", SqlDbType.Int).Direction = ParameterDirection.Output;
command.ExecuteNonQuery();
return int.Parse(command.Parameters["@QuestionID"].Value.ToString());
}
}
}
catch (Exception ex)
{
return 0;
}
}
答案 1 :(得分:1)
要插入ID,请使用SCOPE_IDENTITY()
在命令查询中添加SELECT CAST(scope_identity() AS int
INSERT INTO QUESTION
VALUES(@Libelle, @Bareme, 2, @Filliere);
SELECT CAST(scope_identity() AS int;
此查询将为您返回插入的ID。