我不需要/想要任何安全措施(用户名/密码等) - 我只想创建一个从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
类的实例填充通用列表。
答案 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"/>
此外,您需要使用SqlConnection
,SqlCommand
和SqlDataReader
代替OleDbConnection
,OleDbCommand
和OleDbDataReader
。
答案 2 :(得分:1)
当然,如果您想继续使用OleDbConnection,那么您只需更改连接字符串和查询即可。话虽这么说,最好使用ADO Sql Server Native Client。我相信Ole DB对Sql Server的支持已被弃用,2012年将是正式支持它的最后一个版本:
答案 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
{
}
}
}
}