从本地SQL Server数据库检索数据的最直接方法是什么?

时间:2014-01-23 17:24:12

标签: c# sql-server tsql database-connection adventureworks

我不需要/想要任何安全措施(用户名/密码等) - 我只想创建一个从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类的实例填充通用列表。

4 个答案:

答案 0 :(得分:1)

您只需设置Integrated Security = True:

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

答案 1 :(得分:1)

您需要更新连接字符串以使用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"/>

此外,您需要使用SqlConnectionSqlCommandSqlDataReader代替OleDbConnectionOleDbCommandOleDbDataReader

答案 2 :(得分:1)

当然,如果您想继续使用OleDbConnection,那么您只需更改连接字符串和查询即可。话虽这么说,最好使用ADO Sql Server Native Client。我相信Ole DB对Sql Server的支持已被弃用,2012年将是正式支持它的最后一个版本:

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

答案 3 :(得分:1)

我更喜欢这样做的方法是创建一个接受IDataReader的方法,并让它进行DataMapping / Serialization / Hydrating。

允许在代码外部创建IDataReader(Jet或Sql Server或其他),然后重用。

我也不喜欢“0”,“1”等。 这是我典型的IDataReader / DataMapper代码。 (请参阅本文稍后的更大代码块)

就您的原始问题而言,大多数数据类型都会匹配。 但是,我记得在Jet和SqlServer之间有几次,数据类型略有偏差。

解决方法是使用GetValue(),然后使用它。

而不是:

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

最终是这样的:

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

同样,我正在测试针对OleDB(Jet / Access)和Sql Server创建的IDataReader。我想我正在测试pubs数据库,包括Jet(Access)版本和相应的Sql Server版本。 大部分时间都很好。但有一段时间我不得不调整并使用较少的“特定”“GetValue()”方法,而不是具体的getter(例如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
                {
                }
            }
        }
    }