Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2016 CLR存储过程错误:“0”;“系统断言检查失败”; 我试图通过C语言组件运行一个本地代码API(C++中的DLL),这样我就可以在SQL Server中的CLR存储过程中使用某些API函数。我试图从C++ DLL中使用的函数访问数据历史记录的原始数据,并返回非托管类型的数据。然后由C#程序集对结果进行封送处理并将结果传送到SQL Server 我没有C++的DLL的源代码,所以我真的不知道引擎盖下面到底是什么(它是第三方)。但是,我可以在C++的控制台应用程序中访问这些API函数而不发布(我依赖于在.NET中包装C++ DLL)。我开发了一个工作正常的C#控制台应用程序,然后将其转换为类库,将类包装在“[Microsoft.SqlServer.Server.SqlProcedure]”中,并以不安全模式将程序集添加到所需的SQL数据库中。我还确保在SQL server中启用了clr,在我使用的数据库中禁用了Trusty_C#_C++_Sql Server_Stored Procedures_Sqlclr - Fatal编程技术网

SQL Server 2016 CLR存储过程错误:“0”;“系统断言检查失败”; 我试图通过C语言组件运行一个本地代码API(C++中的DLL),这样我就可以在SQL Server中的CLR存储过程中使用某些API函数。我试图从C++ DLL中使用的函数访问数据历史记录的原始数据,并返回非托管类型的数据。然后由C#程序集对结果进行封送处理并将结果传送到SQL Server 我没有C++的DLL的源代码,所以我真的不知道引擎盖下面到底是什么(它是第三方)。但是,我可以在C++的控制台应用程序中访问这些API函数而不发布(我依赖于在.NET中包装C++ DLL)。我开发了一个工作正常的C#控制台应用程序,然后将其转换为类库,将类包装在“[Microsoft.SqlServer.Server.SqlProcedure]”中,并以不安全模式将程序集添加到所需的SQL数据库中。我还确保在SQL server中启用了clr,在我使用的数据库中禁用了Trusty

SQL Server 2016 CLR存储过程错误:“0”;“系统断言检查失败”; 我试图通过C语言组件运行一个本地代码API(C++中的DLL),这样我就可以在SQL Server中的CLR存储过程中使用某些API函数。我试图从C++ DLL中使用的函数访问数据历史记录的原始数据,并返回非托管类型的数据。然后由C#程序集对结果进行封送处理并将结果传送到SQL Server 我没有C++的DLL的源代码,所以我真的不知道引擎盖下面到底是什么(它是第三方)。但是,我可以在C++的控制台应用程序中访问这些API函数而不发布(我依赖于在.NET中包装C++ DLL)。我开发了一个工作正常的C#控制台应用程序,然后将其转换为类库,将类包装在“[Microsoft.SqlServer.Server.SqlProcedure]”中,并以不安全模式将程序集添加到所需的SQL数据库中。我还确保在SQL server中启用了clr,在我使用的数据库中禁用了Trusty,c#,c++,sql-server,stored-procedures,sqlclr,C#,C++,Sql Server,Stored Procedures,Sqlclr,但是,当我尝试调用使用C#assembly的存储过程时,会遇到以下问题 Location: AppDomain.cpp:2705 Expression: hr != E_POINTER SPID: 66 Process ID: 3584 Msg 3624, Level 20, State 1, Procedure sp_direct_proficy_api, Line 0 [Batch Start Line 2] A system assertion check has

但是,当我尝试调用使用C#assembly的存储过程时,会遇到以下问题

Location:    AppDomain.cpp:2705
Expression:  hr != E_POINTER
SPID:        66
Process ID:  3584
Msg 3624, Level 20, State 1, Procedure sp_direct_proficy_api, Line 0 [Batch Start Line 2]
A system assertion check has failed. Check the SQL Server error log for details. Typically, an assertion failure is caused by a software bug or data corruption. To check for database corruption, consider running DBCC CHECKDB. If you agreed to send dumps to Microsoft during setup, a mini dump will be sent to Microsoft. An update might be available from Microsoft in the latest Service Pack or in a Hotfix from Technical Support.
Msg 596, Level 21, State 1, Line 2
Cannot continue the execution because the session is in the kill state.
Msg 0, Level 20, State 0, Line 2
A severe error occurred on the current command.  The results, if any, should be discarded.
我在谷歌上搜索了一些系统断言检查,发现它们通常是数据库损坏的结果。我已经运行了DBCC CHECKDB,一切看起来都很好,所以这不是问题所在。我已经复制了伦纳德的例子(从上面的链接),这是我用一个更简单的C++ DLL所做的基本相同的过程。该示例没有发生错误,因此我相信SQL Server和C++ API之间存在AppDebug的竞争。p> 我的问题

这是我试图做的事情的预期问题吗?我不知道SQL Server如何访问计算机内存并在使用CLR存储过程时声明AppDevices,但在SQL Server和C++ API之间似乎存在一些有害的资源竞争。

下面是C汇编程序的两部分(从C++代码中调用C++ DLL,以及由存储过程访问的类)。 C#从C++导入DLL

public class IHUAPI
{
const string DLLNAME = "IHUAPI.dll";

static class IHU64
{

    [DllImport(DLLNAME, CallingConvention = CallingConvention.StdCall, EntryPoint = "ihuConnect@16")]
    public static extern ihuErrorCode ihuConnect(string server, string username, string password, out int serverhandle);

    [DllImport(DLLNAME, CallingConvention = CallingConvention.StdCall, EntryPoint = "ihuReadRawDataByTime")]
    public static extern ihuErrorCode ihuReadRawDataByTime(int serverhandle, string tagname, ref IHU_TIMESTAMP start, ref IHU_TIMESTAMP end, out int numberOfSamples, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4, ArraySubType = UnmanagedType.LPStruct)] out IHU_DATA_SAMPLE[] samples);
}

public static ihuErrorCode ihuConnect(string server, string username, string password, out int serverhandle)
{

        return IHU64.ihuConnect(server, username, password, out serverhandle);
}

public static ihuErrorCode ihuReadRawDataByTime(int serverhandle, string tagname, IHU_TIMESTAMP start, IHU_TIMESTAMP end, out IHU_DATA_SAMPLE[] samples)
{
        int numberOfSamples;
        return IHU64.ihuReadRawDataByTime(serverhandle, tagname, ref start, ref end, out numberOfSamples, out samples);
}
}

<强> C汇编程序用于存储过程中访问C++ API <强> < /p>

[Microsoft.SqlServer.Server.SqlProcedure]
public static void API_Query(string tagname, DateTime start_date, DateTime end_date)
{

    int handle;
    ihuErrorCode result;
    result = IHUAPI.ihuConnect("houmseosprf007", "", "", out handle);
    IHU_DATA_SAMPLE[] values;
    IHU_TIMESTAMP start = new IHU_TIMESTAMP(start_date);
    IHU_TIMESTAMP end = new IHU_TIMESTAMP(end_date);

    ihuErrorCode result_api = IHUAPI.ihuReadRawDataByTime(handle, tagname, start, end, out values);

    SqlMetaData[] md = new SqlMetaData[3];
    md[0] = new SqlMetaData("tagname", SqlDbType.Text);
    md[1] = new SqlMetaData("return_value", SqlDbType.NVarChar, 50);
    md[2] = new SqlMetaData("timestamp", SqlDbType.DateTime);
    SqlDataRecord row = new SqlDataRecord(md);
    SqlContext.Pipe.SendResultsStart(row);

    DateTime p;
    string p2;

    for (int i = 1; i < (values == null ? 0 : values.Length); i++)
    {

        using (IHU_DATA_SAMPLE sample = values[i])
        {
            if (sample.ValueDataType != ihuDataType.Array)
            {
                p = sample.TimeStamp.ToDateTime();
                p2 = sample.ValueObject.ToString();
                row.SetValue(0, tagname);
                row.SetValue(1, p2);

                row.SetValue(2, p);

            }
            else
            {

                p = sample.TimeStamp.ToDateTime();
                ihuArrayValue aValue = (ihuArrayValue)Marshal.PtrToStructure(sample.Value.ArrayPtr, typeof(ihuArrayValue));
                p2 = aValue.GetArrayValue.ToString();
                row.SetValue(0, tagname);
                row.SetValue(1, p2);
                row.SetValue(2, p);


            }
        }

        SqlContext.Pipe.SendResultsRow(row);
    }

    SqlContext.Pipe.SendResultsEnd();
}
[Microsoft.SqlServer.Server.SqlProcedure]
公共静态无效API_查询(字符串标记名、日期时间开始日期、日期时间结束日期)
{
int句柄;
ihuErrorCode结果;
结果=IHUAPI.ihuConnect(“houmseosprf007”,“out handle”);
IHU数据样本[]值;
IHU时间戳开始=新的IHU时间戳(开始日期);
IHU时间戳结束=新的IHU时间戳(结束日期);
ihuErrorCode结果_api=IHUAPI.ihuReadRawDataByTime(句柄、标记名、开始、结束、输出值);
SqlMetaData[]md=新的SqlMetaData[3];
md[0]=新的SqlMetaData(“标记名”,SqlDbType.Text);
md[1]=新的SqlMetaData(“返回值”,SqlDbType.NVarChar,50);
md[2]=新的SqlMetaData(“timestamp”,SqlDbType.DateTime);
SqlDataRecord行=新的SqlDataRecord(md);
SqlContext.Pipe.SendResultsStart(行);
日期时间p;
字符串p2;
对于(int i=1;i<(values==null?0:values.Length);i++)
{
使用(IHU数据样本=值[i])
{
if(sample.ValueDataType!=ihuDataType.Array)
{
p=sample.TimeStamp.ToDateTime();
p2=sample.ValueObject.ToString();
row.SetValue(0,标记名);
行设置值(1,p2);
行设置值(2,p);
}
其他的
{
p=sample.TimeStamp.ToDateTime();
ihuArrayValue aValue=(ihuArrayValue)Marshal.PtrToStructure(sample.Value.ArrayPtr,typeof(ihuArrayValue));
p2=aValue.GetArrayValue.ToString();
row.SetValue(0,标记名);
行设置值(1,p2);
行设置值(2,p);
}
}
SqlContext.Pipe.SendResultsRow(行);
}
SqlContext.Pipe.SendResultsEnd();
}
<> Pers:SQLServer与C++ API之间存在着某种有害的资源竞争。 对。您不应该真正使用SQL CLR中的非托管DLL。CLR托管代码是内存安全的,SQLCLR旨在保护SQL Server不受自定义托管代码引起的任何问题的影响。但是,如果您使用非托管代码,您没有任何安全保证,并且您可能(很可能)会使SQL Server在执行此操作时崩溃

相反,从一个短期客户端进程加载非托管DLL,该进程独立于SQL Server进程,并且是短期的,这样当客户端进程终止时,第三方DLL的任何内存问题都可以得到清除。SSIS是托管和运行类似内容的简单方法

这是我试图做的事情的预期问题吗

我不会说“预期”甚于“不意外”,或者“不应该感到惊讶”。该第三方库在隔离时显然做得很好,但在从SQL Server的CLR主机内启动时却不可接受。SQL Server的CLR主机受到如此严格的限制是有充分理由的

这样,您应该做的是将这个第三方C++库和原始的(和工作的)C包装器作为运行在连接到的服务的服务器上的Web服务,“IHU”。然后,对于SQLCLR代码,使用

HttpWebRequest
HttpWebResponse
调用该web服务。在
SendResultsRow()
循环中解析响应XML/JSON


请确保将更新的SQLCLR代码的权限集设置为仅为
外部访问权限
,因为您不需要
不安全
:-),而且,您仍然可以在查询批处理中获得相当即时的响应,而无需通过
xp\u cmdshell
调用命令行,也无需调用SSI,甚至无需安排作业来执行此操作。

好建议。我会遇到同样的问题吗