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();