パラメータを完全に間違って実行しています。唯一のことは、catch
取得sqlTrans.Rollback();
しているエラーが表示されないことです。最初に変更するのは、そのキャッチを作成することです
catch (System.Data.SqlClient.SqlException)
{
sqlTrans.Rollback();
throw;
}
これで、エラーが発生することがわかります。
次の問題は、テーブルに外部キー制約TRUNCATE TABLE
がある場合に失敗することです。失敗している場合は、単純に置き換えることができます
string delCmdTxt = "delete from PLODINY";
SqlCommand cmdDel = spojeni.CreateCommand();
cmdDel.CommandText = delCmdTxt;
cmdDel.Transaction = sqlTrans;
cmdDel.ExecuteNonQuery();
挿入が機能しない理由については、for ループのインスタンスごとにコマンドを破棄しています。また、毎回パラメーターを再追加しようとしており、そのループを次のように再フォーマットしています。
string insert_sql = "INSERT INTO PLODINY(PLODINA,CENAZAQ,MJ)VALUES(@PLODINA,@CENAZAQ,@MJ)";
using(SqlCommand sqlcom = spojeni.CreateCommand())
{
sqlcom.CommandText = insert_sql;
sqlcom.Transaction = sqlTrans;
sqlcom.Parameters.Add("@PLODINA", SqlDbType.NVarChar); //Replace with whatever the correct datatypes are
sqlcom.Parameters.Add("@CENAZAQ", SqlDbType.NVarChar);
sqlcom.Parameters.Add("@MJ", SqlDbType.NVarChar);
foreach (DataGridViewRow row in dataGridView1.Rows)
{
sqlcom.Parameters["@PLODINA"] = row.Cells["PLODINA"].Value;
sqlcom.Parameters["@CENAZAQ"] = row.Cells["CENAZAQ"].Value;
sqlcom.Parameters["@MJ"] = row.Cells["MJ"].Value;
sqlcom.ExecuteNonQuery();
}
}
sqlTrans.Commit();
ただし、DataGridView がバインディングを介して DataTable によってサポートされている場合は、代わりに SqlTableAdapter を使用できます。たとえば、データベースからテーブルをロードし、グリッドに表示してから、それをプッシュバックしたいとします。更新された情報。DataTable を使用すると、次のように簡単になります
private string _getDataQuery = "select PLODINA, CENAZAQ, MJ from PLODINY";
public void GetData(DataTable data)
{
//You do not need to call open here as SqlDataAdapter does it for you internally.
using(var spojeni = new SqlConnection(GetConnectionString())
using(var adapter = new SqlDataAdapter(_getDataQuery, spojeni)
{
data.Clear();
adapter.Fill(data);
}
}
public void UpdateData(DataTable data)
{
using(var spojeni = new SqlConnection(GetConnectionString())
using(var adapter = new SqlDataAdapter(_getDataQuery, spojeni)
using(var commandBuilder = new SqlCommandBuilder(adapter)
{
//This may or may not be nessesary for spojeni.BeginTransaction()
spojeni.Open();
using(var sqlTrans = spojeni.BeginTransaction())
{
adapter.SelectCommand.Transaction = sqlTrans;
adapter.UpdateCommand = commandBuilder.GetUpdateCommand();
adapter.UpdateCommand.Transaction = sqlTrans;
adapter.DeleteCommand = commandBuilder.GetDeleteCommand();
adapter.DeleteCommand.Transaction = sqlTrans;
adapter.InsertCommand = commandBuilder.GetInsertCommand()
adapter.InsertCommand.Transaction = sqlTrans;
try
{
adapter.Update(data);
sqlTrans.Commit();
}
catch
{
sqlTrans.Rollback();
throw;
}
}
}
}