Yazılım.
CevapSitesi.com Beta!
Çözüm Noktası
Facebook, Twitter, Google+ veya e-posta ile paylaşın.
| Sorular | Makaleler | Üyeler | Etiketler  | İletişim
Soru sormak ya da cevap vermek için;
giriş yapın veya üye olun.

Sosyal medya hesaplarınızla da giriş yapabilirsiniz.

Yazılım Soruları

0

Bir DataTable içindeki veriler SQL Server veritabanına nasıl kaydedilir

C# ile DataTable sınıfını sık sık kullanıyorum. Bazen kayıtlarını kendi eklediğim veya başka bir yerden aldığım verilerle doldurduğum tablolarım oluyor. Bu işi sık sık yaptığımdan, bunlar için ayrı ayrı SQL Server veritabanında tablolar veya bunları kaydetmek için stok prosedürler oluşturmak zor oluyor.

Bunun kolay bir yolu var mı? DataTable içindeki kayıtları SQL Server işine hiç girmeden C# kodlarım içinden veritabanına kaydedebilir miyim?

Tablo varsa ekleme, yoksa oluşturma işini de yaparsa çok iyi olur.

Soran:24.04.17 20:36
misafir  

1 Cevap

0
Bunu SqlBulkCopy kullanarak tablo varsa ekleme işini halletmek çok kolay. Ancak tablo yoksa yeni oluşturması işi biraz uzun.

Altta şuradan ve şuradan alıp birleştirdiğim ve küçük bazı düzenlemeler yaptığım bir örnek var. Ben test ettim. Gayet güzel çalışıyor.

 public static void DataTableKopyala(DataTable dt, string tableName, SqlConnection conn)
 {
     // Tablo var mı bak.
     SqlCommand cmd = new SqlCommand("SELECT * FROM sysobjects where name = '" + tableName + "'", conn);
     bool tabloVar = cmd.ExecuteScalar() != null;

     // Tablo yoksa oluştur.
     if (!tabloVar)
     {
         string cmdText = CreateTableSQL(tableName, dt);
         SqlCommand ct = new SqlCommand(cmdText, conn);
         ct.ExecuteNonQuery();
     }

     using (var bulkCopy = new SqlBulkCopy(conn.ConnectionString, SqlBulkCopyOptions.KeepIdentity))
     {
         foreach (DataColumn col in dt.Columns)
         {
             bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
         }

         bulkCopy.BulkCopyTimeout = 600;
         bulkCopy.DestinationTableName = tableName;
         bulkCopy.WriteToServer(dt);
     }
 }

 // DataTable nesnesine göre bir SQL sorgusu oluşturur.
 public static string CreateTableSQL(string tableName, DataTable table)
 {
     string sqlsc;
     sqlsc = "CREATE TABLE " + tableName + " (";
     for (int i = 0; i < table.Columns.Count; i++)
     {
         sqlsc += "\n [" + table.Columns[i].ColumnName + "] ";
         string columnType = table.Columns[i].DataType.ToString();
         switch (columnType)
         {
             case "System.Int32":
                 sqlsc += " int ";
                 break;
             case "System.Int64":
                 sqlsc += " bigint ";
                 break;
             case "System.Int16":
                 sqlsc += " smallint";
                 break;
             case "System.Byte":
                 sqlsc += " tinyint";
                 break;
             case "System.Decimal":
                 sqlsc += " decimal ";
                 break;
             case "System.DateTime":
                 sqlsc += " datetime ";
                 break;
             case "System.String":
             default:
                 sqlsc += string.Format(" nvarchar({0}) ", table.Columns[i].MaxLength == -1 ? "max" : table.Columns[i].MaxLength.ToString());
                 break;
         }
         if (table.Columns[i].AutoIncrement)
             sqlsc += " IDENTITY(" + table.Columns[i].AutoIncrementSeed.ToString() + "," + table.Columns[i].AutoIncrementStep.ToString() + ") ";
         if (!table.Columns[i].AllowDBNull)
             sqlsc += " NOT NULL ";
         sqlsc += ",";
     }
     return sqlsc.Substring(0, sqlsc.Length - 1) + "\n)";
 }

Örnek kullanım:

    // Bir DataTable oluştur.
    DataTable dt = new DataTable();
    dt.Clear();
    // Bazı alanlar ekle.
    dt.Columns.Add("Adi");
    dt.Columns.Add("Soyadi");
    dt.Columns.Add("Meslegi");
    // Bir kayıt ekle.
    DataRow dr = dt.NewRow();
    dr[0] = "Mehmet";
    dr[1] = "Emre";
    dr[2] = "Öğretmen";
    dt.Rows.Add(dr);
    // Bir kayıt daha ekle
    dr = dt.NewRow();
    dr[0] = "Rüştü";
    dr[1] = "Keskintepe";
    dr[2] = "Emekli";
    dt.Rows.Add(dr);
    // Bağlantı oluştur va aç.
    string connectionString = @"Data Source...(Buraya bağlantı dizenizi yazın)";
    SqlConnection conn = new SqlConnection(connectionString);
    conn.Open();
    // DataTable kayıtlarını veritabanına yaz.
    DataTableKopyala(dt, "Kisiler", conn);
    conn.Close();


Cevaplayan: 24.04.17 17:57
cevapsitesi
102,034p 15ü