C# CheckedListBox Kaynaklı, Döngü Şeklinde Veri Kaydı

Bu konuyu okuyanlar

UgurOnline

Asistan
Katılım
11 Aralık 2008
Mesajlar
159
Reaksiyon puanı
1
Puanları
0
elimde bulunan checkboxlist'in itemleri ilaç isimlerinden oluşuyor ve veritabanından çekiliyor. hasta adını ise textboxa yazıyoruz. kaydetmek istediğim zaman HastaIlac isimli farklı bir tabloya, checkboxlist üzerinde kaç adet item seçili ise o kadar kayıt yapmasını istiyorum. aşağıdaki kodlarla son eklenen hastanın ID'sini select top ile değişkene atıyorum bu değişkenide HastaIlac tablosunda bulunan HastaID kolonuna kaydediyorum. sadece IlacID kısmında takıldım. mesela 3 adet ilaç seçili ise HastaIlac tablosuna üç adet üstüste kayıt eklensin. (burada HastaID verisi sabit). kısacası checkboxlist üzerinde seçili veri kadar kaydı, ilacların ID'sine göre nasıl yapabilirim?

mantık şu şekilde:

resim_191674219.jpg


yarım kalan kodlarım ise:

Kod:
string HastaEkle = @"INSERT INTO Hasta (HastaAdi) VALUES (@HastaAdi)";
            SqlCommand com = new SqlCommand(HastaEkle, con);
            com.Parameters.AddWithValue("@HastaAdi", textBox1.Text);

            con.Open();
            com.ExecuteNonQuery();
            con.Close();

            SqlDataAdapter adp = new SqlDataAdapter(@"SELECT Top 1 HastaID FROM Hasta ORDER BY HastaID DESC", con);
            DataTable table = new DataTable();
            adp.Fill(table);
            int SonVeri = Int32.Parse(table.Rows[0]["HastaID"].ToString());


            string HastaIlacEkle = @"INSERT INTO HastaIlac (IlacID, HastaID) VALUES (@IlacID, @HastaID)";
            SqlCommand com2 = new SqlCommand(HastaIlacEkle, con);
            com2.Parameters.AddWithValue("@IlacID", [B]burada takıldım[/B]);
            com2.Parameters.AddWithValue("@HastaID", SonVeri);

            con.Open();
            com2.ExecuteNonQuery();
            con.Close();
teşekkürler
 

blck_egl

Öğrenci
Katılım
8 Kasım 2010
Mesajlar
28
Reaksiyon puanı
3
Puanları
0
Öncelikle son eklenen hasta id'sini alma yöntemini değiştirmeni öneririm. Aynı anda 2 kişi bu işlemi yapmaya kalktığında hasta idlerinde karışıklık olacaktır son eklenen id yi aldığın için. Bu nedenle "INSERT INTO Hasta (HastaAdi) VALUES (@HastaAdi); SELECT SCOPE_IDENTITY()" yaparsan eklemiş olduğun hastanın id sini almış olursun. Sorgunuda executenonquery olarak değil, executescalar olarak çalıştırırsın, id yi almış olursun. Bunun üzerine de ilaç ekleme kısmında çalışmaya başlarsın.
Kod:
string hastaid = com.executescalar().tostring();
string hastailacekle = "insert into hastailac(ilacid, hastaid) values";
for(int i = 0; i < ilaclist.items.count; i++)
{
   if(ilaclist.items[i].selected)
   {
      hastailacekle += "(" + ilaclist.items[i].value + "," + hastaid + "),";
   }
}
hastailacekle = hastailacekle.substring(0, hastailacekle.length - 1); //sonda kalan virgülü silmek için
diye sorgunu oluşturursun.
 

N3CAT1

Dekan
Emektar
Katılım
20 Nisan 2008
Mesajlar
6,609
Reaksiyon puanı
140
Puanları
63
@blck_egl 'in dediği gibi HastaId 'yi en son almak yerine SCOPE_IDENTITY() kullanarak kayıt yapmış olduğun HastaId 'yi alırsın.

CheckedListBox 'ı şu şekilde doldurman gerekir:

PHP:
string sql = "Select ilacid, ad from ilac_tablosu;";
DataTable dt = new DataTable();
SqlDataAdapter adp = new SqlDataAdapter(sql, con);
con.Open();
adp.Fill(dt);
con.Close();

checkedListBox1.DataSource = dt;
checkedListBox1.DisplayMember = "ad";
checkedListBox1.ValueMember = "ilacid";

Kaydı da şu şekilde yapman gerekir:

PHP:
string HastaEkle = @"INSERT INTO Hasta (HastaAdi) VALUES (@HastaAdi); Select SCOP_IDENTITY;";
SqlCommand com = new SqlCommand(HastaEkle, con);
com.Parameters.AddWithValue("@HastaAdi", textBox1.Text);

con.Open();
int hastaId = (int)com.ExecuteScalar();
con.Close();

string HastaIlacEkle = @"INSERT INTO HastaIlac (IlacID, HastaID) VALUES (@IlacID, @HastaID)";
con.Open();
foreach(DataRowView row in checkedListBox1.CheckedItems)
{
    SqlCommand com2 = new SqlCommand(HastaIlacEkle, con);
    com2.Parameters.AddWithValue("@IlacID", Convert.ToInt32(row["ilacid"]));
    com2.Parameters.AddWithValue("@HastaID", hastaId);
    com2.ExecuteNonQuery();
}
con.Close();
 

UgurOnline

Asistan
Katılım
11 Aralık 2008
Mesajlar
159
Reaksiyon puanı
1
Puanları
0
çok sağolun ufak rötuşlarla çalıştırdım. necati verdiğin kodun "int hastaId = (int)com.ExecuteScalar();" kısmında hata verdi. şu şekilde değiştirdim bir hata yok şuanda birde sen bakıver =)

Kod:
int HastaID = Int32.Parse(com.ExecuteScalar().ToString());

tekrar teşekkür ederim ikinizede
 

N3CAT1

Dekan
Emektar
Katılım
20 Nisan 2008
Mesajlar
6,609
Reaksiyon puanı
140
Puanları
63
Aynı kapıya çıkıyor. Bi sorun olmaz :)
 
Üst