У меня есть этот модуль
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", идентификатор которого является идентификатором, поэтому я хочу иметь его значение, когда я добавляю новую запись (я имею в виду, что я мог бы иметь личность новой записи), но он возвращает значение 0 все время, но запись добавляется правильно
в чем проблема?
INSERT
не возвращает никаких данных; он не представляет первый столбец первой строки... для этого вам нужен SELECT
.
Возможно, вы хотите:
SELECT SCOPE_IDENTITY()
после INSERT
. Существует также синтаксис OUTPUT
который может сделать это:
INSERT ...
OUTPUT INSERTED.Id
VALUES ...
SCOPE_IDENTITY
вам понадобится столбец идентификаторов в таблице, которую вы вставляете
Используйте ExecuteNonQuery
и вы получите количество затронутых строк.
int i= myCommand.ExecuteNonQuery();
Изменить:
ExecuteScalar не возвращает первый столбец первой строки
Возможно, вы хотите получить новый первичный ключ.
Вы можете использовать ExecuteScalar
даже для вставок-запросов, но вы должны добавить SELECT
-statement. Это полезно, например, если вы хотите выбрать вновь созданное значение идентификации.
Например:
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());