2010-02-27 39 views
5

Mục đích là xử lý dữ liệu của người dùng (bạn có thể gọi chúng là dự án, tài liệu, tệp hoặc bất kỳ thứ gì) trong cơ sở dữ liệu SQL Server 2008 Express hoàn toàn mới. Các dữ liệu được dự kiến ​​sẽ chiếm không gian ít hơn nhiều so với 4GB có sẵn với các phiên bản thể hiện (mà cũng là miễn phí để phân phối).Thực hành tốt nhất để tạo (theo yêu cầu) Cơ sở dữ liệu SQL Server 2008 Express trong C#?

Ví dụ: mỗi lần người dùng chọn Tệp-> Lệnh mới, cơ sở dữ liệu trống mới sẽ được tạo tại vị trí được chỉ định. Mặt khác, một lệnh tương tự, File-> Open phải cung cấp hỗ trợ để lấy danh sách các cơ sở dữ liệu để chọn một để mở.

Vì vậy, các vấn đề sau phải được giải quyết: a) Ứng dụng phải có khả năng tạo chuỗi kết nối và đính kèm cơ sở dữ liệu vào SQL Server 2008 Express qua mã (C#) b) Ứng dụng phải có khả năng truy xuất (một lần nữa thông qua mã) một danh sách với tất cả các cơ sở dữ liệu có sẵn, để cung cấp cho người dùng một cơ hội để chọn một để mở.

Tôi nghĩ sẽ hữu ích khi có cơ sở dữ liệu mẫu trong tài nguyên và sao chép nó ở vị trí được chỉ định bởi người dùng.

Bạn có nghĩ rằng đó là giải pháp hoạt động không? Bạn có đề nghị nào không?

+0

Cảm ơn tất cả các bạn đã trả lời. Thật tuyệt khi biết rằng cũng có các tùy chọn khác, nhưng thành thật mà nói, tôi sẽ đánh giá cao một số suy nghĩ cụ thể liên quan đến SQL Server 2008 Express. @ Robert, tôi nghĩ rằng bạn là đúng, và bên cạnh đó, lý do tôi đang nghĩ đến việc sử dụng giải pháp này, chủ yếu là do khả năng mở rộng. Tại một số điểm trong tương lai, tôi sẽ sử dụng phiên bản SQL Server "đầy đủ". @thekaido, trường hợp người dùng là những gì tôi đã có trong tâm trí vào lúc này. Điều phiền toái của tôi là tôi sẽ viết mã đính kèm như thế nào, ví dụ, của cơ sở dữ liệu đến SQL Server từ ứng dụng winforms của tôi. Bất kỳ đề xuất nào? – ileon

Trả lời

16

Có rất nhiều bạn có thể làm với Sql Server Management Objects (SMO):

// Add a reference to Microsoft.SqlServer.Smo 
// Add a reference to Microsoft.SqlServer.ConnectionInfo 
// Add a reference to Microsoft.SqlServer.SqlEnum 

using Microsoft.SqlServer.Management.Smo; 
using System.Collections.Generic; 
using System.Collections.Specialized; 
using System.Data; 

public class SqlServerController 
{ 

    private Server m_server = null; 

    public SqlServerController(string server) 
    { 
     m_server = new Server(server); 
    } 

    public void AttachDatabase(string database, StringCollection files, 
     AttachOptions options) 
    { 
     m_server.AttachDatabase(database, files, options); 
    } 

    public void AddBackupDevice(string name) 
    { 
     BackupDevice device = new BackupDevice(m_server, name); 
     m_server.BackupDevices.Add(device); 
    } 

    public string GetServerVersion(string serverName) 
    { 
     return m_server.PingSqlServerVersion(serverName).ToString(); 
    } 

    public int CountActiveConnections(string database) 
    { 
     return m_server.GetActiveDBConnectionCount(database); 
    } 

    public void DeleteDatabase(string database) 
    { 
     m_server.KillDatabase(database); 
    } 

    public void DetachDatabase(string database, bool updateStatistics, 
     bool removeFullTextIndex) 
    { 
     m_server.DetachDatabase(database, updateStatistics, removeFullTextIndex); 
    } 

    public void CreateDatabase(string database) 
    { 
     Database db = new Database(m_server, database); 
     db.Create(); 
    } 

    public void CreateTable(string database, string table, 
     List<Column> columnList, List<Index> indexList) 
    { 
     Database db = m_server.Databases[database]; 
     Table newTable = new Table(db, table); 

     foreach (Column column in columnList) 
      newTable.Columns.Add(column); 

     if (indexList != null) 
     { 
      foreach (Index index in indexList) 
       newTable.Indexes.Add(index); 
     } 

     newTable.Create(); 

    } 

    public Column CreateColumn(string name, DataType type, string @default, 
     bool isIdentity, bool nullable) 
    { 
     Column column = new Column(); 

     column.DataType = type; 
     column.Default = @default; 
     column.Identity = isIdentity; 
     column.Nullable = nullable; 

     return column; 
    } 

    public Index CreateIndex(string name, bool isClustered, IndexKeyType type, 
     string[] columnNameList) 
    { 

     Index index = new Index(); 

     index.Name = name; 
     index.IndexKeyType = type; 
     index.IsClustered = isClustered; 

     foreach (string columnName in columnNameList) 
      index.IndexedColumns.Add(new IndexedColumn(index, columnName)); 

     return index; 
    } 

} 
+1

Chà, điều này chỉ làm cho ngày của tôi. Mọi người khác đang cố thuyết phục người yêu cầu tìm cách giải quyết giải pháp này và bạn chỉ tình cờ đến và trả lời trong một danh sách ngắn gọn, gọn gàng, súc tích. Xin chúc mừng, thưa ngài, bạn đã thắng được bài viết của tôi. –

1

Giải pháp thay thế là sử dụng SQLite thay vì SQL Express. Bạn thậm chí có thể tiếp tục sử dụng ADO.NET nếu bạn sử dụng this solution. Cơ sở dữ liệu SQLite là các tệp đơn giản và chuỗi kết nối của bạn có thể tham chiếu đến đường dẫn tệp. Khi người dùng muốn mở tệp của họ, họ có thể chọn tệp thực.

1

Tôi nhận được ấn tượng rằng cơ sở dữ liệu này sẽ sống cục bộ trên máy của người dùng. Nếu đó là trường hợp, máy chủ sql express thường không phải là một lựa chọn cơ sở dữ liệu tốt. Đó là một công cụ cấp máy chủ hơn là một máy tính để bàn hoặc trong quá trình động cơ. Thay vào đó, có một số tốt trong công cụ xử lý bạn có thể sử dụng: Sql Server Compact Edition, Sqlite (như đã đề cập bởi Jacob) hoặc thậm chí là Access.

+1

Cơ sở dữ liệu SQL Server là hai tệp (.MDF và .LDF). Nếu bạn có thể quản lý việc đính kèm và tách các cơ sở dữ liệu một cách tao nhã, tôi không thấy bất kỳ lý do gì tại sao SQL Server Express không thể được sử dụng. http://msdn.microsoft.com/en-us/library/ms190794.aspx –

+0

@Robert: Cơ sở dữ liệu máy chủ sql cũng là công cụ chạy như một dịch vụ trên máy. –

+0

Chỉ cần miễn là bạn tránh truy cập, bạn đang đi trước trò chơi. –

1

Nếu bạn tin rằng SQL Server Express 2008 là lựa chọn đúng (mặc dù sqllite có vẻ phù hợp hơn), tôi sẽ xem xét sử dụng User Instances để cho phép người quản trị không thêm cơ sở dữ liệu từ tệp như bạn mô tả.

1

Bài viết này cho thấy làm thế nào để tạo ra một cơ sở dữ liệu mới, và gắn nó vào một trường hợp SQL cơ sở dữ liệu Server:

Làm thế nào để: Đính kèm một tập tin cơ sở dữ liệu SQL Server Express
http://msdn.microsoft.com/en-us/library/ms165673.aspx

Những bài viết cho thấy cách quản lý việc đính kèm và tách các cơ sở dữ liệu hiện có: http://msdn.microsoft.com/en-us/library/ms190794.aspx

http://www.databasejournal.com/features/mssql/article.php/2224361/Attaching-and-Detaching-Databases-on-SQL-Server.htm

+1

Bạn có thể cho tôi gợi ý về cách thực hiện điều này trong mã C# từ biểu mẫu cửa sổ (ví dụ: sử dụng ADO.NET) không? Cảm ơn bạn. – ileon

+1

Bạn phải thực hiện các thủ tục được lưu trữ để tạo, đính kèm và tách cơ sở dữ liệu. Để làm điều này trong C#, bạn sẽ mở một đối tượng SqlConnection với một chuỗi kết nối thích hợp, tạo một đối tượng SqlCommand truyền đối tượng SqlConnection và tên của thủ tục được lưu trữ gắn hoặc tách cơ sở dữ liệu, thêm một số đối tượng tham số vào đối tượng SqlCommand và thực thi SqlCommand bằng ExecuteNonQuery(). Một ví dụ hoàn chỉnh là ở đây, khoảng một nửa xuống trang: http://www.c-sharpcorner.com/UploadFile/dclark/InsOutsinCS11302005072332AM/InsOutsinCS.aspx –

+0

Cảm ơn bạn Robert. Bạn đã hữu ích nhất. – ileon

0

Đối với chuỗi kết nối sau đây cho SQL Server 2008 R2.

<connectionstring>Data Source=.\SQLEXPRESS;Initial Catalog=MyDatabase;Integrated Security=True;Pooling=True</connectionstring> 

bạn có thể làm

var connectionString = new SqlConnectionStringBuilder(connectionString); 

    var serverConnection = new ServerConnection("DatabaseInstanceName in server"); 

    var serverInstance = new Server(serverConnection); 

    if (serverInstance.Databases.Contains(connectionString.InitialCatalog)) 
     serverInstance.KillDatabase(connectionString.InitialCatalog); 

    var db = new Database(serverInstance, connectionString.InitialCatalog); 

    try 
    { 
    db.Create(); 
    } 
    catch (SqlException ex) 
    { 
    throw; 
    } 

Nhờ Ông Harvey đã chỉ đúng hướng. Mặc dù trong trường hợp của tôi, tôi phải thực hiện những thay đổi nhỏ này.Bởi vì, tôi sử dụng xác thực cửa sổ.

Các vấn đề liên quan