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); 
4

2 に答える 2

4

SQL を次のように変更します。

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

scope_identity() は、現在のセッションで最後に挿入された ID 列 (レコード ID) を提供する必要があります。これは、PropertyInformation に挿入した行の ID になります。

于 2013-06-12T18:25:04.387 に答える
0

このような操作は sproc でラップすることをお勧めします。新しいレコードの ID をOUTvar として返すようにします。

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

SqlCommand...その後、のParametersプロパティで OUT パラメータを取得できます。個人的には、これをメソッドにまとめるのが好きです。これは、パラメーターを使用して 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.");
于 2013-06-12T19:00:05.247 に答える