我有一个使用EF6的应用程序。我需要执行存储过程,所以我执行以下操作:
using (SqlConnection conn = new SqlConnection(context.Database.Connection.ConnectionString))
{
SqlCommand cmd = new SqlCommand("dbo.ExampleStoredProcedure", conn)
{
CommandType = CommandType.StoredProcedure
};
cmd.Parameters.Add(new SqlParameter("@param1", "parameterValue"));
SqlDataAdapter da = new SqlDataAdapter { SelectCommand = cmd };
durations = new DataSet();
da.Fill(durations);
}
来自Web.config的我的连接字符串是:
<add name="MyEntities" connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider connection string="data source=MyServer\DEV;initial catalog=MyApp;User Id=UserId;Password=password123;Application Name=Connection Secured;integrated security=false;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
当上面的代码运行时,我得到一个例外:
Login failed for user 'UserId'.
该异常还包含SQL错误代码: 18456 。 我确认用户可以通过使用此SQL帐户登录SQL Server并运行相关存储过程来完全访问此SQL服务器,数据库,实例和存储过程。
我也尝试过定义一个新的SqlConnection对象:
SqlConnection newCon = new SqlConnection("Server=MyServer\\DEV;Database=MyApp;User Id=UserId;Password = password123;");
并对它执行存储过程 - 这次工作。所以我确实有一个解决方法,但是想使用context.Database.Connection.ConnectionString对象来避免在web.config文件中有多个连接字符串。
有什么建议吗?
答案 0 :(得分:0)
出于安全考虑,此行为是出于设计原因this回答了建议的问题。我补充道
<section class="section_one">
<ng-container *ngIf="!someCondition; else someTemplate">
</ng-container>
</section>
...
<section class="section_two">
<ng-container *ngIf="someCondition; else someTemplate">
</ng-container>
</section>
...
<ng-template #someTemplate>
...
</ng-template>
到实体框架在web.config文件中生成的连接字符串,我能够重用 context.Database.Connection.ConnectionString 来使用ADO执行存储过程。
答案 1 :(得分:0)
您不需要(也不应该)为此打开单独的连接。您可以使用DbContext使用的相同连接。
只需打开连接(在处理DbContext时它将关闭)并将其强制转换为SqlConnection。例如
db.Database.Connection.Open();
var con = (SqlConnection)db.Database.Connection;