2013-07-19 5 views
0

Были некоторые предыдущие вопросы вроде этого, но я не совсем понял ответы. Вот мой запросAutoincrement with SQL Insert

using (SqlCommand cmd = new SqlCommand(
    "INSERT INTO Results VALUES(@ResultID, @HasSucceeded, @ScenarioID, @Screenshot)", 
    conn)) 
{ 
    cmd.Parameters.AddWithValue("@ResultID", Id); 
    cmd.Parameters.AddWithValue("@HasSucceeded", HasSucceeded); 
    cmd.Parameters.AddWithValue("@ScenarioID", Id); 
    cmd.Parameters.AddWithValue("@Screenshot", screenshot); 

    cmd.ExecuteNonQuery(); 
} 

Теперь я использую Id в качестве заполнителя в течение @ResultID. То, что я действительно хочу сделать, это autoincrement@ResultID с этим запросом INSERT INTO. Как я могу это сделать?

+6

Как и в сторону, я сомневаюсь, что этот код будет когда-нибудь мимо меня, если бы я сделал обзор на Это. Укажите имена столбцов, а не только значения, в инструкции INSERT. Вы можете поблагодарить меня позже. ';)' (Если что-либо происходит с структурой таблицы, что делает ее несовместимой с тем, что предполагает ваш код, вы получите исключение, а не потенциально данные, вставленные в неожиданные столбцы.) –

+6

Просто используйте столбец IDENTITY: проблема решена (вы не говорите ему значение для вставки: оно делает это сам) –

+0

@MarcGravell Я не уверен, что помогает OP, если это необходимо позже. Хотя, если это так, то здесь начинается вызов хранимой процедуры. (Это может быть вызвано в любом случае, но особенно тогда ...) –

ответ

3

Сделайте этот столбец IDENTITY (например, IDENTITY (1,1)) и дайте ему управлять базой данных. Попытка справиться с этим извне - это кошмар. Тогда становится (заметим, что это необычно сложная из-за использования Id 2 столбца, которые звучат как ошибки):

int newId = 0; 

using (SqlCommand cmd = new SqlCommand(
    @"INSERT INTO Results (HasSucceeded, Screenshot) 
     VALUES (@HasSucceeded, @Screenshot); 
     DECLARE @ResultID int = SCOPE_IDENTITY(); 
     UPDATE Results SET ScenarioID = @ResultID 
        WHERE ResultID = @ResultID; 
     SELECT @ResultID;", conn)) 
{ 
    cmd.Parameters.AddWithValue("@HasSucceeded", HasSucceeded); 
    cmd.Parameters.AddWithValue("@Screenshot", screenshot); 

    newId = (int)cmd.ExecuteScalar(); 
} 

// ...Use newId here... 
+0

Хотя я согласен, что это должно быть личность, если это не так, и есть другая вставка кода в эту таблицу (из этого приложения, из другого аппликация или импорт данных), тогда вы можете заставить его сломаться. – HLGEM