我创建了以下存储库文件
using Dapper;
using System.Configuration;
namespace ProjectName.Repository
{
public class SMRTRepository : IDashboard
{
public SqlConnection con;
//To Handle connection related activities
private void connection()
{
string constr = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
con = new SqlConnection(constr);
}
.........
}
}
然后在该项目中创建了一个App.Config文件来定义连接字符串,
的App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="ConnectionString" connectionString="Data Source=USER-PC;Initial Catalog=DBNAME;User ID=sa;Password=****;Integrated Security=True;" providerName="System.Data.sqlclient"/>
</connectionStrings>
</configuration>
但是当我运行它时,它没有连接到DB,在Visual Studio的服务器资源管理器窗口中,我可以看到连接到DB而没有红色图标的连接字符串
我的做法有什么不对
答案 0 :(得分:2)
您没有指定Integrated Security = True和Sql用户ID。作为集成安全选项行上的explained by MSDN
如果指定了用户ID和密码,则设置了Integrated Security 如果为true,则将忽略用户ID和密码并进行集成 将使用安全性。
这意味着您必须在安装Sql Server时启用Windows集成,并且当前的Windows用户列在该服务器的可接受用户之间。
另一个可能的问题是由于某种错误处理全局连接对象引起的。作为一种良好的做法,最好避免像连接这样的全球一次性对象。
我会把你的班级改为
namespace ProjectName.Repository
{
public class SMRTRepository : IDashboard
{
private SqlConnection OpenConnection()
{
string constr = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
SqlConnection con = new SqlConnection(constr);
con.Open();
return con;
}
....
public IEnumerable<Something>Select(string queryFilter)
{
using (SqlConnection cnn = this.OpenConnection())
{
return cnn.Query<Something>(queryFilter);
}
}
}
}
当然,您也可以将不同类中的两个方法分开,并将第一个方法用作静态方法,该方法为您需要构建的每个其他存储库类提供服务。通过这种方式,周围没有全局对象,并且使用块确保在异常的情况下正确清理一次性对象。
答案 1 :(得分:0)
以下是我的某个项目的示例代码块。它对我来说很好。请参考
using (IDbConnection connection = new SqlConnection(ConnectionString))
{
// Query
string query = "Query";
DynamicParameters dp = new DynamicParameters();
dp.Add("@userName", userName, DbType.AnsiString);
return connection.Query<Model>(query, commandType: CommandType.StoredProcedure, param: dp);
}