当我尝试将tSQLt安装到现有数据库时,我收到以下错误:
记录在主数据库中的数据库所有者SID与记录在数据库''中的数据库所有者SID不同.您应该通过使用ALTER AUTHORIZATION语句重置数据库''的所有者来纠正这种情况.
我使用C#和Sql Server 2008,我的CLR存储过程中有一些try/catch块,这些都被捕获了.这些记录在文件中,并使用SqlPipe返回代码错误和消息.这些工作罚款.现在我需要做同样的事情,因为我有一些未解决的错误,特别是在日志文件中有一个跟踪!
我尝试使用Application.ThreadException,但此类在CLR存储过程(WinForms)中不可用.我是否必须在我的条目Sql Procedure方法中使用一个顽皮的try/catch块,还是有更好的事情要做?
谢谢.
我有一个庞大的C/C++函数库,需要从SQL Server 2008调用.我编写了一个C#适配器类,它从Win32 DLL加载这些函数DllImport并将它们公开给.Net代码.这在大多数.Net应用程序中运行得非常好.
现在,我试图使用与SQL Server CLR相同的技术.我创建了一组CLR函数和存储过程,它们调用适配器类.这不会尝试加载非托管DLL结果System.BadImageFormatException.
我可以使用扩展存储过程执行此操作,但该方法已弃用,可能会在任何新版本的SQL Server中停止使用.
从CLR存储过程调用非托管函数的正确方法是什么?我猜这应该在进程外完成.
我试图让我的存储过程调用一个公开这些函数的Web服务.这听起来是个好主意,但到目前为止,我遇到了部署SQLCLR程序集的问题,该程序集使Web服务调用.我无法加载System.ServiceModel.dll程序集version=3.0.0.0,它依赖于System.Web.dll程序集版本2.0.0.0.
加载System.Web程序集给我以下错误:
程序集"System.Web"引用程序集"system.web,version = 2.0.0.0,culture = neutral,publickeytoken = b03f5f7f11d50a3a.",它在当前数据库中不存在.SQL Server尝试从引用程序集来自的相同位置定位并自动加载引用的程序集,但该操作失败(原因:版本,区域性或公钥不匹配).请将引用的程序集加载到当前数据库中,然后重试您的请求.
我找到了部署System.Web程序集问题的解决方案.C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Web.dll它应该从中部署,而不是从中部署它C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll.然后也部署了所有其他所需的程序集.
部署顺序中的程序集列表:
在我们的构建服务器(Team City)上使用MSBuild构建CLR Storedprocedure项目时,我们收到以下错误:
错误MSB4019:找不到导入的项目"C:\ WINDOWS\Microsoft.NET\Framework\v2.0.50727\SqlServer.targets".确认声明中的路径是否正确,以及该文件是否存在于磁盘上
我已经检查过磁盘上是否存在该文件,确定它不存在.我已经检查了自己的机器,它确实存在.
我真的不想开始手动将文件复制到构建服务器.
这是从csproj文件导入到proj文件的行:
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildToolsPath)\SqlServer.targets" />
Run Code Online (Sandbox Code Playgroud)
这是我们的Team City Server运行的proj文件中的行:
<Import Project="..\$(ProjectName).csproj"/>
Run Code Online (Sandbox Code Playgroud)
我的问题是:
这个文件来自哪里?它是Visual Studio安装的一部分吗?或者是否有一些重新分发包允许我在我们的构建服务器上编译这个项目?
谢谢
顺便说一句..如果我只是将文件复制到Build服务器上它确实有效.
戴夫
我正在使用VS2010处理CLR存储过程.我需要生成独立的部署脚本,以便在客户服务器上安装此过程.现在我使用Visual Studio生成这样的脚本,当我按F5并尝试在DB服务器上调试SP.此脚本放在bin\Debug\MyStoredProcedure.sql文件中.它看起来像这样:
USE [$(DatabaseName)]
GO
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE id=OBJECT_ID('tempdb..#tmpErrors')) DROP TABLE #tmpErrors
GO
CREATE TABLE #tmpErrors (Error int)
GO
SET XACT_ABORT ON
GO
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
GO
BEGIN TRANSACTION
GO
PRINT N'Dropping [dbo].[spMyStoredProcedure]...';
GO
DROP PROCEDURE [dbo].[spMyStoredProcedure];
GO
IF @@ERROR <> 0
AND @@TRANCOUNT > 0
BEGIN
ROLLBACK;
END
IF @@TRANCOUNT = 0
BEGIN
INSERT INTO #tmpErrors (Error)
VALUES (1);
BEGIN TRANSACTION;
END
GO
PRINT N'Dropping [MyStoredProcedure]...';
GO
DROP ASSEMBLY [MyStoredProcedure]; …Run Code Online (Sandbox Code Playgroud) 如何调用具有日期输入的存储过程.
spName getDate()
Run Code Online (Sandbox Code Playgroud)
不起作用.
问题是关于在ms sql管理工作室内调用.
为了编写一些虚拟存储过程,我想知道我是否可以用C#编写它们,因为我不太了解T-SQL.
相同过程的C#和T-SQL版本是否与使用标准数据库库类调用代码(例如C++/C#/ Java代码)无法区分?
我实现了 CLR 存储过程的“HelloWorld”示例,它工作正常。
然后我更改了代码,重新编译并重新运行它,得到了旧的结果,而不是新的结果。
示例代码更改(所有其他代码都在上面的链接中):
前:
SqlContext.Pipe.Send("Hello world!\n");
Run Code Online (Sandbox Code Playgroud)
后:
SqlContext.Pipe.Send("Hello world new version!\n");
Run Code Online (Sandbox Code Playgroud)
除了回收 SQL 来加载新程序集之外,还有什么不足之处吗?
我有一个SQL Server数据库,它在几个ASP.NET(VB.NET)网站之间共享,数据库有一个存储客户查询的表 - 我希望提供电子邮件通知,通知新的查询以解决组织内部的人员(可能将一些查询数据放入电子邮件正文中).请问有人可以根据如何实施这些方案来概述我的选择吗?
我的想法是:
选项3似乎是可取的,因为我知道如何在VB.NET中这样做,这是微不足道的.
任何帮助非常欢迎!谢谢.
t-sql sql-server stored-procedures database-mail clrstoredprocedure