Merhaba;
Excelden verileri çekip kayıtbutonu ile veritabanına kayıt yapıyorum.
Fakat excelden gelen veriler meskenno veritabanında varsa uyarı vermesini istiyorum.
Form üzerinde yapabildim fakat işin içine excelden çekme gelince başaramadım. Lütfen yardımcı olur musunuz. Ne yaparsam yapim AYNISINDAN VAR mesajı alıyorum.
btnInsertAndShow_Click üzerinden durumu false yapınca normal kayıt yapıyor.
ChatGpt amcaya sordum bir örnek verdi bana fakat onuda kodlara uyarlayamadım.
`using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SQLite;
using SpreadsheetLight;
using System.IO;
using System.Globalization; //büyük harf keydetmek için gerekli
namespace odaaktar
{
public partial class odaaktar : Form
{
List<Model.oda> excelData = new List<Model.oda>();
public odaaktar()
{
InitializeComponent();
}
SQLiteConnection baglanti;
bool durum;
void mukerrer()
{
baglanti = new SQLiteConnection("Data Source = dbDENEME.db");
SQLiteCommand kom = new SQLiteCommand("select * from oda where meskenno=@meskenno", baglanti);
kom.Parameters.AddWithValue("@meskenno", grdMakale.Columns[2].HeaderText);
baglanti.Open();
SQLiteDataReader dr = kom.ExecuteReader();
if (dr.Read())
{
durum = false;
}
else
{
durum = true;
}
baglanti.Close();
}
public List<Model.oda> MakeleExcelYukle()
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Excel Dosyası .xlsx |*.xlsx| Excel Dosyası .xls |*.xls";
ofd.ShowDialog();
string file = ofd.FileName;
using (SLDocument sl = new SLDocument())
{
if (string.IsNullOrEmpty(ofd.FileName))
{
MessageBox.Show(this, "DOSYA SEÇMEDİNİZ. İşlem İptal Edildi..", "Sistem Mesajı", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else
{
FileStream fs = new FileStream(file, FileMode.Open);
SLDocument sheet = new SLDocument(fs, "Table 1"); // Excelde 'Table 1' yoksa ilk bulduğu tablodan başlar
SLWorksheetStatistics stats = sheet.GetWorksheetStatistics();
try
{
// başlıkları atlamak için 2.rowdan başlıyor
for (int j = 2; j <= stats.EndRowIndex; j++)
{
Model.oda mk = new Model.oda();
mk.adisoyadi = sheet.GetCellValueAsString(j, 1);
mk.meskenno = sheet.GetCellValueAsInt64(j, 2);
mk.projeno = sheet.GetCellValueAsInt64(j, 3);
mk.sinifi = sheet.GetCellValueAsInt64(j, 4);
mk.takisi = sheet.GetCellValueAsString(j, 5);
excelData.Add(mk);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
return excelData;
}
}
public void GridUploadDataGoster(List<Model.oda> makaleData)
{
grdMakale.DataSource = makaleData;
}
public void EkleVeGoster(List<Model.oda> makaleData)
{
foreach (var mk in makaleData)
{
SQLiteHelper.ExecQuery($@"INSERT INTO [oda]
([adisoyadi]
,[meskenno]
,[projeno]
,[sinifi]
,[takisi])
VALUES
({"\"" + mk.adisoyadi.ToUpper(new CultureInfo("tr-TR", false)) + "\""}
,{ "\"" + mk.meskenno + "\""}
,{ "\"" + mk.projeno + "\""}
,{ "\"" + mk.sinifi + "\""}
,{ "\"" + mk.takisi.ToUpper(new CultureInfo("tr-TR", false)) + "\""});
"); // int big int gibi sayısal değerler tırnak olmadan eklenir.
}
grdMakale.DataSource = SQLiteHelper.SelectQuery("select * from oda");
}
private void btnGoster_Click(object sender, EventArgs e)
{
MessageBox.Show("İşlem, seçilecek dosyanın büyüklüğüne göre uzun sürebilir. Lütfen tamamlanana kadar bekleyin." + "\n" + "\n" + "Örnek EXCEL ŞABLONUNA göre bir dosya seçmeniz gerektiğini unutmayınız.", "Yüklemeden Önce Duyuru..!", MessageBoxButtons.OK, MessageBoxIcon.Information);
var excelData = MakeleExcelYukle();
GridUploadDataGoster(excelData);
grdMakale.Columns[0].Visible = false;
grdMakale.Columns[0].HeaderText = "ID";
grdMakale.Columns[1].HeaderText = "ADI SOYADI";
grdMakale.Columns[2].HeaderText = "MESKEN NO";
grdMakale.Columns[3].HeaderText = "PROJE NO";
grdMakale.Columns[4].HeaderText = "SINIFI";
grdMakale.Columns[5].HeaderText = "TAKISI";
btnGoster.Enabled = false;
btnInsertAndShow.Enabled = true;
}
private void btnInsertAndShow_Click(object sender, EventArgs e)
{
if (durum == true)
{
MessageBox.Show("Kaydetme işlemi yüklenecek verinin büyüklüğüne göre uzun sürebilir." + "\n" + "\n" + "Lütfen işlem tamamlandı mesajına kadar bekleyiniz.", "İşlem Sonucu", MessageBoxButtons.OK, MessageBoxIcon.Warning);
EkleVeGoster(excelData);
btnInsertAndShow.Enabled = false;
MessageBox.Show("İŞLEM TAMAMLANDI.", "Excel Aktarma İşlemi", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("AYNISINDAN VAR", "Duyuru..!", MessageBoxButtons.OK, MessageBoxIcon.Information);
//this.Close();
}
}
}
}
`
GPT Amcanın bana verdiği kodlar:
`C# ile DataGridView’de bulunan verileri veritabanına kaydederken, veritabanında aynı verilerin varlığını kontrol ederek kayıt işlemi olmamasını ve bir uyarı almanızı sağlayabilirsiniz. İşte basit bir örnek:
// DataGridView'deki verileri veritabanına kaydetme işlemi
private void KaydetButton_Click(object sender, EventArgs e)
{
// Veritabanı bağlantısı ve komut oluşturma
using (SqlConnection connection = new SqlConnection("veritabanı-bağlantı-dizesi"))
{
connection.Open();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
// DataGridView'deki her bir satır için veri kontrolü
string veri = row.Cells["KolonAdi"].Value.ToString(); // KolonAdi, DataGridView'deki ilgili kolon adını temsil eder
// Veritabanında aynı verinin varlığını kontrol etme
string query = "SELECT COUNT(*) FROM TabloAdi WHERE KolonAdi = @Veri";
SqlCommand command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@Veri", veri);
int count = (int)command.ExecuteScalar();
// Eğer veri veritabanında bulunuyorsa uyarı verme
if (count > 0)
{
MessageBox.Show("Bu veri zaten veritabanında mevcut: " + veri);
}
else
{
// Veriyi veritabanına ekleme işlemi
query = "INSERT INTO TabloAdi (KolonAdi) VALUES (@Veri)";
command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@Veri", veri);
command.ExecuteNonQuery();
}
}
connection.Close();
}
}
Yukarıdaki örnekte, DataGridView’de her bir satır için veritabanında aynı verinin olup olmadığı kontrol ediliyor. Eğer veri veritabanında zaten mevcutsa, MessageBox ile bir uyarı veriliyor. Aksi takdirde, veriyi veritabanına eklemek için INSERT INTO komutu kullanılıyor.
Kodunuzdaki “veritabanı-bağlantı-dizesi”, “KolonAdi”, “TabloAdi” gibi kısımları projenizin gereksinimlerine göre güncellemeniz gerekmektedir.`