ExecuteScalar不会返回第一行的第一列

时间:2014-08-27 07:25:31

标签: c# visual-studio-2010

我有这个模块

   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但正确添加记录

问题出在哪里?

2 个答案:

答案 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());