0

我不需要/不想要任何安全措施(用户名/密码等) - 我只想创建一个从 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

4 回答 4

1

您只需要设置 Integrated Security=True :

myConn = New SqlConnection("Initial Catalog=xxx.; Data Source=xxx;  Integrated Security=True")
于 2014-01-23T17:33:47.817 回答
1

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

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

我也不喜欢“0”、“1”等。这是我典型的 IDataReader/DataMapper 代码。(在这篇文章后面看到更大的代码块)

就您最初的问题而言,大多数 DataTypes 都会匹配。但是,我记得有几次在 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 版本。大多数时候都很好。但是有时我不得不在具体的 getter (例如 GetDecimal() )上调整并使用不太“具体”的“GetValue()”方法。

[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
                {
                }
            }
        }
    }
于 2014-01-23T19:15:51.093 回答
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"/>

此外,您需要使用SqlConnection,SqlCommandSqlDataReader而不是OleDbConnection, OleDbCommand, and OleDbDataReader

于 2014-01-23T17:36:33.517 回答
1

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

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

于 2014-01-23T17:39:29.130 回答