Cara membuat database SQL Server secara terprogram di C#

Saya ingin membuat program yang akan menggunakan database SQL Server 2008. Saat pertama kali memulai, saya ingin membuka jendela, yang memungkinkan pengguna membuat database. Sederhananya, kotak teks dengan nama dan ip komputer database yang akan diatur dan tombol "Go".

Program akan berada di WPF .NET4. Dan database akan berada di jaringan lokal.

Bisakah Anda menyarankan saya solusi yang baik? Apakah ini praktik pemrograman yang baik untuk melakukan itu? Atau mungkin saya harus melampirkan skrip sql saja?

Saya melakukan riset, saya menemukan artikel itu: http://www.codeproject.com/KB/tips/CreateSQLDV.aspx

Tapi, masalah pertama, di SQL Server 2008, tidak ada Microsoft.SqlServer.SmoEnum.dll. Jadi, ketika saya melakukan jendela "pembuatan data" serupa, tetapi untuk SQL Server 2008 (mungkin menggunakan dll yang berbeda) - Ini tidak akan berfungsi untuk SQL Server 2005. Dan mungkin tidak akan berfungsi dengan versi lain dari SQL Server 2008? Saya tidak tahu.. Contoh dari proyek kode terlihat bagus, tapi saya tidak yakin.

Saya ingin melakukan program yang fleksibel.


person Marshall    schedule 09.09.2011    source sumber


Jawaban (3)


Saya akan menghindari SMO.

Ini sangat bergantung pada audiens Anda dan kontrol yang Anda miliki atas lingkungan yang diharapkan, tetapi melampirkan database yang sudah dibuat sebelumnya, meskipun merupakan pilihan yang mudah, terkadang dapat menimbulkan masalah - untuk memulainya adalah biner di bawah kendali sumber, jadi Anda tidak mendapatkan diffs secara gratis di sistem kontrol sumber Anda. Selain itu, Anda melampirkan database dengan opsi dan hal tertentu yang mungkin tidak sesuai untuk lingkungan target tertentu - SQL Server 2005, SQL Server 2008, SQL Server 2008 R2? Selain itu semua, ini adalah pendekatan valid yang mirip dengan cara seseorang menyebarkan aplikasi Access di masa lalu.

Dalam lingkungan yang kurang terkontrol, saya akan membuat skrip SQL yang berisi semua DDL (dan DML untuk tabel pencarian) atau menyediakan skrip, menawarkan untuk menjalankannya secara otomatis dan juga memberi mereka opsi untuk menjalankannya sendiri dengan alat mereka sendiri. (jika mereka memiliki DBA).

Sekarang skrip Anda (atau setidaknya templat untuk skrip atau kode yang menghasilkan skrip) berada di bawah kendali sumber dan dapat memuaskan DBA yang ingin memeriksanya.

person Cade Roux    schedule 09.09.2011
comment
Database saya cukup sederhana: Memiliki tabel (satu dengan tipe Gambar), prosedur tersimpan, pemicu, dan beberapa tampilan. Itu saja. Jadi menurut saya ini cocok untuk server SQL 2005 dan yang lebih baru. - person Marshall; 09.09.2011
comment
@Marshall: sebagai catatan tambahan: jika Anda menggunakan SQL Server 2005 atau lebih baru, Anda sebaiknya tidak menggunakan tipe IMAGE lagi - gunakan VARBINARY(MAX) sebagai gantinya.... - person marc_s; 09.09.2011
comment
@Marshall Anda tidak dapat melampirkan file database SQL Server ke versi SQL Server yang lebih lama. Jadi, jika Anda memiliki orang yang menggunakan versi SQL Server yang berbeda, file database kosong yang Anda lampirkan harus dari versi paling awal yang perlu Anda dukung. Sama halnya dengan melakukan pemulihan pada file cadangan yang Anda berikan. Ini adalah keuntungan dari skrip, seperti yang saya katakan, skrip Anda akan berjalan di lingkungan pengguna (dan mereka dapat memodifikasinya jika lingkungannya unik). Pertanyaannya adalah seperti apa target pengguna dan lingkungannya serta apa yang mereka harapkan. - person Cade Roux; 09.09.2011
comment
@marc_s Terima kasih, saya ingat saya mengubahnya ke IMAGE, karena saya punya beberapa masalah dengan file.. Saya pikir tidak ada perbedaan besar di antara keduanya. Saya akan mencoba untuk kembali ke varbinary segera. - person Marshall; 09.09.2011
comment
@Cade Roux Ya, Anda meyakinkan saya untuk menggunakan skrip, namun, Apakah Anda menyarankan klien program saya harus menjalankan sendiri skrip dalam manajemen sql-server? - person Marshall; 09.09.2011
comment
@Marshall Hanya jika mereka memiliki persyaratan DBA atau lingkungan. Katakanlah Anda memiliki aplikasi yang mengharuskan mereka masuk sebagai sa atau serupa karena aplikasi tersebut perlu membuat database - mereka mungkin memiliki persyaratan agar kode tersebut ditinjau atau diaudit. Atau mereka membuat database dan pengguna DAN HANYA KEMUDIAN aplikasi Anda dapat menyiapkan objek seperti tabel dan prosedur dalam database karena program penyiapan Anda hanya akan berjalan sebagai pengguna yang mereka siapkan untuk Anda. Alternatifnya, jika aplikasi Anda menggunakan SQL Server Express atau sejenisnya sebagai database internal senyap, mungkin Anda cukup menggunakan fitur lampirkan. Sulit untuk mengatakannya saat ini. - person Cade Roux; 10.09.2011

Saya akan merekomendasikan tidak untuk benar-benar membuat database secara terprogram. Seperti yang Anda sebutkan - dengan versi SMO yang berbeda, ini menjadi sedikit mimpi buruk.

Pendekatan saya adalah ini:

  • dengan instalasi Anda, kirimkan database kosong "default" yang memiliki struktur dasar Anda (semua tabel Anda dan semuanya) dan mungkin juga beberapa data pencarian dasar di tabel tertentu

  • ketika pengguna menunjukkan bahwa dia tidak memiliki database untuk aplikasi Anda, salin file MDF/LDF/dan mungkin NDF ke lokasi data SQL Server

  • lampirkan file database tersebut secara terprogram ke contoh SQL Server

Tampaknya itu pendekatan yang lebih bersih dan fleksibel.

person marc_s    schedule 09.09.2011
comment
Yah, saya tidak tahu (sekarang) bagaimana cara melampirkan file mdf dan ldf ke SQL Server secara terprogram. Maksud Anda secara terprogram dari program C#? Tapi jika memungkinkan, saya menyukai ide itu. Tetapi untuk melampirkan file-file ini pengguna harus memasukkan login dan kata sandi ke program (atau mode otentikasi), bukan? - person Marshall; 09.09.2011
comment
@Marshall: ya - tentu - secara terprogram dengan mengeluarkan pernyataan T-SQL normal - lihat msdn.microsoft.com/en-us/library/ms165673.aspx untuk detail lebih lanjut! - person marc_s; 09.09.2011
comment
Jadi, saya harus terhubung ke database master. Apakah menurut Anda melampirkan file mdf lebih baik daripada menjalankan pembuatan skrip? Apa pro dan kontra dari solusi ini? - person Marshall; 09.09.2011
comment
@Marshall: ATTACH biasanya jauh lebih cepat dan hanya membutuhkan dua file (MDF/LDF). Membuat seluruh basis data dari sebuah skrip agak rumit - skrip berfungsi dengan baik untuk memperbarui basis data Anda dengan perubahan ketika sudah ada. - person marc_s; 09.09.2011
comment
Iya kamu benar. Tetapi dengan menggunakan skrip, pengguna dapat menentukan ukuran, mode pemulihan, atau nama.. tetapi akan lebih lambat. Saya pikir gunakan kedua solusi tersebut. Pengguna akan mempunyai pilihan, membuat database lebih cepat atau membuat custom. Terimakasih atas bantuannya - person Marshall; 09.09.2011

Pembuatan database mungkin tidak perlu menjadi bagian dari kode Anda sendiri. Apalagi jika Anda hanya perlu membuat database satu kali saja. Saya menyarankan pendekatan di mana Anda membuat penginstal dengan menggunakan Penginstal Windows atau Inno Setup (Saya lebih suka Inno Setup). Dengan penginstal, Anda dapat meminta nama server SQL kepada pengguna dan kredensial login untuk pengguna administratifnya. Kemudian Anda dapat menggunakannya untuk menjalankan skrip SQL yang berisi pernyataan CREATE DATABASE dan CREATE TABLE Anda, dan sebagainya. Semoga ini membantu.

person Christian Correa    schedule 09.09.2011
comment
Saya tidak tahu apakah saya memahaminya dengan benar. Anda menyarankan untuk menanyakan nama Server, otentikasi dan (dalam kasus autentikasi server sql) kepada pengguna dan kata sandi. Kemudian buat string koneksi ke database master. gunakan master untuk membuat database, tabel, dll. Benar? - person Marshall; 09.09.2011
comment
Izinkan saya menjelaskan. Apa yang saya sarankan adalah Anda tidak lagi melakukan pembersihan basis data awal secara terprogram dalam kode C# Anda. Dahulu kala saya membuat penginstal menggunakan penginstal Windows yang akan memanggil utilitas baris perintah server SQL dengan semua argumen yang diperlukan: nama server, kata sandi, nama database, dan jalur ke file skrip SQL Anda yang berisi pernyataan pembuatan database/tabel. - person Christian Correa; 09.09.2011