简体   繁体   English

当我不在ASP应用程序中使用该提供程序时出现“对OLE DB提供程序的临时访问”错误

[英]Error with “ad hoc access to OLE DB provider” when I'm not using that provider in ASP application

I have an ASP.net app, and I'm using the following connection string: 我有一个ASP.net应用程序,并且正在使用以下连接字符串:

<configuration>
<connectionStrings>
    <add name="CAF" connectionString="Data Source=pxx-sql2;Initial Catalog=mydb;User ID=DBUser;Password=mypass;Persist Security Info=False;Trusted_Connection=False;"  providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>

When I read in the application, everything works. 当我阅读应用程序时,一切正常。 But when I write, I'm getting this error: "Ad hoc access to OLE DB provider 'ADSDSOObject' has been denied. You must access this provider through a linked server." 但是,当我写这篇文章时,我得到了这个错误:“对OLE DB提供程序'ADSDSOObject'的临时访问已被拒绝。您必须通过链接服务器访问此提供程序。”

The stack trace provided: 提供的堆栈跟踪:

[SqlException (0x80131904): Ad hoc access to OLE DB provider 'ADSDSOObject' has been denied. You must access this provider through a linked server.]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +404
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +412
   System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +1363
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +6387805
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +6389506
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +538
   System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) +689
   System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +327
   MyDBData.Reconcile(HttpRequest req, User u, String assignee) in c:\websites\MyDB\App_Code\MyDBDataReconciler.cs:99

[Exception: Ad hoc access to OLE DB provider 'ADSDSOObject' has been denied. You must access this provider through a linked server.]
   MyDBData.Reconcile(HttpRequest req, User u, String assignee) in c:\websites\MyDB\App_Code\MyDBDataReconciler.cs:112
   EntryEditView.Page_Load(Object sender, EventArgs e) in c:\websites\MyDB\EntryEditView.aspx.cs:50
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +25
   BasePage.OnLoad(EventArgs e) in c:\websites\MyDB\App_Code\BasePage.cs:19
   System.Web.UI.Control.LoadRecursive() +71
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3064

Except I don't think I'm using an "ADSDSOObject" anywhere in this project. 除了我不认为我在该项目的任何地方都使用“ ADSDSOObject”。 I'm opening up a connection with a standard SqlData handle. 我正在使用标准SqlData句柄打开连接。

What's really weird is that this is the fourth insert of four, and it's the last ExecuteNonQuery (on an insert) before I commit the transaction. 真正奇怪的是,这是四个的第四个插入,并且是我提交事务之前的最后一个ExecuteNonQuery (在插入上)。

This is the function in its entirety. 这是整个功能。

public void Reconcile(HttpRequest req, User u, string assignee)
{
    SqlConnection conn = new SqlConnection(Config.ConnString);
    conn.Open();
    SqlTransaction transaction = conn.BeginTransaction("UpdateMyDB");

    this.master.MyDBMasterID = int.Parse(req.Params["MyDB"]);
    MyDBLayout MyDBL = new MyDBLayout(this.master.MyDBMasterID);
    this.master.bexMasterID = int.Parse(req.Params["bex"]);
    MyDBLayout bexL = null;
    if (this.master.bexMasterID > 0)
        bexL = new MyDBLayout(this.master.bexMasterID);
    SqlCommand cmd = new SqlCommand();
    cmd.Transaction = transaction;
    cmd.Connection = conn;

    try
    {
        int bexForm;
        if (this.MyDBID == -1)
        {
            // Create the blank MyDB
            cmd.CommandText = @"
                insert into MyDB_Master(created, branch, client, clientName, submitter, specialist, MyDBDate, MyDBMasterID, bexMasterID)
                    values (getdate(), '', '', '', @submitter, '', getdate(), @MyDBMasterID, @bexMasterID); select @@IDENTITY";
            cmd.Parameters.AddWithValue("@MyDBMasterID", req.Params["MyDB"].Trim());
            cmd.Parameters.AddWithValue("@submitter", u.LoginName);
            bexForm = int.Parse(req.Params["bex"].Trim());
            if (bexForm != -1)
                cmd.Parameters.AddWithValue("@bexMasterID", bexForm);
            else
                cmd.Parameters.AddWithValue("@bexMasterID", DBNull.Value);
            MyDBID = (int)((decimal)cmd.ExecuteScalar());
        }
        // Populate the master
        cmd.CommandText = @"
                update MyDB_MASTER set branch = @branch, client = @client, clientName = @clientName,
                    specialist = @specialist, MyDBDate = @MyDBDate,
                    MyDBMasterID = @MyDBMasterID, bexMasterID = @bexMasterID, payDate = @MyDBPayDate, method = @method
                where MyDBID = @MyDBID;";
        cmd.Parameters.Clear();
        cmd.Parameters.AddWithValue("@MyDBID", MyDBID);
        cmd.Parameters.AddWithValue("@branch", req.Params["MyDBBranch"].Trim());
        cmd.Parameters.AddWithValue("@client", req.Params["MyDBClient"].Trim());
        cmd.Parameters.AddWithValue("@clientName", req.Params["MyDBName"].Trim());
        cmd.Parameters.AddWithValue("@specialist", req.Params["MyDBSpecialist"].Trim());
        cmd.Parameters.AddWithValue("@method", req.Params["MyDBMethod"].Trim());

        DateTime MyDBDate = DateTime.MinValue;
        if (DateTime.TryParseExact(req.Params["MyDBDate"], "MM/dd/yyyy", enUS, DateTimeStyles.AllowWhiteSpaces, out MyDBDate))
            cmd.Parameters.AddWithValue("@MyDBDate", MyDBDate);
        else
            cmd.Parameters.AddWithValue("@MyDBDate", DateTime.Now);

        DateTime MyDBPayDate = DateTime.MinValue;
        if (DateTime.TryParseExact(req.Params["MyDBPayDate"], "MM/dd/yyyy", enUS, DateTimeStyles.AllowWhiteSpaces, out MyDBPayDate))
            cmd.Parameters.AddWithValue("@MyDBPayDate", MyDBPayDate);
        else
            cmd.Parameters.AddWithValue("@MyDBPayDate", DBNull.Value);

        cmd.Parameters.AddWithValue("@MyDBMasterID", req.Params["MyDB"].Trim());
        bexForm = int.Parse(req.Params["bex"].Trim());
        if (bexForm != -1)
            cmd.Parameters.AddWithValue("@bexMasterID", bexForm);
        else
            cmd.Parameters.AddWithValue("@bexMasterID", DBNull.Value);
        cmd.ExecuteNonQuery();

        // Remove old detail
        cmd.Parameters.Clear();
        cmd.CommandText = @"delete from MyDB_detail where MyDBID = @MyDBID";
        cmd.Parameters.AddWithValue("@MyDBID", MyDBID);
        cmd.ExecuteNonQuery();

        FixNotes(MyDBID, req, cmd);

        AddDetail(MyDBID, MyDBL, req, cmd);
        if ( bexL != null )
            AddDetail(MyDBID, bexL, req, cmd);

        cmd.Parameters.Clear(); 
        cmd.CommandText = @"insert into MyDB_history (MyDBID, alteredBy, assignedTo, status) values (@MyDBID, @alteredBy, @assignedTo, @status)";
        cmd.Parameters.AddWithValue("@MyDBID", MyDBID);
        cmd.Parameters.AddWithValue("@alteredBy", u.LoginName);
        cmd.Parameters.AddWithValue("@assignedTo", assignee);
        cmd.Parameters.AddWithValue("@status", req.Params["MyDBStatus"]);
        this.master.assignedTo = assignee;
        cmd.ExecuteNonQuery();     // <--- Fails here.

        transaction.Commit();
    }
    catch (System.Exception e)
    {
        try
        {
            transaction.Rollback();
        }
        catch { }
        throw new Exception(e.Message, e);
    }
}

What could be causing this particular error? 是什么导致此特定错误?

ADSDSOObject is used to query an Active Directory. ADSDSOObject用于查询Active Directory。

The error seems to be generated in SQL-server and not in your application. 该错误似乎是在SQL服务器而不是您的应用程序中生成的。 I suspect that there could be a constraint or trigger that validates the passed LoginName (@alteredBy) or assignee (@assignedTo) using ADSDSOObject against Active Directory. 我怀疑可能存在约束或触发器,该约束或触发器使用针对Active Directory的ADSDSOObject来验证传递的LoginName(@alteredBy)或受让人(@assignedTo)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 ASP经典应用使用Azure SQL服务器时,Microsoft OLE DB Provider for ODBC Drivers错误&#39;80004005&#39; - Microsoft OLE DB Provider for ODBC Drivers error '80004005' when asp classic app use azure sql server Microsoft Office 12.0 Access 数据库引擎 OLE DB 提供程序 - Microsoft Office 12.0 Access database engine OLE DB Provider 如何获得提供者名称以打开Ole DB连接? - How do I get provider name to open Ole DB connection? 如何使用 VFP OLE DB 提供程序关闭表 - How to close a table with the VFP OLE DB Provider 未在ConnectionString中指定OLE DB提供程序。 &#39;Provider = SQLOLEDB; - An OLE DB Provider was not specified in the ConnectionString. 'Provider=SQLOLEDB; 未在ConnectionString中指定OLE DB提供程序。 例如,“ Provider = SQLOLEDB;” - An OLE DB Provider was not specified in the ConnectionString. An example would be, 'Provider=SQLOLEDB;' 未在ConnectionString中指定OLE DB提供程序。 &#39;提供者= SQLOLEDB - An OLE DB Provider was not specified in the ConnectionString. 'Provider=SQLOLEDB 如何解决OLE DB访问接口Microsoft ACE OLEDB 12.0对于链接服务器(空)的错误? - How to resolve OLE DB provider Microsoft ACE OLEDB 12.0 for linked server (null) error? DBF文件的备注字段仅使用VFP OLE DB Provider for .NET返回一些字符 - Memo field from DBF file only returns a few characters using VFP OLE DB Provider for .NET 无法使用Ole Db提供程序通过C#查找postgres数据库 - Can't find postgres database through C# using Ole Db provider
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM