Какой самый простой способ получить данные из локальной базы данных SQL Server?

Мне не нужны / не нужны какие-либо меры безопасности (имя пользователя / пароль и т. Д.). Я просто хочу создать простой пример извлечения данных из базы данных AdventureWorks «Lite» (AdventureWorksLT2012_Data.mdf), сохраняя эти данные в общем списке ,

У меня есть следующий код для запроса базы данных MS Access. Будет ли это в основном тем же, за исключением строки подключения и запроса?

public SQLServerPOCRepository() { using (var conn = new OleDbConnection( @"Provider=Microsoft.ACE.OLEDB.12.0;User ID=User;Password=Pass;Data Source=C:\SWin\DATA\SDAT42.MDB;Jet OLEDB:System database=C:\SWin\Data\wgeg.mdw")) { using (var cmd = conn.CreateCommand()) { cmd.CommandText = "SELECT td_duckbill_accounts.dept_no, IIF(ISNULL(t_accounts.name),'No Name provided',t_accounts.name) AS name FROM t_accounts INNER JOIN td_duckbill_accounts ON t_accounts.account_no = td_duckbill_accounts.account_no ORDER BY td_duckbill_accounts.dept_no"; cmd.CommandType = CommandType.Text; conn.Open(); int i = 1; using (OleDbDataReader oleDbD8aReader = cmd.ExecuteReader()) { while (oleDbD8aReader != null && oleDbD8aReader.Read()) { int duckbillNum = oleDbD8aReader.GetInt16(0); string duckbillName = oleDbD8aReader.GetString(1); Add(new Platypus { Id = i, dbillNum = duckbillNum, Name = duckbillName }); i++; } } } } } 

Метод Add() заполняет общий список экземпляром класса Platypus .

Вам необходимо обновить строку подключения, чтобы использовать поставщик System.Data.SqlClient вместе с Integrated Security .

 <add name="AdvWorksLT_ConnectionString" connectionString="AttachDBFilename=C:\MyApplication\AdventureWorks.MDF;Integrated Security=True;User Instance=true" providerName="System.Data.SqlClient"/> 

Кроме того, вам необходимо использовать SqlConnection , SqlCommand и SqlDataReader вместо OleDbConnection , OleDbCommand и OleDbDataReader .

Вам просто нужно установить Integrated Security = True:

 myConn = New SqlConnection("Initial Catalog=xxx.; Data Source=xxx; Integrated Security=True") 

Конечно, если вы хотите продолжить использование OleDbConnection, вы можете просто изменить строку подключения и запрос. При этом лучше использовать собственный клиент ADO Sql Server. Я считаю, что поддержка Ole DB для Sql Server устарела, и 2012 год будет последней версией, которая официально ее поддерживает:

http://technet.microsoft.com/en-us/library/ms130978.aspx

Способ, которым я предпочитаю это сделать, – создать метод, который принимает IDataReader, и пусть это сделает DataMapping / Serialization / Hydrating.

Это позволяет создавать IDataReader вне кода (Jet или Sql Server или другое), а затем повторно использовать.

Мне также не нравятся «0», «1» и т. Д. Вот мой типичный код IDataReader / DataMapper. (См. Более крупный блок кода позже в этом сообщении)

Что касается вашего оригинального вопроса, большинство DataTypes будут совпадать. Тем не менее, я помню несколько раз между Jet и SqlServer, типы данных были слегка отключены.

Обходным путем было использование GetValue () и его бросок.

Вместо этого:

 decimal pubPrice = dataReader.GetDecimal(Layout.COLUMN0); 

В итоге получилось так:

 decimal pubPrice = Convert.ToDecimal (accessDataReader.GetValue (Layout.COLUMN0)); 

Опять же, я тестировал против IDataReader, созданного против OleDB (Jet / Access) и Sql Server. Я думаю, что я тестировал базу данных pubs, как версию Jet (Access), так и соответствующую версию Sql Server. В большинстве случаев все было в порядке. Но время от времени мне приходилось настраивать и использовать менее «конкретный» метод GetValue () для конкретного получателя (например, GetDecimal ()).

 [Serializable] public partial class Employee { public int EmployeeKey { get; set; } public string LastName { get; set; } public string FirstName { get; set; } public DateTime HireDate { get; set; } } [Serializable] public class EmployeeCollection : List<Employee> { } internal static class EmployeeSearchResultsLayouts { public static readonly int EMPLOYEE_KEY = 0; public static readonly int LAST_NAME = 1; public static readonly int FIRST_NAME = 2; public static readonly int HIRE_DATE = 3; } public EmployeeCollection SerializeEmployeeSearchForCollection(IDataReader dataReader) { Employee item = new Employee(); EmployeeCollection returnCollection = new EmployeeCollection(); try { int fc = dataReader.FieldCount;//just an FYI value int counter = 0;//just an fyi of the number of rows while (dataReader.Read()) { if (!(dataReader.IsDBNull(EmployeeSearchResultsLayouts.EMPLOYEE_KEY))) { item = new Employee() { EmployeeKey = dataReader.GetInt32(EmployeeSearchResultsLayouts.EMPLOYEE_KEY) }; if (!(dataReader.IsDBNull(EmployeeSearchResultsLayouts.LAST_NAME))) { item.LastName = dataReader.GetString(EmployeeSearchResultsLayouts.LAST_NAME); } if (!(dataReader.IsDBNull(EmployeeSearchResultsLayouts.FIRST_NAME))) { item.FirstName = dataReader.GetString(EmployeeSearchResultsLayouts.FIRST_NAME); } if (!(dataReader.IsDBNull(EmployeeSearchResultsLayouts.HIRE_DATE))) { item.HireDate = dataReader.GetDateTime(EmployeeSearchResultsLayouts.HIRE_DATE); } returnCollection.Add(item); } counter++; } return returnCollection; } //no catch here... see http://blogs.msdn.com/brada/archive/2004/12/03/274718.aspx finally { if (!((dataReader == null))) { try { dataReader.Close(); } catch { } } } } 
Давайте будем гением компьютера.