วิธีสร้างฐานข้อมูล SQL Server โดยทางโปรแกรมใน C #

ฉันต้องการสร้างโปรแกรมที่จะใช้ฐานข้อมูล SQL Server 2008 ในระหว่างการเริ่มต้นครั้งแรก ฉันต้องการเปิดหน้าต่างที่ให้ผู้ใช้สร้างฐานข้อมูล มันจะเป็นเพียงกล่องข้อความที่มีชื่อและ IP ของคอมพิวเตอร์ฐานข้อมูลเพื่อตั้งค่าและปุ่ม "ไป"

โปรแกรมจะเป็น WPF .NET4 และฐานข้อมูลจะอยู่ในเครือข่ายท้องถิ่น

คุณช่วยแนะนำทางออกที่ดีให้ฉันได้ไหม? มันเป็นการฝึกเขียนโปรแกรมที่ดีหรือเปล่าที่จะทำแบบนั้น? หรือบางทีฉันควรจะแนบสคริปต์ sql?

ฉันทำการวิจัย ฉันพบบทความนั้น: http://www.codeproject.com/KB/tips/CreateSQLDV.aspx

แต่ประเด็นแรกใน SQL Server 2008 ไม่มี Microsoft.SqlServer.SmoEnum.dll ดังนั้นเมื่อฉันสร้างหน้าต่าง "สร้างข้อมูล" ที่คล้ายกัน แต่สำหรับ SQL Server 2008 (โดยใช้ dll ที่แตกต่างกัน) - มันจะไม่ทำงานสำหรับ SQL Server 2005 และอาจจะไม่ทำงานกับ SQL Server 2008 เวอร์ชันอื่นด้วย ฉันไม่รู้ .. ตัวอย่างจาก codeproject ดูดี แต่ฉันไม่แน่ใจ

ฉันอยากทำโปรแกรมแบบยืดหยุ่น


person Marshall    schedule 09.09.2011    source แหล่งที่มา


คำตอบ (3)


ฉันจะหลีกเลี่ยง SMO

ขึ้นอยู่กับผู้ชมของคุณและการควบคุมที่คุณมีต่อสภาพแวดล้อมที่คาดหวังเป็นอย่างมาก แต่การแนบฐานข้อมูลที่สร้างไว้ล่วงหน้า แม้จะเป็นตัวเลือกที่สะดวก แต่บางครั้งก็อาจมีปัญหา เริ่มต้นด้วยการเป็นไบนารี่ภายใต้การควบคุมแหล่งที่มา ดังนั้นคุณจะไม่ได้รับ แตกต่างได้ฟรีในระบบควบคุมแหล่งที่มาของคุณ นอกจากนี้ คุณกำลังแนบฐานข้อมูลพร้อมตัวเลือกบางอย่างและสิ่งที่อาจไม่เหมาะสมสำหรับสภาพแวดล้อมเป้าหมายเฉพาะ - SQL Server 2005, SQL Server 2008, SQL Server 2008 R2? นอกเหนือจากนั้น ยังเป็นแนวทางที่ถูกต้องซึ่งคล้ายกับวิธีการปรับใช้แอปพลิเคชัน Access ในอดีต

ในสภาพแวดล้อมที่มีการควบคุมน้อย ฉันจะเลือกสร้างสคริปต์ SQL ที่มี DDL ทั้งหมด (และ DML สำหรับตารางการค้นหา) หรือจัดเตรียมสคริปต์ โดยเสนอให้เรียกใช้โดยอัตโนมัติและให้ตัวเลือกในการรันด้วยตนเองด้วยเครื่องมือของตนเอง (หากพวกเขามี DBA)

ตอนนี้สคริปต์ของคุณ (หรืออย่างน้อยเทมเพลตสำหรับสคริปต์หรือโค้ดที่สร้างสคริปต์) อยู่ภายใต้การควบคุมแหล่งที่มาและสามารถตอบสนอง DBA ที่ต้องการตรวจสอบได้

person Cade Roux    schedule 09.09.2011
comment
ฐานข้อมูลของฉันค่อนข้างง่าย: มีตาราง (หนึ่งตารางที่มีประเภทรูปภาพ) ขั้นตอนการจัดเก็บ ทริกเกอร์และมุมมองสองสามรายการ นั่นคือทั้งหมดที่ ดังนั้นฉันคิดว่ามันเหมาะสมสำหรับเซิร์ฟเวอร์ SQL ปี 2005 และรุ่นหลัง - person Marshall; 09.09.2011
comment
@Marshall: ตามหมายเหตุด้านข้าง: หากคุณใช้ SQL Server 2005 หรือใหม่กว่า คุณควรไม่ใช้ประเภท IMAGE อีกต่อไป - ใช้ VARBINARY(MAX) แทน.... - person marc_s; 09.09.2011
comment
@Marshall คุณไม่สามารถแนบไฟล์ฐานข้อมูล SQL Server กับ SQL Server เวอร์ชันเก่ากว่าได้ ดังนั้นหากคุณมีคนที่ใช้ SQL Server เวอร์ชันต่างกัน ไฟล์ฐานข้อมูลเปล่าที่คุณแนบจะต้องมาจากเวอร์ชันแรกสุดที่คุณต้องการรองรับ สิ่งเดียวกันกับการคืนค่าไฟล์สำรองที่คุณระบุ นี่คือข้อดีของการเขียนสคริปต์ อย่างที่ฉันบอกไปแล้วว่าสคริปต์ของคุณจะทำงานในสภาพแวดล้อมของผู้ใช้ (และสามารถแก้ไขได้หากสภาพแวดล้อมไม่ซ้ำกัน) คำถามยังคงอยู่ว่าผู้ใช้เป้าหมายและสภาพแวดล้อมของพวกเขามีลักษณะอย่างไรและคาดหวังอะไร - person Cade Roux; 09.09.2011
comment
@marc_s ขอบคุณ ฉันจำได้ว่าฉันเปลี่ยนเป็น IMAGE เพราะฉันมีปัญหากับไฟล์ .. ฉันคิดว่าไม่มีความแตกต่างกันมากนัก ฉันจะพยายามกลับมาที่ varbinary เร็วๆ นี้ - person Marshall; 09.09.2011
comment
@Cade Roux คุณโน้มน้าวให้ฉันใช้สคริปต์ แต่คุณแนะนำไคลเอนต์ของโปรแกรมของฉันควรรันสคริปต์ในการจัดการเซิร์ฟเวอร์ sql ด้วยตัวเองหรือไม่? - person Marshall; 09.09.2011
comment
@Marshall เฉพาะในกรณีที่พวกเขามี DBA หรือข้อกำหนดด้านสิ่งแวดล้อม สมมติว่าคุณมีแอปที่กำหนดให้ต้องเข้าสู่ระบบด้วย sa หรือคล้ายกันเนื่องจากจำเป็นต้องสร้างฐานข้อมูล - แอปเหล่านั้นอาจมีข้อกำหนดที่ต้องตรวจสอบหรือตรวจสอบโค้ด หรือว่าพวกเขาสร้างฐานข้อมูลและผู้ใช้ จากนั้นแอปของคุณจะสามารถตั้งค่าออบเจ็กต์ เช่น ตารางและขั้นตอนในฐานข้อมูลได้เท่านั้น เนื่องจากโปรแกรมการตั้งค่าของคุณจะทำงานในฐานะผู้ใช้ที่พวกเขาตั้งค่าไว้สำหรับคุณเท่านั้น หรืออีกทางหนึ่ง หากแอปของคุณใช้ SQL Server Express หรือที่คล้ายกันเป็นฐานข้อมูลภายในแบบไม่มีการโต้ตอบ บางทีคุณอาจใช้คุณสมบัติการแนบ มันยากที่จะพูดในตอนนี้ - person Cade Roux; 10.09.2011

ฉันอยากจะแนะนำไม่ให้สร้างฐานข้อมูลโดยทางโปรแกรม ดังที่คุณกล่าวไว้ - ด้วย SMO เวอร์ชันต่างๆ สิ่งนี้จะกลายเป็นฝันร้ายเล็กน้อย

แนวทางของฉันจะเป็นดังนี้:

  • ด้วยการติดตั้งของคุณ ให้จัดส่งฐานข้อมูลว่าง "เริ่มต้น" ที่มีโครงสร้างพื้นฐานของคุณ (ตารางทั้งหมดของคุณและทุกอย่าง) และอาจมีข้อมูลการค้นหาพื้นฐานบางอย่างในบางตาราง

  • เมื่อผู้ใช้ระบุว่าเขาไม่มีฐานข้อมูลที่มีอยู่สำหรับแอปพลิเคชันของคุณ ให้คัดลอกไฟล์ MDF/LDF/และอาจเป็นไฟล์ NDF ไปยังตำแหน่งข้อมูล SQL Server

  • แนบไฟล์ฐานข้อมูลเหล่านั้นโดยทางโปรแกรมกับอินสแตนซ์ SQL Server

นั่นดูเหมือนจะเป็นวิธีที่สะอาดกว่าและยืดหยุ่นกว่า

person marc_s    schedule 09.09.2011
comment
ฉันไม่รู้ (ตอนนี้) วิธีแนบไฟล์ mdf และ ldf ไปยัง SQL Server โดยทางโปรแกรม โดยทางโปรแกรมคุณหมายถึงจากโปรแกรม C # หรือไม่ แต่ถ้าเป็นไปได้ ฉันชอบความคิดนั้น แต่การแนบไฟล์เหล่านี้ผู้ใช้ควรผ่านการเข้าสู่ระบบและรหัสผ่านไปยังโปรแกรม (หรือโหมดการตรวจสอบสิทธิ์) ใช่ไหม? - person Marshall; 09.09.2011
comment
@Marshall: ใช่ - แน่นอน - โดยทางโปรแกรมโดยการออกคำสั่ง T-SQL ปกติ - ดู msdn.microsoft.com/en-us/library/ms165673.aspx สำหรับรายละเอียดเพิ่มเติม! - person marc_s; 09.09.2011
comment
ฉันต้องเชื่อมต่อกับฐานข้อมูลหลัก คุณคิดว่าการแนบไฟล์ mdf ดีกว่าการรันการสร้างสคริปต์หรือไม่ เพราะเหตุใด ข้อดีและข้อเสียของโซลูชันเหล่านี้คืออะไร - person Marshall; 09.09.2011
comment
@Marshall: ATTACH มักจะเร็วกว่ามากและต้องการเพียงสองไฟล์ (MDF/LDF) การสร้างฐานข้อมูลทั้งหมดจากสคริปต์นั้นยุ่งยากเล็กน้อย - สคริปต์ใช้งานได้ดีในการอัปเดตฐานข้อมูลของคุณโดยมีการเปลี่ยนแปลงเมื่อมีอยู่แล้ว - person marc_s; 09.09.2011
comment
ใช่คุณพูดถูก แต่การใช้สคริปต์ผู้ใช้สามารถกำหนดขนาด โหมดการกู้คืน หรือชื่อได้.. แต่จะช้าลง ฉันคิดว่าใช้ทั้งสองวิธี ผู้ใช้จะมีทางเลือกคือ สร้างฐานข้อมูลเร็วขึ้น หรือสร้างแบบกำหนดเอง ขอบคุณที่ช่วยเหลือ - person Marshall; 09.09.2011

การสร้างฐานข้อมูลอาจไม่จำเป็นต้องเป็นส่วนหนึ่งของโค้ดของคุณ โดยเฉพาะอย่างยิ่งหากคุณต้องการสร้างฐานข้อมูลเพียงครั้งเดียว ฉันแนะนำวิธีการที่คุณสร้างตัวติดตั้งโดยใช้ Windows Installer หรือ Inno Setup (ฉันชอบ Inno Setup) ด้วยโปรแกรมติดตั้ง คุณสามารถแจ้งให้ผู้ใช้ระบุชื่อเซิร์ฟเวอร์ SQL และข้อมูลรับรองการเข้าสู่ระบบสำหรับผู้ใช้ที่เป็นผู้ดูแลระบบได้ จากนั้นคุณสามารถใช้สิ่งเหล่านั้นเพื่อเรียกใช้สคริปต์ SQL ที่มีคำสั่ง CREATE DATABASE และ CREATE TABLE ของคุณ ฯลฯ หวังว่านี่จะช่วยได้

person Christian Correa    schedule 09.09.2011
comment
ฉันไม่รู้ว่าฉันไม่เข้าใจอย่างถูกต้องหรือไม่ คุณแนะนำให้ถามผู้ใช้เกี่ยวกับชื่อเซิร์ฟเวอร์ การรับรองความถูกต้อง และการเข้าสู่ระบบ (ในกรณีของการรับรองความถูกต้องของเซิร์ฟเวอร์ SQL) และรหัสผ่าน จากนั้นสร้างสตริงการเชื่อมต่อกับฐานข้อมูลหลัก ใช้ master เพื่อสร้างฐานข้อมูล ตาราง ฯลฯ ใช่ไหม? - person Marshall; 09.09.2011
comment
ให้ฉันชี้แจง. สิ่งที่ฉันแนะนำคือคุณไม่ต้องดำเนินการดูแลฐานข้อมูลเริ่มต้นโดยทางโปรแกรมในโค้ด C# ของคุณ นานมาแล้ว ฉันได้สร้างตัวติดตั้งโดยใช้ตัวติดตั้ง Windows ที่จะเรียกใช้ยูทิลิตีบรรทัดคำสั่งของเซิร์ฟเวอร์ SQL พร้อมด้วยอาร์กิวเมนต์ทั้งหมดที่ต้องการ: ชื่อเซิร์ฟเวอร์ รหัสผ่าน sa ชื่อฐานข้อมูล และเส้นทางไปยังไฟล์สคริปต์ SQL ของคุณที่มีคำสั่งการสร้างฐานข้อมูล/ตาราง - person Christian Correa; 09.09.2011