I'm trying to do CRUD operations in my Oracle DB through C# WPF.
I created a DataGrid displaying all the rows in my table, which I was able to connect to my DB. However, when I try to input values in the form on the left side, I get this error: System.InvalidOperationException: オブジェクトの現在の状態に問題があるため、操作は有効ではありません。
Project Code (プロジェクト) and Task Code (分類) belong to a different table and are referenced in my main table.
// Sample of how I fill the Project Code combobox
private void fillProjectComboBox()
{
string sql = "SELECT PROJECT_CODE, PROJECT_NAME FROM TASK_PROJECT";
cmd.Connection = conn;
try
{
cmd = new OracleCommand(sql, conn);
OracleDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
string project = dr.GetString(0);
regProjectBox.Items.Add(project);
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
private void RegisterNewButton_Click(object sender, RoutedEventArgs e)
{
String sql = "INSERT INTO TASK_INFO(USER_ID, ATTENDED_DATE, START_TIME, END_TIME, TASK_HOURS, PROJECT_CODE, TASK_CODE, TASK_DESCRIPTION)" +
" VALUES(:USER_ID, :ATTENDED_DATE, :START_TIME, :END_TIME, :TASK_HOURS, :PROJECT_CODE, :TASK_CODE, :TASK_DESCRIPTION)";
cmd = new OracleCommand(sql, conn);
cmd.Parameters.Add("USER_ID", OracleDbType.Varchar2, 20).Value = "test";
cmd.Parameters.Add("ATTENDED_DATE", OracleDbType.NChar, 10).Value = regDateTextBox.Text;
cmd.Parameters.Add("START_TIME", OracleDbType.NChar, 5).Value = regStartTimeTextBox.Text;
cmd.Parameters.Add("END_TIME", OracleDbType.NChar, 5).Value = regEndTimeTextBox.Text;
cmd.Parameters.Add("TASK_HOURS", OracleDbType.Int16, 3).Value = int.TryParse(regTaskTimeTextBox.Text, out int result);
cmd.Parameters.Add("TASK_DESCRIPTION", OracleDbType.Varchar2, 50).Value = regTaskDescTextBox.Text;
cmd.Parameters.Add("PROJECT_CODE", OracleDbType.NChar, 9).Value = regProjectBox.SelectedValue;
cmd.Parameters.Add("TASK_CODE", OracleDbType.NChar, 9).Value = regTaskBox.SelectedValue;
try
{
int n = cmd.ExecuteNonQuery();
if (n > 0)
{
MessageBox.Show("Done!");
this.viewDataGrid();
conn.Close();
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
Is there something I should know about adding records into tables with foreign keys? In a different window, I was able to add new records into my Project Code and Task Code tables, so this is only a problem with my main table.
Edited to include error:
Exception thrown: 'Oracle.DataAccess.Client.OracleException' in Oracle.DataAccess.dll
Oracle.DataAccess.Client.OracleException (0x80004005): ORA-02291: integrity constraint (TIMESUSER.SYS_C007051) violated - parent key not found
Location Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck, Int32 isRecoverable, OracleLogicalTransaction m_OracleLogicalTransaction)
Location Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, String procedure, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, Boolean bCheck, OracleLogicalTransaction m_OracleLogicalTransaction)
Location Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()
Location Times.ViewListWindow.RegisterNewButton_Click(Object sender, RoutedEventArgs e) 場所 C:\Users\neicy\source\repos\Times\Times\ViewListWindow.xaml.cs:Line 231
Apparently, it was mainly a matter of ordering the cmd.Parameters.Add according to how you insert them in your query. Refer to this for more info CORRECTED VERSION:
private void fillProjectComboBox()
{
DataTable dtProject = new DataTable();
string sql = "SELECT ID, PROJECT_CODE FROM TASK_PROJECT ORDER BY PROJECT_CODE";
var cmd = new OracleCommand(sql, conn);
using (OracleDataAdapter oracleDataAdapter = new OracleDataAdapter(cmd))
{
oracleDataAdapter.Fill(dtProject);
}
regProjectBox.SelectedValuePath = "ID";
regProjectBox.DisplayMemberPath = "PROJECT_CODE";
regProjectBox.ItemsSource = dtProject.DefaultView;
}
private void RegisterNewButton_Click(object sender, RoutedEventArgs e)
{
string sql = "INSERT INTO TASK_INFO(TASK_INFO_ID, USER_ID, ATTENDED_DATE, START_TIME, END_TIME, TASK_HOURS, PROJECT_ID, TASK_ID, TASK_DESCRIPTION)" +
" VALUES(SEQ_TASK_INFO.NEXTVAL, :USER_ID, :ATTENDED_DATE, :START_TIME, :END_TIME, :TASK_HOURS, :PROJECT_ID, :TASK_ID, :TASK_DESCRIPTION)";
var cmd = new OracleCommand(sql, conn);
cmd.Parameters.Add("USER_ID", OracleDbType.Int16).Value = 1;
cmd.Parameters.Add("ATTENDED_DATE", OracleDbType.NChar, 10).Value = regDateTextBox.Text;
cmd.Parameters.Add("START_TIME", OracleDbType.NChar, 5).Value = regStartTimeTextBox.Text;
cmd.Parameters.Add("END_TIME", OracleDbType.NChar, 5).Value = regEndTimeTextBox.Text;
int taskHours;
if (int.TryParse(regTaskTimeTextBox.Text, out taskHours))
{
cmd.Parameters.Add("TASK_HOURS", OracleDbType.Int16).Value = taskHours;
}
else
{
cmd.Parameters.Add("TASK_HOURS", OracleDbType.Int16).Value = 0;
}
cmd.Parameters.Add("PROJECT_ID", OracleDbType.Int16).Value = 1;
cmd.Parameters.Add("TASK_ID", OracleDbType.Int16).Value = 1;
cmd.Parameters.Add("TASK_DESCRIPTION", OracleDbType.Varchar2, 50).Value = regTaskDescTextBox.Text;
try
{
int n = cmd.ExecuteNonQuery();
if (n > 0)
{
MessageBox.Show("Done!");
this.viewDataGrid();
conn.Close();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace);
Console.WriteLine(ex.Source);
Console.WriteLine(ex.Message);
}
//this.AUD(sql, 0);
registerNewButton.IsEnabled = false;
registerUpdateButton.IsEnabled = true;
registerDeleteButton.IsEnabled = true;
}