我有这个模块
strSQL = "Insert Into TblInsurancePersonel (CompId,PersonelNo,FirstName,LastName) ";
strSQL = strSQL + " Values (@CompId,@PersonelNo,@FirstName,@LastName)";
using (SqlConnection myConnection = new SqlConnection(AppConfiguration.ConnectionStringName))
{
Helpers helpers = new Helpers();
myConnection.ConnectionString = helpers.GetConnectionString(myUser.ServerName, myConnection.ConnectionString);
using (SqlCommand myCommand = new SqlCommand(strSQL, myConnection))
{
myCommand.Parameters.AddWithValue("@CompId", insurPersonel.CompId);
myCommand.Parameters.AddWithValue("@PersonelNo", insurPersonel.PersonelNo);
myCommand.Parameters.AddWithValue("@FirstName", insurPersonel.FirstName);
myCommand.Parameters.AddWithValue("@LastName", insurPersonel.LastName);
myConnection.Open();
int i= Convert.ToInt32(myCommand.ExecuteScalar());
myConnection.Close();
TblInsurancePersonel中的字段是" Id,CompId,PersonelNo,FirstName,LastName" ,Id是一个身份,所以每当我添加一条新记录时,我都想拥有它的价值(我的意思是我可以拥有新记录的身份)。但它始终返回值0但正确添加记录
问题出在哪里?
答案 0 :(得分:4)
INSERT
不会返回任何数据;它不会显示第一行的第一列......为此,您需要SELECT
。
也许你想要:
SELECT SCOPE_IDENTITY()
在INSERT
之后。还有OUTPUT
语法可以执行此操作:
INSERT ...
OUTPUT INSERTED.Id
VALUES ...
答案 1 :(得分:2)
使用ExecuteNonQuery
,您可以获得受影响的行数。
int i= myCommand.ExecuteNonQuery();
修改强>:
ExecuteScalar不会返回第一行的第一列
也许您想要检索新的主键。
您甚至可以使用ExecuteScalar
进行插入查询,但必须附加SELECT
- 语句。例如,如果要选择新创建的标识值,那么这很有用。
例如:
string sql = @"Insert Into TblInsurancePersonel (CompId,PersonelNo,FirstName,LastName)
Values (@CompId,@PersonelNo,@FirstName,@LastName);
SELECT CAST(scope_identity() AS int)";
// ...
int newIdentity = Convert.ToInt32(myCommand.ExecuteScalar());