Оператор if внутри цикла for не работает должным образом после переключения на столбцы IDENTITYC#

Место общения программистов C#
Ответить
Anonymous
 Оператор if внутри цикла for не работает должным образом после переключения на столбцы IDENTITY

Сообщение Anonymous »

Этот код я использовал раньше. Он работает так, как задумано. Я заполняю поля и проверяю некоторые элементы в DataGridView, который использую в качестве флажка, и успешно ввожу их оба в родительскую и дочернюю таблицы. Если я проверю 3 элемента, то 3 записи добавляются в таблицу «Транзакции» и 1 запись в таблицу «Клиенты».
private void Button1_Click(object sender, EventArgs e)
{

DataTable CheckedItemsDataTable = e.selectCheckedItems();
string StaffinCharge = staffComboBox.SelectedValue.ToString();
string retrievedStaffID = Convert.ToString(s.getIdfromName(StaffinCharge));

bool Selection;
bool transactionInsertbool;
bool customerInsertbool;

int SuccessCounter = 0;
int FailureCounter = 0;
int CheckCounter = CheckBoxCache();

//Get the value from the input fields.
c.Id = cIdTextBox.Text;
c.Name = nameTextBox.Text;
c.Sex = genderComboBox.Text;
c.Address = addressTextBox.Text;
c.MaritalStatus = maritalstatusComboBox.Text;
c.DOB = Convert.ToDateTime(DOBdateTimePicker.Value);
c.Age = Convert.ToInt32(ageTextBox.Text);
c.EntryDate = Convert.ToDateTime(DateTimePicker1.Value);

customerInsertbool = c.Insert(c);

for (int i = 0; i < CheckedItemsDataTable.Rows.Count; i++)
{
DataRow row = CheckedItemsDataTable.Rows;
Selection = Convert.ToBoolean(row[0]);

if (Selection == true)
{
t.iD = tIdTextBox.Text;
t.examinationId = Convert.ToString(row[3]);
t.eCustomerId = cIdTextBox.Text;
t.eStaffId = retrievedStaffID;
t.examinationDate = Convert.ToDateTime(DateTimePicker1.Value);
t.doctorAssigned = doctorAssignedTextBox.Text;
t.amount = Convert.ToDecimal(row[2]);

}

//Reload data on the data gridview.
LoadCustomers();
LoadTransactions();

//Inserting data into database.
transactionInsertbool = t.Insert(t);

if (customerInsertbool == true && transactionInsertbool == true)
{
SuccessCounter++;
generateTransactionId();

if (SuccessCounter == CheckCounter)
{
MessageBox.Show("The Record Has Been Saved Successfully.");
generateCustomerId();
}

else if (generateCustomerId == false)
{
FailureCounter++;

if (FailureCounter == CheckCounter)
{
MessageBox.Show("Something Went Wrong. Unable To Save This Record.");
}
}

}

}

Я использовал эти методы для создания идентификаторов. С тех пор я перешел на использование столбцов IDENTITY и больше их не использую.

public void generateCustomerId()
{

try
{
string sql = "select MAX(iD) from db_Customers";
SqlConnection conn = new SqlConnection(myconnstrng);
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);

cmd = new SqlCommand(sql, conn);
conn.Open();
var maxid = cmd.ExecuteScalar() as string;

if (maxid == null)
{
cIdTextBox.Text = "C-ID000000000001";
}
else
{
int intval = int.Parse(maxid.Substring(4, 12));
intval++;
cIdTextBox.Text = String.Format("C-ID{0:000000000000}", intval);
}
conn.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

public void generateTransactionId()
{

try
{
string sql = "select MAX(Id) from db_Transactions";
SqlConnection conn = new SqlConnection(myconnstrng);
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);

cmd = new SqlCommand(sql, conn);
conn.Open();
var maxid = cmd.ExecuteScalar() as string;

if (maxid == null)
{
tIdTextBox.Text = "T-ID000000000001";

}
else
{
int intval = int.Parse(maxid.Substring(4, 12));
intval++;
tIdTextBox.Text = String.Format("T-ID{0:000000000000}", intval);

}

conn.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

Это мой нынешний код, и он не работает должным образом, и я не знаю, почему. Сейчас я использую столбцы IDENTITY и SCOPE_IDENTITY(); для передачи идентификатора в дочернюю таблицу. Я проверяю 3 элемента и ожидаю добавления 3 записей, но вместо этого я получил 50 добавленных записей. Идентификаторы: (1,2,3,3,3.... до 50-го, потому что у меня всего 50 элементов в моей таблице данных. Каким-то образом мой "if (Selection == true)" внутри цикла for не работает должным образом, как это было в моем старом коде. Я, вероятно, что-то упустил из виду.

private void Button1_Click(object sender, EventArgs e)
{

DataTable CheckedItemsDataTable = e.selectCheckedItems();
string StaffinCharge = staffComboBox.SelectedValue.ToString();
string retrievedStaffID = Convert.ToString(s.getIdfromName(StaffinCharge));

bool isSuccess = false;

bool transactionInsertbool;
bool customerInsertbool;
bool ItemSelection;

int SuccessCounter;
int FailureCounter;
int CheckCounter = CheckBoxCache();
string RetrievedPatientID;
int ResultingPatientID;
int NewID;

bool transactionInsertbool;
bool customerInsertbool;

try
{

string sql = "INSERT INTO db_Customers (Name, Sex, Address, MaritalStatus, DOB, Age, EntryDate) VALUES (@Name, @Sex, @Address, @MaritalStatus, @DOB, @Age, @EntryDate); SET @LastId = SCOPE_IDENTITY();";

SqlConnection conn = new SqlConnection(myconnstrng);
SqlCommand cmd = new SqlCommand(sql, conn);

cmd.Parameters.AddWithValue("@Name", nameTextBox.Text;);
cmd.Parameters.AddWithValue("@Sex", sexComboBox.Text);
cmd.Parameters.AddWithValue("@Address", addressTextBox.Text);
cmd.Parameters.AddWithValue("@MaritalStatus", maritalstatusComboBox.Text);
cmd.Parameters.AddWithValue("@DOB", Convert.ToDateTime(DOBdateTimePicker.Value));
cmd.Parameters.AddWithValue("@Age", Convert.ToInt32(ageTextBox.Text));
cmd.Parameters.AddWithValue("@EntryDate", Convert.ToDateTime(DateTimePicker1.Value));

SqlParameter newIDParameter = new SqlParameter("@LastId", SqlDbType.Int);
newIDParameter.Direction = ParameterDirection.Output;
cmd.Parameters.Add(newIDParameter);

conn.Open();

int rows = cmd.ExecuteNonQuery();
int NewId = (int)newIDParameter.Value;

conn.Close();

if (rows > 0)
{
isSuccess = true;
LoadCustomers();

}
else
{
isSuccess = false;
}

for (int i = 0; i < CheckedItemsDataTable.Rows.Count; i++)
{
DataRow row = CheckedItemsDataTable.Rows;
ItemSelection = Convert.ToBoolean(row[0]);

if (ItemSelection == true)
{

t.examinationId = Convert.ToString(row[3]);
t.eCustomerId = NewId;
t.eStaffId = retrievedStaffID;
t.examinationDate = Convert.ToDateTime(DateTimePicker1.Value);
t.doctorAssigned = doctorAssignedTextBox.Text;
t.amount = Convert.ToDecimal(row[2]);

}

transactionInsertbool = t.InsertTests(t);

LoadCustomers();
LoadTransactions();

}

if (customerInsertbool == true && transactionInsertbool == true)
{
SuccessCounter++;

if (SuccessCounter == CheckCounter)
{
MessageBox.Show("The Record Has Been Saved Successfully.");
}

else if (customerInsertbool == false && transactionInsertbool == false)
{
FailureCounter++;

if (FailureCounter == CheckCounter)
{
MessageBox.Show("Something Went Wrong. Unable To Save This Record.");
}
}

}

catch (Exception ex)
{

}
finally
{
conn.Close();
}

}
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... dentity-co
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»