2013-06-12 4 views
1

Мне нужно вернуть значение вставленной записи, чтобы перейти к коду, чтобы открыть форму. Как получить эту ценность? Код ниже добавляет запись и обновляет datagridview.Возвращаемое значение вставленной строки

System.Data.SqlClient.SqlConnection sqlConnection1 = 
       new System.Data.SqlClient.SqlConnection("Data Source=***.**.***.**,****;Initial Catalog=newCityCollection_Aracor;Persist Security Info=True;User ID=4456r;Password=654935749653"); 

System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(); 
cmd.CommandType = System.Data.CommandType.Text; 
cmd.CommandText = "INSERT PropertyInformation (ClientKey) VALUES (1)"; 
cmd.Connection = sqlConnection1; 

sqlConnection1.Open(); 
cmd.ExecuteNonQuery(); 
sqlConnection1.Close(); 

this.propertyInformationDataGridView.Invalidate(); 
this.propertyInformationDataGridView.EndEdit(); 
this.propertyInformationDataGridView.Refresh(); 
this.newCityCollectionDataSet.AcceptChanges(); 
this.propertyInformationTableAdapter.Fill(newCityCollectionDataSet.PropertyInformation); 
+0

Это немного трудно понять. Могу ли я получить дополнительный контекст? – phadaphunk

+1

В чем 'ценность' вы говорите? –

+0

Я использую Datagridview в форме как инструмент управления случаем для выбора записей. Я хочу иметь возможность добавлять запись и сразу открывать форму. Я знаю, как открыть форму, а что нет, но не знаю, как получить PK вновь созданной записи. Так что нажмите кнопку, создайте запись, извлеките PK, затем откройте запись в форме - это то, что я собираюсь сделать. – korrowan

ответ

4

Измените свой SQL-то вроде:

INSERT PropertyInformation (ClientKey) VALUES (1); 
SELECT * FROM PropertyInformation WHERE RecordID = scope_identity() 

scope_identity() должен дать вам последний вставленный столбец идентификаторов (ID записи) для текущей сессии, которая будет идентификатор для строки вы просто вставляется в PropertyInformation.

+5

лучше использовать функцию scope_identity(), потому что @@ IDENTITY может быть изменено чем-то вроде триггера. –

+0

Хорошо, как бы я вытащил значение из запроса? Например, я бы сделал что-то вроде System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(); cmd.CommandType = System.Data.CommandType.Text; cmd.CommandText = "INSERT PropertyInformation (ClientKey) VALUES (1)"; cmd.CommandText = "SELECT CaseNumberKey FROM PropertyInformation WHERE RecordID = @@ IDENTITY"; cmd.Connection = sqlConnection1; – korrowan

+1

@korrowan, если ** CaseNumberKey ** - это простое значение (обычно int/long), вы можете использовать 'ExecuteScalar()' для выполнения вставки и получения этого значения. В противном случае (или если вам нужно больше одного столбца) вам нужно обработать команду как запрос и вернуть данные обратно в DataSet. – BlargleMonster

0

Я рекомендую вам обернуть такую ​​операцию в sproc. Попросите его вернуть идентификатор новой записи как OUT var.

CREATE PROC CreateRecord(@ID INT OUT, @Value1 VARCHAR(100), @Value2 VARCHAR(100)) 
AS BEGIN 
    INSERT INTO MyTable (Field1, Field2) VALUES (@Value1, @Value2) 
    SET @ID = SCOPE_IDENTITY() 
END 

... вы можете извлечь OUT из параметров в Parameters собственности ваши SqlCommand «ы. Лично мне нравится, чтобы это было обернуто в методе; вот что я использую для выполнения синхронно sproc с параметрами, слегка упрощенным:

public static Dictionary<string, object> ExecSproc(string connectionString, string proc, IEnumerable<SqlParameter> parameters) 
    { 
    SqlCommand command = null; 
    try 
     { 
     SqlConnection connection = GetConnection(connectionString); 

     // Build the command 
     command    = new SqlCommand(proc, connection); 
     command.CommandTimeout = TimeOutSeconds; 
     command.CommandType = CommandType.StoredProcedure; 

     // Append parameters 
     SqlParameter retValue = new SqlParameter("Return value", null); 
     retValue.Direction = ParameterDirection.ReturnValue; 
     command.Parameters.Add(retValue); 
     if (parameters != null) 
      foreach (SqlParameter param in parameters) 
       command.Parameters.Add(param); 

     // GO GO GO! 
     command.ExecuteNonQuery(); 

     // Collect the return value and out parameters 
     var outputs = new Dictionary<string, object>(); 
     foreach (SqlParameter param in command.Parameters) 
      if (param.Direction != ParameterDirection.Input) 
       outputs.Add(param.ParameterName, param.Value); 
     return outputs; 
     } 
    finally 
     { 
     if (command != null) 
      { 
      command.Cancel(); // This saves some post-processing which we do not need (out vars and a row count) 
      command.Dispose(); 
      } 
     } 
    } 

Вот как это выглядит в использовании:

var results = SQL.ExecSproc(connectionString, sprocName, "@Success OUT", false, "@InVar1", 123, "InVar2", "ABC"); 
if ((bool)results["@Success"] == false) 
    throw new ApplicationException("Failed."); 
+0

Мне нужна ссылка для запуска этого. Я использую system.data, но кажется, что это требует чего-то другого. – korrowan

+0

'System.Data.SqlClient' – zimdanen

Смежные вопросы